课程设计:矩阵键盘扫描显示(c51反转法)
2016-09-13 来源:eefocus
//矩阵键盘扫描程序
//采用翻转识别法(相对代码少一些)
#include
#define uchar unsigned char
#define uint unsigned int
uchar key=0;
//共阳数码管编码如下(0-15)
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
//函数声明
void display(uchar Duan_value);
void delay(uchar t);
void key_scan();
void main()
{
while(1)
{
display(key);//显示按键值
key_scan(); //按键扫描
}
}
//延时函数
void delay(uchar t)
{
uchar x,y;
for(x=t;t>0;t--)
for(y=111;y>0;y--);
}
//数码管扫描函数
void display(uchar value)
{
P2=table[value];
}
//按键扫描函数
void key_scan()
{
uchar m0,m1;
uchar temp;
P1=0xf0;//这样设置是为了能使低四位将高四位拉低,释放时自动拉高高四位
temp=P1;
if(temp!=0xf0)
{
delay(10); //延时,去除抖动
if(temp!=0xf0)
{
m0=temp; //获得按键的列号
P1=0x0f;
temp=P1;
if(temp!=0x0f)
{
m1=temp; //获得按键的行号号
temp=m0|m1; //获得最终的号
}
switch(temp)
{
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break;
case 0x7e:key=3;break;
case 0xed:key=4;break;
case 0xdd:key=5;break;
case 0xbd:key=6;break;
case 0x7d:key=7;break;
case 0xeb:key=8;break;
case 0xdb:key=9;break;
case 0xbb:key=10;break;
case 0x7b:key=11;break;
case 0xe7:key=12;break;
case 0xd7:key=13;break;
case 0xb7:key=14;break;
case 0x77:key=15;break;
}
do{
temp=P1; //消除按起抖动
temp&=0X0f;
}while(temp!=0x0f);
}
}
}
上一篇:课程设计:按键计数器(汇编)