|
#include<reg51.h>
#define key P0//定义按键端口
#define uchar unsigned char
sbit line0=P0^0;//定义行线
sbit line1=P0^1;
sbit line2=P0^2;
char led[]={0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定义led显示字行码
char scancode2[]={0xef,0xdf};
bit iskey()//判断是否有按键闭合
{
key=0x07;//低三位为1,高三位为0
if((key&0x07)==0x07)//屏蔽高三位(列线),只检测低三位(行线)
return 0;//没有按键闭合
else
return 1;//有按键闭合
}
uchar key_identify()//识别建号
{
uchar linecode=0,i,rowcode=0,scancode=0xf7;//初始化扫描码,第一列为0,其他为1
for(i=0;i<3;i++)//扫描三列
{
key=scancode;//输出扫描码,扫描各列
if((key&0x07)==0x07)//屏蔽高三位(列线),只检测低三位(行线)
{
rowcode++;//无按键闭合
scancode=scancode2[rowcode-1];//输出0的列线每次左移一位
}
else//已确定列号,再确定行号
{
if(line0==0)linecode=0;
if(line1==0)linecode=3;
if(line2==0)linecode=6;
break;
}
}
return (linecode+rowcode);//输出键号
}
void wait_key_release()//等按键松开
{
while(1)
{
key=0x07;//低三位为1,高三位为0
if((key&0x07)==0x07)break;//读行线状态,如果为高电平,则没有按键闭合,键盘松开
}
}
void display(uchar n)//led显示数字
{
P1=led[n];
P0=0xff;
}
int main(void)
{
uchar keycode;//保存键号
unsigned int i;
while(1)
{
while(!iskey());//如果没有按键按下,等待
for(i=0;i<500;i++);//消抖
if(iskey())//检测是否有按键
{
keycode=key_identify();//识别键号
wait_key_release();//等待按键松开
display(keycode);//显示
}
}
}
仿真时P0.0 P0.1 P0.2电平是灰的 按键没反应 详情见附件 |
|