//由于开发板中使用了锁存器,在proteus中仿真的话,加上锁存器的话,会出现乱码,并且//不成功,所以,就不贴图了,不过以下代码,在事物板上测试成功
//实验代码为实现按键扫描,并显示在数码管上
//实验班上共有4个按键,分别接在p3.4,p3,5,p3.6.p3.7上,因此并没有用到矩阵键盘扫描,//控制起来比较简单,6数码管观通过锁存器接在P0口上。
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6; //数码管段选控制位
sbit wela=P2^7; //数码管位选控制位
uchar key=8;
//共阴数码管段码(不叫特殊的编码)
uchar code table[]=
{
0xed, 0x48, 0xf4, 0xb5, 0x99,
0x3d, 0x7d, 0x85, 0xfd, 0xbd,
0xdd, 0x79, 0x6c, 0xf1, 0x7c,
0x5c, 0x10, 0x00,
};
//位选编码
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//函数声明
void display(uchar Duan_value,uchar Wei_value); //数码管扫描函数
void delay(uchar t); //延时函数
void key_scan(); //按键扫描函数
void delay(uchar t)
{
uchar x,y;
for(x=t;t>0;t--)
for(y=111;y>0;y--);
}
//显示对应位选的数码管按键值
void display(uchar Duan_value,uchar Wei_value)
{
dula=1;
P0=table[Duan_value];
dula=0;
wela=1;
P0=table1[Wei_value];
wela=0;
delay(3);
}
void key_scan()
{
uchar temp;
P3=0xff; //P3口写1,用于读取数据
temp=P3&0xf0; //只取高四位
if(temp!=0xf0)
{
delay(10); //延时,去除抖动
temp=P3&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:key=0;break;
case 0xd0:key=1;break;
case 0xb0:key=2;break;
case 0x70:key=3;break;
default:
key=8;break;
}
do{ //消除按起抖动
temp=P3;
temp&=0Xf0;
}while(temp!=0xf0);
}
}
}
void main()
{
while(1)
{
display(key,5); //用开发板上最后一位显示按键值
key_scan();
}
}
上一篇:课程设计:矩阵键盘扫描显示(c51反转法)
下一篇:keil 中文乱码的一种解决办法
推荐阅读最新更新时间:2024-03-16 15:09