#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显示键值 } } |