矩阵键盘和数码管设计 -定时计数器
一、实验目的
1.掌握数码管动态显示的工作原理
2.掌握矩阵键盘的设计
3.学习数码管和矩阵键盘的软硬件设计。
二、实验内容
1.在Proteus中设计硬件电路,该电路由2个LED数码管和16个矩阵键盘组成
2.编写键盘扫描程序和显示程序。实现功能如下:按下某按键时,数码管上显示该键对应的键值0~15。
如果连续第二次按下该键,则数码管显示的数值为该键值加3在Proteus中加载程序代码并运行仿真。
三、电路图
四、总结
问题讨论
几个数码管是绝对同时显示吗,实际是怎么显示的?
答:不是绝对同时显示的,其显示的本质是快速循环,类似于时间片轮转算法,实际上是逐个显示的,
只是轮转的时间比较快,人眼不易发现,因此达到一种让人感觉是同时显示的效果。
动态显示的目的是显示较多的数据位数,因此逐个排队进行显示。
问题和建议
可以增加去抖动延时的时长,以减小误差。
五、代码
代码:
#include<reg52.h>
unsigned char code display[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int i;
unsigned char buf[2],m=0xff,n=-1;
void delay(unsigned int x)
{
unsigned int i;
for(i=x;i>0;i--);
}
void dis(unsigned int temp)
{
buf[0]=temp%100/10;
buf[1]=temp%10;
if(temp==0xff)
P0 = 0xff;
else
{
for(i = 0;i < 2;i++)
{
P0 = display[buf[i]];
P1 =(0x01<<i);
delay(100);
P0 = 0xff;
}
}
}
unsigned char keys_scan()
{
unsigned char row,col=0;
P2 = 0xf0;
if((P2&0xf0)==0xf0)
{
return m;
}
delay(20);
if((P2&0xf0)==0xf0)
{
return m;
}
for(row=0;row<4;row++)
{
P2 = ~(1<<row);
m=P2&0xf0;
if(m!=0xf0)
{
while(m&(1<<(col+4)))
col++;
if(n==row*4+col)
m=row*4+col+3;
else
n=m=row*4+col;
P2=0xf0;
while((P2&0xf0)!=0xf0);
break;
}
}
return m;
}
void main()
{
P2 = 0;
P1 = 0;
while(1)
{
dis(keys_scan());
}
}
|