当前位置: 代码迷 >> 综合 >> AT89S52 按键递加和递减及清0
  详细解决方案

AT89S52 按键递加和递减及清0

热度:81   发布时间:2023-12-28 13:25:54.0

这是在2018年学52按键递加递减的学习总结,那个时候的csdn排版让我很恶心,我曾经放弃了csdn一段时间,这是我2019年重新对文章翻新。我跟大家分享一下我踩过的坑:

目录

一、数码管没有显式。

二、只有一个数码管亮

三、递减的时候会出现十位为8


一、数码管没有显式。

错误代码:

duan = 1;
P0 = table[shi];
duan = 0;
P0 = oxfe;
P0 = 0xff;
wei = 1;
P0 = table[ge];
wei = 0;

原因分析:

  1. 锁存器是通过捕捉下跳沿来启动的,所以应该把段选拉高再拉低并的操作把两者放到一起。可能是下跳沿没有写好。
  2. 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);}
}

以前写的都是什么代码,真恶心。