只显示有效位的数码管

该博客主要讲述了在C++环境下,利用中断实现数码管显示秒数,但遇到一个问题:秒数小于10时,个位数出现抖动,而大于10时正常。博主分享了代码并寻求解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<reg52.h>

sbit HCA = P2^2;
sbit HCB = P2^3;
sbit HCC = P2^4;

unsigned char code LEDCHAR[] =  {
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
unsigned char LEDBUFF[] = {    
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
unsigned char i = 0;        
unsigned int x = 0;            
unsigned char sign = 0;
unsigned char y = 7;
void main()
{
        unsigned long sec = 0;        
        EA = 1;
        TMOD = 0x01;
        TH0 = 0xFC;
        TL0 = 0x67;
        ET0 = 1;
        TR0 = 1;
    
        while(1)
        {
                if(sign == 1)
                {
                        sign = 0;
                        sec++;
                
                        LEDBUFF[0] = LEDCHAR[sec%10];
                        LEDBUFF[1] = LEDCHAR[sec/10%10];
                        LEDBUFF[2] = LEDCHAR[sec/100%10];
                        LEDBUFF[3] = LEDCHAR[sec/1000%10];
                        LEDBUFF[4] = LEDCHAR[sec/10000%10];
                        LEDBUFF[5] = LEDCHAR[sec/100000%10];
                        LEDBUFF[6] = LEDCHAR[sec/1000000%10];
                        LEDBUFF[7] = LEDCHAR[sec/10000000%10];
                    while(LEDBUFF[y] == 0x3F)
                    {
                            LEDBUFF[y] = 0x00;
                            y--;
                    }
                    y = 7;
                }
        }
}

void InterruptTimer0()interrupt 1
{
        TH0 = 0xFC;
        TL0 = 0x67;
        x++;
        if(x == 1000)
        {
                x = 0;
                sign = 1;
        }
        P0 = 0x00;
        switch(i)
        {
                case 0:HCC = 0;HCB = 0;HCA = 0;i++;P0 = LEDBUFF[0];break;
                case 1:HCC = 0;HCB = 0;HCA = 1;i++;P0 = LEDBUFF[1];break;
                case 2:HCC = 0;HCB = 1;HCA = 0;i++;P0 = LEDBUFF[2];break;
                case 3:HCC = 0;HCB = 1;HCA = 1;i++;P0 = LEDBUFF[3];break;
                case 4:HCC = 1;HCB = 0;HCA = 0;i++;P0 = LEDBUFF[4];break;
                case 5:HCC = 1;HCB = 0;HCA = 1;i++;P0 = LEDBUFF[5];break;
                case 6:HCC = 1;HCB = 1;HCA = 0;i++;P0 = LEDBUFF[6];break;
                case 7:HCC = 1;HCB = 1;HCA = 1;i = 0;P0 = LEDBUFF[7];break;
                default:break;
        }
        
}
       求助!!!虽然使用了中断,但当秒数小于十时,只有十位依然会抖动;当秒数大于十时,就又恢复正常无抖动发生,不知道为什么。

在51单片机中,数码管显示有效位是通过掩码操作实现的。有效位是指在显示数值时,实际上有意义的位数。例如,在一个4位数码管中,如果要显示的数字是“123”,那么只有前三个位是有效位,最后一位是不需要显示的。 为了实现只显示有效位,需要使用一个掩码来限制数码管显示的位数。掩码是一个二进制数,每一位表示数码管上的一个位置是否需要显示。例如,如果要显示3位数,那么掩码就是“1110”,也就是只有最高位不需要显示。我们可以使用掩码和要显示的数值进行按位与运算,这样就可以去掉不需要显示的位。 以下是一个示例代码,演示如何在51单片机中只显示有效位: ``` unsigned char mask = 0b1110; // 定义掩码,只显示三位数 unsigned int value = 123; // 要显示的数值 unsigned char digit[4]; // 数码管上的四个位置 digit[0] = value % 10; // 计算最低位 digit[1] = value / 10 % 10; // 计算次低位 digit[2] = value / 100 % 10; // 计算最高位 for (int i = 0; i < 3; i++) { if ((mask >> i) & 1) { display_digit(digit[i]); // 如果该位需要显示,就显示对应的数字 } } ``` 在上面的代码中,我们首先定义了一个掩码“1110”,表示只显示三位数。然后,我们计算要显示的数值的每一位,并将它们存储在数组`digit`中。最后,我们使用一个循环来遍历掩码的每一位,如果该位需要显示,就调用`display_digit`函数来显示对应的数字。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值