#include #include sbit LCD_RS=P1^0;//定義接腳 sbit LCD_RW=P1^1; sbit LCD_E=P1^2; #define LCD_Data P2 #define KB P0 #define RL(x) _crol_(x,1); // 重新定義 RL左旋函式 void key(char y); void WriteDataLCD(char WDLCD); void WriteCommandLCD(char WCLCD); void LCDInit(void); void delay_us(unsigned int t); void delay(int t); void main(void) { unsigned char kb_buf,x,tmp; LCDInit(); //LCM初始化 while(1) { kb_buf = 0xfe; for (x=0;x<4;x++) { KB = kb_buf; tmp = KB; while((tmp & 0xf0) != 0xf0) //將P0.3~P0.0清為0, 判斷P0.7~P0.4是否皆為1,如果不是,代表有按鍵被壓下 { delay(3); //延遲, 判斷是否為彈跳訊號 tmp = KB; if ((tmp & 0xf0) != 0xf0) //如果P0.7~P0.4仍然有0的情況, 則表示非彈跳訊號 key(KB); //呼叫按鍵副程式, 將按鍵值送到LCD顯示 do{ tmp = KB; //讀回按鍵值 }while((tmp & 0xf0) != 0xf0); //直到P0.7~P0.4皆為1為止(代表按鍵已放開) } kb_buf = RL(kb_buf); //掃描資料左旋, 準備掃描下一行 } } } void key(char y) //依照按鍵顯示對應鍵值副程式 { switch(y) { case 0xee: WriteDataLCD('0'); break; case 0xed: WriteDataLCD('1'); break; case 0xeb: WriteDataLCD('2'); break; case 0xe7: WriteDataLCD('3'); break; case 0xde: WriteDataLCD('4'); break; case 0xdd: WriteDataLCD('5'); break; case 0xdb: WriteDataLCD('6'); break; case 0xd7: WriteDataLCD('7'); break; case 0xbe: WriteDataLCD('8'); break; case 0xbd: WriteDataLCD('9'); break; case 0xbb: WriteDataLCD('A'); break; case 0xb7: WriteDataLCD('B'); break; case 0x7e: WriteDataLCD('C'); break; case 0x7d: WriteDataLCD('D'); break; case 0x7b: WriteDataLCD('E'); break; case 0x77: WriteDataLCD('F'); break; } } void delay(int t) // 延遲函數開始 { int i,j; // 宣告整數變數i,j for (i=0;i