- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define delayNOPX(){_nop_();_nop_();_nop_();_nop_();}
- sbit BEEP =P1^0;
- sbit LCD_RS =P2^0;
- sbit LCD_RW =P2^1;
- sbit LCD_EN =P2^2;
- void DelayMS(uint ms);
- bit LCD_Busy();
- void LCD_Pos(uchar);
- void LCD_Wcmd(uchar);
- void lcd_Wdat(uchar);
- //標題字符串
- char code Title_Text[]={"-phone code-"}
- //鍵盤序號與鍵盤符號映射表
- uchar code Key_Table[]={'1','2','3','4','5','6','7','8','9','0','#'};
- //鍵盤撥號數字緩沖
- uchar Dial_Code_Str[]={""};uchar KeyNo=0Xff;int tCount =0;
- //延時
- void DelayMS(uint x)
- {
- uchar i;
- while(x--)
- for(i=0;i<120;i++);
- }
- //在LCD指定的行上顯示字符串
- Void display_string(uchar*str,uchar klineNo)
- {
- uchar k;
- LCD_pos(lineNo);
- for (k=0;k<16;k++)
- LCD_wdat(str[k]);
- }
- //1602LCD顯示控制函數bit
- LCD_busy()void LCD_wcmd(uchar cmd)void
- LCD_wdat(uchar str)void LCD_init()void
- LCD_pos(uchar pos)
- //T0控制按鍵聲音
- Void T0_INT() interrupt 1
- {
- TH0 = -600/256;
- TL0 = -600%256;
- BEEP =~BEEP;
- If (++tcount == 200)
- {
- Tcount 0;tr0 =0;
- }
- }
- //鍵盤掃描
- Uchar getkey()
- {
- Uchar i,j,k = 0;
- Uchar keyscancode[]={0xef,0xdf,0xbf,0x7f};//鍵盤掃描碼
- Uchar keyscancode[]={0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb,0x7e,0x7d,0x7b};//鍵盤特征碼
- P3= 0x0f;
- //掃描鍵盤獲取按鍵序號
- If(p3!=0x0f)
- {
- For (i=0;i<4;i++)
- {
- p3 =keyscancode[i];
- For (j=0;j<3;j++)
- {
- k =i*3+j;
- If (p3==keycodetable[k])
- return k;
- }
- }
- }
- else return oxff;
- }
- //主程序
- Void main()
- {
- Uchar i =0,j;
- p0 = p2 = p1 =0xff;
- IE =0x82;TOMD =0x01;
- LCD_init();//初始化LCD
- Display_string(title_text,0x00);//在第一行顯示標題
- While(1)
- {
- KeyNo =getkey();//獲取按鍵
- If(keyNo ==0xff) cont inue;//無按鍵時繼續掃描
- If(++i ==11)//超過11位時清空
- {
- for(j=0;j<16;j++) dial_code_str[j]=' ';i=0;
- }
- Dial_code_str[i]=key_table[keyNo];//講待顯示字符放入待顯示的撥號串中
- Display_string(dial_code_str,0x40);//在第二行顯示號碼
- Tr0 =1;//T0中斷控制按鍵聲音
- While(getkey()!=0xff);//等待釋放
- }
- }
復制代碼 |