硬件部分(A2-A4和A5-A7芯片有所不同)
A2-A4
A5-A7
(考虑兼容性,推荐8-1端口依次使用P10-P17)
软件部分:
行列法
#include"reg52.h" typedef unsigned char u8; typedef unsigned int u16; #define SMG_A_DP_PORT P0//数码管对应端口定义 #define KEY_MATRIX_PORT P1//矩阵按键函数端口定义 //共阴数码管输入以下值分别会显示0-F u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //延时函数 void time_delay(u16 delay_time) { while(delay_time--); } //矩阵按键函数 u8 key_matrix_ranks_scan(void)//不需要形参 { u8 key_value=0;//定义接收返回值,使之可读性高 //赋值使之第一列矩阵按键为0,低电平 KEY_MATRIX_PORT=0xf7; if(KEY_MATRIX_PORT!=0xf7)//此时按键按下 { time_delay(1000);//消抖 switch(KEY_MATRIX_PORT)//为真就是!=0 { //只有四种情况,0x77,0xb7,0xd7,0xe7, //分别给固定输出结果 case 0x77:key_value=1;break; case 0xb7:key_value=5;break; case 0xd7:key_value=9;break; case 0xe7:key_value=13;break; } } while(KEY_MATRIX_PORT!=0xf7);//等待按键松开 //赋值使之第二列矩阵按键为0,低电平 KEY_MATRIX_PORT=0xfb; if(KEY_MATRIX_PORT!=0xfb)//此时按键按下 { time_delay(1000);//消抖 switch(KEY_MATRIX_PORT) { //只有四种情况,0x7b,0xbb,0xdb,0xeb, //分别给固定输出结果 case 0x7b:key_value=2;break; case 0xbb:key_value=6;break; case 0xdb:key_value=10;break; case 0xeb:key_value=14;break; } } while(KEY_MATRIX_PORT!=0xfb);//等待按键松开 //赋值使之第三列矩阵按键为0,低电平 KEY_MATRIX_PORT=0xfd; if(KEY_MATRIX_PORT!=0xfd)//此时按键按下 { time_delay(1000);//消抖 switch(KEY_MATRIX_PORT) { //只有四种情况,0x7d,0xbd,0xdd,0xed, //分别给固定输出结果 case 0x7d:key_value=3;break; case 0xbd:key_value=7;break; case 0xdd:key_value=11;break; case 0xed:key_value=15;break; } } while(KEY_MATRIX_PORT!=0xfd);//等待按键松开 //赋值使之第四列矩阵按键为0,低电平 KEY_MATRIX_PORT=0xfe; if(KEY_MATRIX_PORT!=0xfe)//此时按键按下 { time_delay(1000);//消抖 switch(KEY_MATRIX_PORT) { //只有四种情况,0x7e,0xbe,0xde,0xee, //分别给固定输出结果 case 0x7e:key_value=4;break; case 0xbe:key_value=8;break; case 0xde:key_value=12;break; case 0xee:key_value=16;break; } } while(KEY_MATRIX_PORT!=0xfe);//等待按键松开 return key_value; } void main() { u8 key=0; while(1) { key=key_matrix_ranks_scan(); if(key!=0) SMG_A_DP_PORT=gsmg_code[key-1]; } }
线翻转法:
#include"reg52.h" //对数据类型进行重定义 typedef unsigned char u8; typedef unsigned int u16; //宏定义数码管段码口 #define SMG_A_DP_PORT P0 //宏定义矩阵按键控制口 #define KEY_MATRIX_PORT P1 //共阴极数码管显示0~F的段码数据 u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //延时函数 void time_delay(u16 delay_time) { while(delay_time--); } u8 key_matrix_ranks_scan(void)//线翻转法 { static u8 key_value=0; KEY_MATRIX_PORT=0x0f;//给所有行赋值0,列赋值1 if(KEY_MATRIX_PORT!=0x0f)//判断按键是否按下 { time_delay(1000);//消抖 if(KEY_MATRIX_PORT!=0x0f) { //测试列 KEY_MATRIX_PORT=0x0f; switch(KEY_MATRIX_PORT)//保存行为0,按键按下后的列值 { case 0x07: key_value=1; break; case 0x0b: key_value=2; break; case 0x0d: key_value=3; break; case 0x0e: key_value=4; break; } //测试行 KEY_MATRIX_PORT=0xf0; switch(KEY_MATRIX_PORT)//保存行为0,按键按下后的列值 { case 0x70: key_value=key_value; break; case 0xb0: key_value=key_value+4; break; case 0xd0: key_value=key_value+8; break; case 0xe0: key_value=key_value+12; break; } while(KEY_MATRIX_PORT!=0xf0); } } else key_value=0; return key_value; } void main() { u8 key=0; while(1) { key=key_matrix_ranks_scan(); if(key!=0) SMG_A_DP_PORT=gsmg_code[key-1]; } }