矩阵按键行扫描法静动态数码管显示A-F

#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define SMG_A_DP P0//A_DP意思是从A到DP显示
#define KEY_MATRIX P1//MATRIX是矩阵的意思
u8 gsmg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴 0-F
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
u8 key_matrix_ranks_scan(void)//封装矩阵式按键行列式扫描的函数
{
u8 key_value=0;//通过变量存储键值,赋初值0
KEY_MATRIX=0xf7;//第一列为低电平
if(KEY_MATRIX!=0xf7)//第一列有按键按下
{
delay_10us(1000);//延时10ms消抖
switch(KEY_MATRIX)
{
case 0x77: key_value=1;break;//存储键值,第一列第1个按键s1按下,存储1
case 0xb7: key_value=5;break;//存储键值,第一列第2个按键s5按下,存储5
case 0xd7: key_value=9;break;
case 0xe7: key_value=13;break;
}
}
while(KEY_MATRIX!=0xf7);//等待按键松开
KEY_MATRIX=0xfb;//第二列为低电平
if(KEY_MATRIX!=0xfb)//第二列有按键按下
{
delay_10us(1000);
switch(KEY_MATRIX)
{
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!=0xfb);//等待按键松开
KEY_MATRIX=0xfd;//第三列为低电平
if(KEY_MATRIX!=0xfd)//第三列有按键按下
{
delay_10us(1000);
switch(KEY_MATRIX)
{
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!=0xfd);//等待按键松开
KEY_MATRIX=0xfe;//第四列为低电平
if(KEY_MATRIX!=0xfe)//第四列有按键按下
{
delay_10us(1000);
switch(KEY_MATRIX)
{
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!=0xfe);//等待按键松开
return key_value;//返回键值
}
void main()
{
u8 key=0;//定义变量保存键值
while(1)
{
key=key_matrix_ranks_scan();//调用函数
if(key!=0)//保证按键按下才进行显示
SMG_A_DP=~gsmg[key-1];//在数码管上显示,用端口发送段码数据
}
}