新手求探讨数码管显示问题
时间: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--);
}
}
#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;
是为了避免误动作!