如果我的文章帮助到你了,希望给我点赞,加关注哦,你的阅读就是我最大的写作动力。
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define temp P3
sfr P4=0xc0;
sbit P42=P4^2;
sbit P44=P4^4;
uchar code table[]={0xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0Xbf,0XFF}; //0xbf - 0xff 熄灭 下标为11
uchar disbuff[]={11,11,11,11,11,11,11,11};
uchar discom;
uchar key_value;
uint counter;
void key_process();
void display();
void delay(uint i);
void Timer1Init(void);
void allinit();
void main()
{
allinit();
Timer1Init();
while(1)
{
key_process();
}
}
void Timer1Init(void) //2毫秒@11.0592MHz
{
TMOD|=0x20;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
}
void timer1() interrupt 3
{
if(++counter==2)
{
counter=0; //2ms
display();
}
}
void display()
{
disbuff[6]=key_value/10;
disbuff[7]=key_value%10;
P2=((P2&0X1f)|0xe0);
P0=0xff;
P2&=0x1f;
P2=((P2&0x1f)|0xc0);
P0=1<<discom;
P2&=0x1f;
P2=((P2&=0X1F)|0XE0);
P0=table[disbuff[discom]];
P2&=0x1f;
if(++discom==8) discom=0;
}
void delay(uint i)
{
while(i--);
}
void key_process()
{
temp=0x0f;P44=0;P42=0;
if(temp!=0x0f)
{
delay(1000);
if(temp!=0x0f)
{
switch(temp)
{
case (0x0e):key_value=0;break;
case (0x0d):key_value=4;break;
case (0x0b):key_value=8;break;
case (0x07):key_value=12;break;
}
temp=0xf0;P44=1;P42=1;
if(P44==0)
{
key_value+=0;while(!P44);
}
if(P42==0)
{
key_value+=1;while(!P42);
}
if(temp==0xd0)
{
key_value+=2;while(temp==0xd0);
}
if(temp==0xe0)
{
key_value+=3;while(temp==0xe0);
}
}
}
}
void allinit()
{
P2=0XA0;
P0=0X00;//关闭蜂鸣器,继电器
P2=0X80;
P0=0XFF;//关闭LED灯
P2=0XC0;
P0=0XFF;//选择所有数码管
P2=0XFF;
}
该代码涉及到了矩阵键盘和数码管的使用:
另外还告诉大家一个数码管代码调试技巧:
解决重影的办法:
1.显示前先将所有数码管熄灭,然后再显示。
2.除了显示数码外,其他时间都是熄灭的。
3.检查是否存在交替显示不同数字。
4.扫描速度要足够快。
闪烁:
如果停留时间太长的话,也就意味着暗的时间太长,人眼没能将亮暗的变化连续起来。就像拍摄电影,如果帧数较少的时候,在激烈动作的时候会出现跳帧。换个例子,就像本来每秒24帧的静态图片可以在人眼中形成连续的画面,你从中间抽取10帧画面,还在一秒内重放这些画面,就会感觉到闪烁。
链接:https://pan.baidu.com/s/1mV9t3hQQQs3deC-HNf1Lpg
提取码:gs9p