这是在2018年学52按键递加递减的学习总结,那个时候的csdn排版让我很恶心,我曾经放弃了csdn一段时间,这是我2019年重新对文章翻新。我跟大家分享一下我踩过的坑:
目录
一、数码管没有显式。
错误代码:
duan = 1;
P0 = table[shi];
duan = 0;
P0 = oxfe;
P0 = 0xff;
wei = 1;
P0 = table[ge];
wei = 0;
原因分析:
- 锁存器是通过捕捉下跳沿来启动的,所以应该把段选拉高再拉低并的操作把两者放到一起。可能是下跳沿没有写好。
- P0 =0xff;可能是这一行代码导致显式完数字就立马清空了,什么也没有显示。
二、只有一个数码管亮
原因分析:是通过P0来控制第几个数码管亮。很可能写成了wei = 0xfd;应该是P0 = 0xfd;
三、递减的时候会出现十位为8
错误源代码:
if (key2 == 0 )
{
delay(10);
if (key2 == 0)
{
num--;
if (num == 0)
num = 60;
while(!key2);
}
}
原因分析:当初始值为0时,再进行减运算,会变成负数,显示8也是理所当然。所以把num--和if语句的顺序换一换就可以了。
四、修改后的源码
#include<reg52.h>
#define unint unsigned int
#define unchar unsigned char
sbit key1 = P3^4;//plus
sbit key2 = P3^5;//subtract
sbit key3 = P3^6;//reset
sbit duan = P2^6;//段选
sbit wei = P2^7;//位选
unchar code table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unint num=0;
void delay(unint de){
unint i,j;
for(i=de;i>0;i--)
for(j=110;j>0;j--);
}
void display(unint dis_num){
unint shi,ge;
shi = dis_num/10;
ge = dis_num%10;
P0 = table[shi];
duan = 1;
duan = 0;
P0 = 0xfe;
wei = 1;
wei = 0;
delay(5);
P0 = 0xFF;
P0 = table[ge];
duan = 1;
duan = 0;
P0 = 0xfd;
wei = 1;
wei = 0;
delay(5);
P0 = 0xFF;
}
void keyScan()
{
if (key1 == 0)
{
delay(10);
if (key1 == 0)
{
num++;
if (num == 60)
{
num = 0;
}
while(!key1);
}
}
if (key2 == 0 )
{
delay(10);
if (key2 == 0)
{
if (num == 0)
{
num = 60;
num--;
while(!key2);
}
}
if (key3 == 0)
{
delay(10);
if (key3 == 0)
{
num = 0;
while(!key3);
}
}
}
void main()
{
while(1)
{
keyScan();
display(num);
}
}
以前写的都是什么代码,真恶心。