这是在2018年学52按键递加递减的学习总结,那个时候的csdn排版让我很恶心,我曾经放弃了csdn一段时间,这是我2019年重新对文章翻新。我跟大家分享一下我踩过的坑:
目录
一、数码管没有显式。
二、只有一个数码管亮
三、递减的时候会出现十位为8
一、数码管没有显式。
错误代码:
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 charsbit 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);}
}
以前写的都是什么代码,真恶心。