?? duijj.c~rf181e118.tmp
字號(hào):
#include "msp430x24x.h"
#include "Init.h"
#include "NOKIA_5110.H"
#include "scancodes.h"
#include "Modem.h"
#include "DS1302.h"
#include "ziku.h"
#define Key_Data P2IN&BIT0
#define Key_CLK P2IN&BIT1
#define SIDval P2IN&BIT0
#define uchar unsigned char
#define uint unsigned int
#define Buf_Dp 100
unsigned char IntNum = 0; //中斷次數(shù)計(jì)數(shù)
unsigned char KeyV; //鍵值
unsigned char DisNum = 0; //顯示用指針
unsigned char Key_UP=0, Shift = 0; //Key_UP是鍵松開標(biāo)識(shí),Shift是Shift鍵按下標(biāo)識(shí)
unsigned char BF = 0; //標(biāo)識(shí)是否有字符被收到
unsigned char pebit=0xff; //奇偶校驗(yàn)標(biāo)志位
unsigned char recdata=0; //接收到的數(shù)據(jù)
unsigned char bitcount=11; //位計(jì)數(shù)變量
unsigned char x=0,y=0;
unsigned char count=0;
char UART_TX_BUF[Buf_Dp];
char UART_RX_BUF[Buf_Dp];
char Tshow_Puf[100];
char Rshow_Puf[100];
unsigned char RX1_Len_temp;
static unsigned char nRX_Len;
static unsigned char nTX_Len;
static char nRX_Flag;
static char nTX_Flag;
static char Write_Flag=0;
static char Rece_Flag=0;
char signal;
char RX_Flag;
const char TAB_f_Week[][4]={{' ','S','u','n'},
{' ','M','o','n'},
{' ','T','u','e'},
{' ','W','e','d'},
{' ','T','h','u'},
{' ','F','R','i'},
{' ','S','a','t'}
};
char NYR[11]={'2','0','0','8','-','1','1','-','1','8','\0'};
char Xinq[5];
unsigned char SF[5] ={0,2,10,4,4};
unsigned char Setting_Time[7]={ //bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
0x08, //--------十位-------|-------個(gè)位--------|年份(當(dāng)前07年)
0x06, // |-----個(gè)位-----|星期(當(dāng)前周日)
0x11, // |十位|-------個(gè)位--------|月份(當(dāng)前07月)
0x28, // |--十位---|-------個(gè)位--------|日期(當(dāng)前01號(hào))
0x11, //-12H| |--十位---|-------個(gè)位--------|小時(shí)(當(dāng)前18點(diǎn))
0x25, // |-----十位-----|-------個(gè)位--------|分鐘(當(dāng)前20分)
0x00 // |-----十位-----|-------個(gè)位--------|秒鐘(當(dāng)前30秒)
};
unsigned char ReadingData[7]; //讀出來(lái)的數(shù)據(jù),同SettingData定義與格式
char A_PM,O_Tm;
char test;
//char test[]="cuit";
void Get_time(unsigned char *ReadingData);
void Tlotal_m(char k);
void delay(int n)
{ unsigned int i;
for(;n>0;n--)
for(i=0;i<1000;i++);
}
void Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說(shuō)shift的通碼+G的通碼+shift的斷碼+G的斷碼
{
unsigned char TempCyc;
if (!Key_UP) //當(dāng)鍵盤松開時(shí)
{
if(count==0) {DisNum=0;x=0;y=1; NOKIA5110_set_XY(6*x,y);}
switch (ScanCode)
{
case 0xF0 : // 當(dāng)收到0xF0,Key_UP置1表示斷碼開始
Key_UP = 1;
break;
case 0x12 : // 左 SHIFT
Shift = 1;
break;
case 0x59 : // 右 SHIFT
Shift = 1;
break;
case 0x76 ://退出
Write_Flag=0;
Rece_Flag =0;
break;
case 0x66: //back space
if((x == 0) && (y != 1))//如果游標(biāo)在第2行第1位
{
x = 13;y --; }
else if(x != 0)
{ x--; }
else //如果游標(biāo)在第1行第1位
{;} //0x20是空格的ASCII碼
NOKIA5110_set_XY(6*x,y);
if(count!=0) {count--;DisNum--;}
Tshow_Puf[count]='\0';
NOKIA5110_w_char(32);
NOKIA5110_set_XY(6*x,y);
break;
case 0x5a:
Tshow_Puf[count++]=' ';
x=0;y=1;
NOKIA5110_set_XY(x,y);
nTX_Flag=1;
break;
default:
if (DisNum >= 84)
break;
if(!Shift) //如果SHIFT沒按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
if (UnShifted[TempCyc][0] == ScanCode) NOKIA5110_w_char( UnShifted[TempCyc][1]);
Tshow_Puf[count++]=UnShifted[TempCyc][1];
DisNum++;
x++;
if(x>13)
{ x=0;y++;
if(y>5){x=0;y=1;}
}
NOKIA5110_set_XY(6*x,y);
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
if (Shifted[TempCyc][0] == ScanCode) NOKIA5110_w_char( Shifted[TempCyc][1]);
Tshow_Puf[count++]=Shifted[TempCyc][1];
DisNum++;
x++;
if(x>13)
{ x=0;y++;
if(y>5){ x=0;y=1;}
}
NOKIA5110_set_XY(6*x,y);
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //當(dāng)鍵松開時(shí)不處理判碼,如G 34H F0H 34H 那么第二個(gè)34H不會(huì)被處理
{
case 0x12 : // 左 SHIFT
Shift = 0;break;
case 0x59 : // 右 SHIFT
Shift = 0;break;
}
}
BF = 0; //標(biāo)識(shí)字符處理完了
KeyV=0;
}
void main( )
{ char i,j=0;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
// P6DIR |=BIT6+BIT7;
// P6OUT |=BIT6+BIT7;
P5DIR =0XFF;
P5OUT =0XFF;
P3DIR |=BIT4+BIT5;
P4DIR =0xff;
P4OUT =0xff;
P2SEL = 0x00;
P2DIR &=~ BIT1; //Clock接P1.7,設(shè)置為輸入
P2DIR &=~ BIT0; //SID接P4.6,設(shè)置為輸入
P2IES |= BIT1;
P1SEL = 0x00; //P1口作為IO使用
P1DIR &=~ (BIT3+BIT2);
P1IES |= BIT2+BIT3; //下降沿中斷
P1IFG = 0x00; //中斷標(biāo)志清零
P2IFG = 0x00;
P1IE |= BIT2+BIT3; //使能時(shí)鐘端口中斷
nRX_Len=0;
nTX_Len=0;
nRX_Flag=0;
nTX_Flag=0;
RX_Flag=0;
initSys();
NOKIA5110_init();
NOKIA5110_draw_bmp(0,0,Start_p,82,47);
Uart_init();
Timerb_init();
DS1302_Reset();
//DS1302_SettingData(Setting_Time);
Set_mb1504_1(3700);
Set_mb1504_2(4800);
ADC12_init();
_EINT(); //打開全局中斷控制
P3OUT |= 0x30;
Rx_Mode();
//test=0xff;
while(1)
{
/* P3OUT |= 0x30;
Tx_Mode();
delay(1000);
usart_putchar(test);*/
if((Write_Flag!=0)|(Rece_Flag!=0))
{
TBCCTL0=0x00;
NOKIA5110_clear();
x=0;y=0;
NOKIA5110_set_XY(6*x,y);
NOKIA5110_w_char_string(0,0,"=chat=");
if(Write_Flag!=0) NOKIA5110_w_char_string(42,0,"write: ");
else if(Rece_Flag!=0 ) NOKIA5110_w_char_string(42,0,"Read: ");
count=0;
P2IE |= BIT1;
while(1)
{
if(nTX_Flag==1)
{
P3OUT |= 0x30;
Tx_Mode();
delay(1000);
nTX_Len=PackData(UART_TX_BUF,Tshow_Puf,count);
String_printf(UART_TX_BUF);
for(i=0;i<=nTX_Len;i++)
{ Tshow_Puf[i]='\0';
UART_TX_BUF[i]='\0';}
nTX_Flag=0;
//DisNum=0;
count=0;
delay(10);
P3OUT |= 0x30;
Rx_Mode();
j=0x01;}
if(j==0x01){j=0x00; break;}
if ( nRX_Flag==1 )
{
NOKIA5110_clear();
count=0;
NOKIA5110_w_char_string(0,0,"=chat=");
NOKIA5110_w_char_string(42,0,"Read: ");
NOKIA5110_w_char_string(0,1,UART_RX_BUF);
for(i=Buf_Dp-1;i!=0;i--)
{ UART_RX_BUF[i]='\0'; }
RX1_Len_temp=0;
nRX_Flag=0;
Write_Flag=1;
}
if( Rece_Flag==1&count!=0)
{Rece_Flag=0;count=0;
NOKIA5110_clear();
NOKIA5110_w_char_string(0,0,"=chat=");
if(Write_Flag!=0)
NOKIA5110_w_char_string(42,0,"write: ");}
if((Write_Flag==0)&(Rece_Flag==0))
{ NOKIA5110_clear();
x=0;y=0; break;
}
}
TBCCTL0=CCIE;
}
else { P2IE &=~BIT1;}
}
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
if(P2IFG & BIT1) //如果是clock的中斷
{
P2IFG &=~ BIT1; //清除中斷標(biāo)志
if(bitcount == 11) //接收第1位
{
if(SIDval) //如果不是起始位
return;
else
bitcount--;
}
else if(bitcount == 2) //接收奇偶校驗(yàn)位
{
if(SIDval) //如果校驗(yàn)位等于1
pebit = 1;
else
pebit = 0;
bitcount--;
}
else if(bitcount == 1) //接收停止位
{
if(SIDval) //若停止位正確
{
bitcount = 11; //復(fù)位位計(jì)數(shù)變量
IntNum = 0; //當(dāng)中斷11次后表示一幀數(shù)據(jù)收完,清變量準(zhǔn)備下一次接收
BF = 1; //標(biāo)識(shí)有字符輸入完了
_DINT(); //關(guān)中斷等顯示完后再開中斷 (注:如這里不用BF和關(guān)中斷直接調(diào)Decode()則所Decode中所調(diào)用的所有函數(shù)要聲明為再入函數(shù))
Decode(recdata) ; //解碼獲得此鍵值的ASCII值并保存
// LPM3_EXIT; //退出低功耗模式
recdata = 0; //清除接收數(shù)據(jù)
_EINT () ; //開中斷
}
else //如果出錯(cuò)
{
bitcount = 11;
recdata = 0;
}
}
else //接收8個(gè)數(shù)據(jù)位
{
recdata >>= 1;
if(SIDval) recdata |= 0x80;
bitcount--;
}
}
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if(P1IFG & BIT3)
{ delay(100); //去抖
P1IFG &=~ BIT3;
Write_Flag=0x01;
}
if(P1IFG & BIT2)
{ delay(100); //去抖
P1IFG &=~ BIT2;
Write_Flag=0x00;
Rece_Flag=0;
nRX_Flag=0x00;
}
}
#pragma vector=USCIAB1RX_VECTOR
__interrupt void USCI1RX_ISR(void)
{ char Resv=0;
_DINT();
if(RX_Flag==1) //接收標(biāo)志位是否為一,是將數(shù)據(jù)載入緩存
{
UART_RX_BUF[RX1_Len_temp] = UCA1RXBUF;
if( RX1_Len_temp<100) RX1_Len_temp++;
else RX1_Len_temp=0;
if(UART_RX_BUF[RX1_Len_temp-1]=='%') //收到結(jié)束標(biāo)志,接收完成。
{
UART_RX_BUF[RX1_Len_temp-1]=32;
UART_RX_BUF[RX1_Len_temp]='*';
UART_RX_BUF[RX1_Len_temp+1]='*';
UART_RX_BUF[RX1_Len_temp+2]='E';
UART_RX_BUF[RX1_Len_temp+3]='N';
UART_RX_BUF[RX1_Len_temp+4]='D';
UART_RX_BUF[RX1_Len_temp+5]='*';
UART_RX_BUF[RX1_Len_temp+6]='*';
RX_Flag =0; //清除接收標(biāo)志
nRX_Flag =1; //接收完成標(biāo)志
Rece_Flag=1;
}
}
else //等待引導(dǎo)碼
{ Resv = UCA1RXBUF;
if(Resv =='!')
RX_Flag=1;
Resv = 0;
}
_EINT();
}
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0(void)
{ int results[2];
ADC12CTL0 &= ~ENC;
results[0] =ADC12MEM0;
results[1] =ADC12MEM1;
if(results[0]>=2500){signal=3;}
else if((results[0]<2500)&(results[0]>1000)){signal=2;}
else {signal=0;}
Tlotal_m(signal);
ADC12CTL0 |= ENC+ADC12SC;
}
void Get_time(unsigned char *ReadingData)
{
char i,k;
DS1302_GetData(ReadingData);
NYR[2]=(char)(((ReadingData[0]>>4)&0x0f)+48);//年
NYR[3]=(char)((ReadingData[0]&0x0f)+48);
NYR[5]=(char)(((ReadingData[2]>>4)&0x0f)+48);//月
NYR[6]=(char)((ReadingData[2]&0x0f)+48);
NYR[8]=(char)(((ReadingData[3]>>4)&0x0f)+48);//日
NYR[9]=(char)((ReadingData[3]&0x0f)+48);
switch(ReadingData[1])
{
case 0x01:{k=0;break;}
case 0x02:{k=1;break;}
case 0x03:{k=2;break;}
case 0x04:{k=3;break;}
case 0x05:{k=4;break;}
case 0x06:{k=5;break;}
case 0x07:{k=6;break;}
default: break;
}
for(i=0;i<4;i++)
{ Xinq[i]=TAB_f_Week[k][i];}
O_Tm =(char)((ReadingData[4]>>4)&0x08);
A_PM =(char)((ReadingData[4]>>4)&0x02);//時(shí)
if(O_Tm==0x08)
{SF[0]=(char)((ReadingData[4]>>4)&0x01);}//時(shí)
else
{SF[0]=(char)((ReadingData[4]>>4)&0x03); }
SF[1]=(char)(ReadingData[4]&0x0f);
SF[3]=(char)((ReadingData[5]>>4)&0x0f);//分
SF[4]=(char)(ReadingData[5]&0x0f);
}
void Tlotal_m(char k)
{ char i;
NOKIA5110_clear();
NOKIA5110_draw_bmp(0,0,TX,8,8);
for(i=0;i<=k;i++)
NOKIA5110_w_Symbol(i);
Get_time(ReadingData);
NOKIA5110_w_char_string(0,1,"SSB interphone");
for(i=0;i<5;i++)
{ Write_shuzi((i+2)*8,2,b[SF[i]]);}
if(O_Tm==0x08)
{ if(A_PM==0x02) Write_hanzi(64,2,PM);
else Write_hanzi(64,2,AM);}
NOKIA5110_w_char_string(0,4,NYR);
NOKIA5110_w_char_string(10*6,4,Xinq);
NOKIA5110_w_char_string(0,5,"Message");
NOKIA5110_w_char_string(10*6,5,"Back");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -