这个单片机实验要求是我的同学把别人的设计要求发给我,让我帮忙做一下,但是做着做着发现自己设计的方案行不通,到现在原因也不知道在哪,只能是又想了一种方案。
方案是在按下键盘时,将按下的键值所对应的共阳值写入对应的数组中,在显示时在P0口(数码管段选口)写入刚存储完成的数组,该数组在未按下时所有数值均为 0xff (不显示)。
和最一开始的方案是相似的,但是我至今也没想明白最一开始的方案异常的原因在哪,也没有搜到类似的资源,于是就想着来CSDN随便水一篇。
Proteus仿真图和C代码文件可以参考我的另一篇资源,下载的话我应该设置的是0
51单片机数码管显示历史键值
1、利用键盘作为输入信号控制系统的输出信息
2、熟悉键盘的构造并编写相应的扫描的程序
利用Proteus搭建仿真电路图,并完成如下键盘程序:
1、四个数码管上分别显示最近连续四次按键的值。例如连续四次按下3456,则显示3456,再按下9,则显示4569
2、在1的基础上按下“F”键(第四行第四列),则所有数码管清屏(即所有数码管不显示),按下“E”键,显示“----”
行列扫描:通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
Keil开发环境,Proteus仿真环境
注意事项:
1、程序中需要4*4矩阵键盘以及4位数码管
2、数码管的编码(0~F)如下所示
smgduan[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
#include"reg52.h"
unsigned char smgduan[17]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned char cunchu[15]={
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
int k=3,Keyvalve=20,a=3,num=0;
/*延时函数*/
void delay(unsigned int l)
{
while(l--);
}
/*此只能记忆12个键值,如想记录更多键值可扩大cunchu数组*/
void Key_Scan()
{
P1=0xf0;
if(P1!=0xf0)
{
delay(200);
P1=0xf0;
switch(P1)
{
case 0xe0:Keyvalve = 0;break;
case 0xd0:Keyvalve = 1;break;
case 0xb0:Keyvalve = 2;break;
case 0x70:Keyvalve = 3;break;
}
P1=0x0f;
switch(P1)
{
case 0x0e:Keyvalve = Keyvalve;break;
case 0x0D:Keyvalve = Keyvalve + 4;break;
case 0x0B:Keyvalve = Keyvalve + 8;break;
case 0x07:Keyvalve = Keyvalve + 12;break;
}
if(Keyvalve!=14&&Keyvalve!=15)
{
cunchu[a] = smgduan[Keyvalve];
a=a+1;
if(a>=5)
{
k=k+1;
}
}
delay(30000);
}
}
/*历史键值显示*/
void display1(int e)
{
int j,u;
u=e;
for(j=0;j<4;j++)
{
switch(j)
{
case 0:P2=0x08;break;
case 1:P2=0x04;break;
case 2:P2=0x02;break;
case 3:P2=0x01;break;
}
P0=cunchu[u];
delay(100);
P0=0xff;
u=u-1;
}
}
/*所有数码管不显示*/
void display2()
{
int i;
for(i=0;i<4;i++)
{
switch(i)
{
case 0:P2=0x08;break;
case 1:P2=0x04;break;
case 2:P2=0x02;break;
case 3:P2=0x01;break;
}
P0=0xff;
delay(20);
//P0=0xFF;
}
}
/*显示“----”*/
void display3()
{
int i;
for(i=1;i<5;i++)
{
switch(i)
{
case 1:P2=0x08;break;
case 2:P2=0x04;break;
case 3:P2=0x02;break;
case 4:P2=0x01;break;
}
P0=0xBf;
delay(20);
//P0=0xFF;
}
}
void main()
{
while(1)
{
Key_Scan();
if(Keyvalve==14)
{
display2();
}
else if(Keyvalve==15)
{
display3();
}
else
{
display1(k);
}
delay(500);
}
}