#include <REGX52.H> typedef unsigned char u8; typedef unsigned int u16; #define SMG_PORT P0 //P0口接數碼管 #define KEY_MATRIX_PORT P1 //P1口接矩陣按鍵 u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0~9 a~f 全滅 共陰數碼管 void delay_10us(u16 ten_us) { while(ten_us--); } u8 key_matrix(void) //按鍵函數 高四位接行線,低四位接列線 { u8 key_is=0; //鍵值變量 KEY_MATRIX_PORT =0xf7; //按鍵賦值 1111 0111 if(KEY_MATRIX_PORT!=0xf7) //有鍵按下 { delay_10us(100); //延時 switch(KEY_MATRIX_PORT ) //匹配鍵值 { case 0x77:key_is=1;break; //0111 0111 鍵值1 case 0xb7:key_is=5;break; //1011 0111 鍵值5 case 0xd7:key_is=9;break; //1101 0111 鍵值9 case 0xe7:key_is=13;break; //1110 0111 鍵值13 } while(KEY_MATRIX_PORT!=0xf7); //等待松手 return key_is; //返回鍵值 } KEY_MATRIX_PORT =0xfb; //按鍵賦值 1111 1011 if(KEY_MATRIX_PORT!=0xfb) //有鍵按下 不等于1111 1011 { delay_10us(100); //延時 switch(KEY_MATRIX_PORT) //匹配 { case 0x7b:key_is=2;break; //0111 1011 鍵值2 case 0xbb:key_is=6;break; //1011 1011 鍵值6 case 0xdb:key_is=10;break; //1101 1011 鍵值10 case 0xeb:key_is=14;break; //1110 1011 鍵值14 } while(KEY_MATRIX_PORT!=0xfb); //等待松手 return key_is; //返回鍵值 } KEY_MATRIX_PORT =0xfd; //按鍵賦值 1111 1101 if(KEY_MATRIX_PORT!=0xfd) //有鍵按下 { delay_10us(100); //延時 switch(KEY_MATRIX_PORT) //匹配 { case 0x7d:key_is=3;break; //0111 1101 鍵值3 case 0xbd:key_is=7;break; //1011 1101 鍵值7 case 0xdd:key_is=11;break; //1101 1101 鍵值11 case 0xed:key_is=15;break; //1110 1101 鍵值15 } while(KEY_MATRIX_PORT!=0xfd); //等待松手 return key_is; //返回鍵值 } KEY_MATRIX_PORT =0xfe; //按鍵賦值 1111 1110 if(KEY_MATRIX_PORT !=0xfe) //有鍵按下 不等于1111 1110 { delay_10us(100); //延時 switch(KEY_MATRIX_PORT ) //匹配 { case 0x7e:key_is=4;break; //0111 1110 鍵值4 case 0xbe:key_is=8;break; //1011 1110 鍵值8 case 0xde:key_is=12;break; //1101 1110 鍵值12 case 0xee:key_is=16;break; //1110 1110 鍵值16 } while(KEY_MATRIX_PORT!=0xfe); //等待松手 return key_is; //返回鍵值 } } void main() //主函數 { u8 key=0; //定義鍵值變量 SMG_PORT=gsmg_code[16]; //熄滅數碼管 while(1) { key=key_matrix(); //讀取按鍵值 SMG_PORT=gsmg_code[key-1]; //P0顯示鍵值 } } |