AT89S52 按键递加和递减及清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 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);
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值