#include #include #define RL(x) _crol_(x,1); // 重新定義 RL左旋函式 unsigned char code font[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~9,a~f之7段顯示器顯示字型內容 void delay(unsigned int t); unsigned char key(unsigned char y); unsigned char i,scan,kb_buf,x,tmp; unsigned char led_buffer[8]; void main(void) { for(i=0;i<8;i++) led_buffer[i] = 0; //將第0至7位數內容預設值皆為0, 7段顯示器全暗 TMOD = 0x01; //設定Timer0工作於模式1 TH0 = (65536-2000) / 256; //給予初值, 2ms中斷一次 TL0 = (65536-2000) % 256; TR0 = 1; //啟動計時器 IE = 0x82; //啟動Timer0中斷 scan = 0; while(1) { kb_buf = 0xfe; for (x=0;x<4;x++) { P0 = kb_buf; tmp = P0; while((tmp & 0xf0) != 0xf0) //將P0.3~P0.0清為0, 判斷P0.7~P0.4是否皆為1,如果不是,代表有按鍵被壓下 { delay(3); //延遲, 判斷是否為彈跳訊號 tmp = P0; if ((tmp & 0xf0) != 0xf0) //如果P0.7~P0.4仍然有0的情況, 則表示非彈跳訊號 { led_buffer[0] = led_buffer[1]; //7段顯示器資料向左移動 led_buffer[1] = led_buffer[2]; led_buffer[2] = led_buffer[3]; led_buffer[3] = led_buffer[4]; led_buffer[4] = led_buffer[5]; led_buffer[5] = led_buffer[6]; led_buffer[6] = led_buffer[7]; led_buffer[7] = font[key(tmp)]; //將按鍵值送到最右邊7段顯示器顯示 } do { tmp = P0; //讀回按鍵值 }while((tmp & 0xf0) != 0xf0); //直到P0.7~P0.4皆為1為止(代表按鍵已放開) } kb_buf = RL(kb_buf); } } } void scan_7seg() interrupt 1 //Timer0中斷程式(中斷向量1) { TH0 = (65536-2000) / 256; //重設一次初值 TL0 = (65536-2000) % 256; P1 = 0xf8 + scan; //控制第n位數導通,並將P1.7~P1.4設為1 P2 = led_buffer[scan++]; //送出第n位數要顯示之字型資料, 並將位置加1,只到下一個位數 if(scan==8) //判斷是否到第8位數,如果是則歸0 scan=0; } unsigned char key(unsigned char y) //將按鍵轉成對應鍵值副程式 { unsigned char key_data; switch(y) { case 0xee: key_data = 0; break; case 0xed: key_data = 1; break; case 0xeb: key_data = 2; break; case 0xe7: key_data = 3; break; case 0xde: key_data = 4; break; case 0xdd: key_data = 5; break; case 0xdb: key_data = 6; break; case 0xd7: key_data = 7; break; case 0xbe: key_data = 8; break; case 0xbd: key_data = 9; break; case 0xbb: key_data = 10; break; case 0xb7: key_data = 11; break; case 0x7e: key_data = 12; break; case 0x7d: key_data = 13; break; case 0x7b: key_data = 14; break; case 0x77: key_data = 15; break; } return key_data; //傳回按鍵實際對應值 } void delay(unsigned int t) { unsigned int i; while(t--) { i=10000; while(i--); } }