8个数码管动态显示高位为0时怎么清除?

2020-02-08 09:13发布

显示有8个数码管 比如现在 显示的是 12345678  但是如果是 显示 00000001的话 我只需要他显示 一个 1  其他的 0 就全部熄灭
  如果是  00000010 的话  我只要他显示  10 其他的 0 也全部熄灭   

请求 这种算法 怎么实现  ?   谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
millwood0
1楼-- · 2020-02-09 08:21
"这种算法 怎么实现  ?"

I use a custom itoa to do that.

==============================
void ultoa(unsigned char *str, unsigned long ul, unsigned char length) {
  do {
    str[length--]=(ul % 10) + '0';
    ul = ul / 10;
  } while (ul);  //eliminates leading zeros
  //} while (length);  //keeps leading zeros
}

==============================

so a the following

ultoa (&vRAM[3], 123, 10);

will create a string of '       123', starting at vRAM[3]. no trailing null, however.
vjcmain
2楼-- · 2020-02-09 09:16
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int flag=0;
unsigned char count=0;
unsigned int num=0;
//==================================================
const unsigned char seg[]={        0xC0, // 0
        0xF9, // 1
        0xA4, // 2
        0xB0, // 3
        0x99, // 4
        0x92, // 5
        0x82, // 6
        0xF8, // 7
        0x80, // 8
        0x90 // 9
};


//==================================================

//IO端口初始化
void PortInit(void)
{
        DDRA=0XFF;
        PORTA=0X00;
        DDRB=0XFF;
        PORTB=0XFF;
       
}

//Timer0初始化
void Timer0Init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x06; //set count
OCR0  = 0xFA;  //set compare
TCCR0 = 0x03; //start timer
}

//==================================================

//定时器0溢出中断服务程序
ISR(TIMER0_OVF_vect)
{
        TCNT0=0X06;
        flag++;
        count++;
        switch(count)
        {
                case 1:if(num/1000){PORTA=0X01;PORTB=seg[num/1000];}else PORTB=0XFF;break;
                case 2:if(((num/1000)+(num%1000/100))){PORTA=0X02;PORTB=seg[num%1000/100];}else PORTB=0XFF;break;
                case 3:if(((num/1000)+(num%1000/100)+(num%100/10))){PORTA=0X04;PORTB=seg[num%100/10];}else PORTB=0XFF;break;
                case 4:PORTA=0X08;PORTB=seg[num%10];break;
                case 6:count=0;break;
                default:break;
        }
        if (flag==100)
        {
                flag=0;
                num++;
                if(num==9999)
                {
                        num=0;
                }
        }
}

//==================================================

//主函数
int main(void)
{
        cli();
    TIMSK = 0x01; //timer interrupt sources
        PortInit();
        Timer0Init();
        sei();
       
        //在这继续添加你的代码
        while(1){
    ;
        }
}
abutter
3楼-- · 2020-02-09 09:36
 精彩回答 2  元偷偷看……
not_at_all
4楼-- · 2020-02-09 13:55
4楼  jj3055  给的程序处理方式太麻烦了

void LED_del_0(void)
{
unsigned char a,b,c;
a=(LED_data[4]+LED_data[3]);
b=(LED_data[4]+LED_data[3]+LED_data[2]);
c=(LED_data[4]+LED_data[3]+LED_data[2]+LED_data[1]);
CLI();
if(LED_data[4]==0) LED_data[4]=10;
if(a==0) LED_data[3]=10;
if(b==0) LED_data[2]=10;
if(c==0) LED_data[1]=10;
SEI();
}
用下面的精简一点,无论多少个数位,几句话就搞定
void LED_del_0(void)
{
unsigned char n;
for(n=4;n>1;n--)    //显示5位数,从高位开始判断,最低位的0不管
{
   if(LED_data[n]==0)  LED_data[n]=10;   //不知道上面的10代表什么,反正LED不显示就是了
   else                        break;       遇到大于0的,退出循环
}
wajlh
5楼-- · 2020-02-09 14:25
显示前加个判断不就好么
sz2009
6楼-- · 2020-02-09 17:51
从左往右,是"0", 转为空格, 非"0", 退出

一周热门 更多>