微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手求探讨数码管显示问题

新手求探讨数码管显示问题

时间:10-02 整理:3721RD 点击:
找了一段数码管显示0-9999的程序。我的电路是p3高4位控制位选,p0控制段。个人觉得里面有些是多余的。求探讨。看注释。
#include<reg52.h>
#define  uchar unsigned  char
#define  uint  unsigned  int
void x_ms_delay(uint ms);
uchar        led_discode[11]={0xc0,0xf9,0xa4,0xb0,0x99,
                       0x92,0x82,0xf8,0x80,0x90,0xff};
void led_display(uint dis_data);
void main(void)
{
    uchar i;
    uint number;
    P0=0Xff;
        P3=0X00;                     //关闭所有数码管(个人觉得这两句是没必要的,完全不影响显示)
        for(number=0;number<10000;number++)
        {
           for(i=0;i<30;i++)  
           led_display(number);
        }
}
void led_display(uint dis_data)   (下面有4个p3=0x00;为什么要加?不要这4个。显示效果是会更好的。网上有关于余辉的说法,但是个人觉得,只需点亮所需的,然后一直扫描就可以达到显示的效果。何须点亮,关闭,再扫描?)
{
    uchar qian_bit,bai_bit,shi_bit,ge_bit;
        qian_bit=dis_data/1000;
    P0=led_discode[qian_bit];                //显示千位
        P3=0Xe0;
        x_ms_delay(1);
        P3=0X00;
        bai_bit=(dis_data%1000)/100;
    P0=led_discode[bai_bit];                 //显示百位
        P3=0Xd0;
    x_ms_delay(1);
    P3=0X00;
       
        shi_bit=(dis_data%100)/10;
    P0=led_discode[shi_bit];                 //显示十位
        P3=0X70;
    x_ms_delay(1);
    P3=0X00;
        ge_bit =(dis_data%10);
    P0=led_discode[ge_bit];                  //显示个位
        P3=0Xb0;
    x_ms_delay(1);
    P3=0X00;
}
//毫秒级延时子程序
void x_ms_delay(uint ms)
{
    uint  us;
    while(ms--)
    {
        for(us=500;us>0;us--);
    }
}

你用动态扫描一下,自己试试

嘿嘿。试过。我觉得不该加P3=0x00;全加上的话,就会导致。每次都把4个数码管打开。那样别的位在变化时,就会全部变。虽然因为扫描的快。眼睛只能看见每个管都在闪。但是把P3=0x00;去掉。就不会出现了。只是不明白写这程序的人。这句语句的含义。不过还是按照我自己的理解来写的好。

可能是他搞外部是高驱动有效,这句就是正确的,目的是为了消隐,程序需要结合硬件来分析确定

消隐,写代码一般按照实验效果去最好,很多东西不需要追究的特别清楚,每个人都有自己的理解方法。只要结果ok,运行稳定就行!

是的。不过我理解了。这四句是要去掉才会消隐地。用程序的硬件电路验证过了。看懂别人,再按自己的思路来实现自己要的。这是我的学习方法。哈哈

跟选用的数码管是共阴还是共阳有关系,楼上的朋友说的消隐是正确的。一般每次更改数码管的显示值的时候,需要先关闭,在写到八个引脚,在开启。效果才会好。

P0=0Xff;
        P3=0X00;   
是为了避免误动作!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top