#include<regx52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define smg_a_dp_port P0
#define key_matrix_port P1
u8 gsmg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,
0x71};//共阴极数码管显示0-F
void delay() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
u8 key_matrix_ranks_scan(void)
{
u8 key_value=0;
key_matrix_port=0x0f;//判断列,先给行赋低电平,给列赋高电平
if(key_matrix_port!=0x0f)//判断按键是否按下
{
delay();
if(key_matrix_port!=0x0f);//再次判断按键是否按下。
{
key_matrix_port=0x0f;
switch(key_matrix_port)
{
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)
{
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);//按键松开
}
}
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];
}
}