矩陣按鍵行掃描法靜動態(tài)數(shù)碼管顯示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)//封裝矩陣式按鍵行列式掃描的函數(shù)
{
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();//調(diào)用函數(shù)
if(key!=0)//保證按鍵按下才進(jìn)行顯示
SMG_A_DP=~gsmg[key-1];//在數(shù)碼管上顯示,用端口發(fā)送段碼數(shù)據(jù)
}
}