标题:
数码管有鬼影问题
[打印本页]
作者:
WANG....
时间:
2017-10-15 11:22
标题:
数码管有鬼影问题
那个老师知道。或者那个大佬明白给我讲解一下谢谢。为什么数码管输入5678显示6785;5还有鬼影。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AT24C02_ADDR 0xa0
#define PCF8591_ADDR 0X90
#define MAIN_Fosc 11.0592
sbit we = P2^7;
sbit du = P2^6;
sbit SDA = P2^0;
sbit SCL = P2^1;
void delay_5us()
{
_nop_();
}
void delay(uint ms)
{
uchar i;
do
{
i = MAIN_Fosc / 9600;
while(--i);
}
while(--ms);
}
unsigned char leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x80, //??
0x00 //???
};
unsigned char ledbit[]={
0xfe, //w1
0xfd, //w2
0xfb, //w3
0xf7, //w4
0xef, //w5
0xdf, //w6
0xbf, //w7
0x7f, //w8
};
void display(uint i)
{
uint b,s,g,q;
q = i/1000;
b = i%1000/100;
s = i%100/10;
g = i%10;
du = 1;
P0 = leddata[q];
du = 0;
delay(10);
we = 1;
P0 = 0xfe;
we = 0;
P0 = 0xff;
du = 1;
P0 = leddata[b] ;
du = 0;
delay(5);
we = 1;
P0 = 0xfd
we = 0;
P0 = 0xff;
du = 1;
P0 = leddata[s];
du = 0;
delay(5);
we = 1;
P0 = 0xfb;
we = 0;
P0 = 0xff;
du = 1;
P0 = leddata[g];
du = 0;
delay(5);
we = 1;
P0 = 0xf7;
we = 0;
P0 = 0xff;
}
void main()
{
while (1)
{
display(5678);
}
}
复制代码
作者:
小潘哥
时间:
2017-10-15 18:28
这个用定时器定时1ms,然后每ms对一个数码管进行一次刷新,这样更好吧
要去除鬼影,在刷新下一个数码管之前,先P0=0xFF可P0=0x00吧,程序就不细看了,,,,,
作者:
yzwzfyz
时间:
2017-10-15 23:56
扫描时序未合理规划安排。
作者:
wulin
时间:
2017-10-16 09:08
本帖最后由 wulin 于 2017-10-16 10:22 编辑
你的显示程序延时位置不对,另外集中分解数据会耽误时间使个位亮度大于其他位。给你改了一下,你试试。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#define AT24C02_ADDR 0xa0
//#define PCF8591_ADDR 0X90
#define MAIN_Fosc 11.0592
sbit we = P2^7;
sbit du = P2^6;
//sbit SDA = P2^0;
//sbit SCL = P2^1;
/*
void delay_5us()
{
_nop_();
}
*/
void delay(uint ms)
{
uchar i;
do
{
i = MAIN_Fosc / 9600;
while(--i);
}
while(--ms);
}
uchar leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x80, //??
0x00 //???
};
uchar ledbit[]={
0xfe, //w1
0xfd, //w2
0xfb, //w3
0xf7, //w4
0xef, //w5
0xdf, //w6
0xbf, //w7
0x7f, //w8
};
void display(uint i)
{
// uint b,s,g,q;
// q = i/1000;
// b = i%1000/100;
// s = i%100/10;
// g = i%10;
P0 = leddata[i/1000];
du = 1;
du = 0;
P0 = 0xfe;
we = 1;
we = 0;
P0 = 0xff;
delay(1);
P0 = leddata[i%1000/100] ;
du = 1;
du = 0;
P0 = 0xfd;
we = 1;
we = 0;
P0 = 0xff;
delay(1);
P0 = leddata[i%100/10];
du = 1;
du = 0;
P0 = 0xfb;
we = 1;
we = 0;
P0 = 0xff;
delay(1);
P0 = leddata[i%10];
du = 1;
du = 0;
P0 = 0xf7;
we = 1;
we = 0;
P0 = 0xff;
delay(1);
}
void main()
{
while(1)
{
display(5678);
}
}
作者:
hello1314
时间:
2017-10-16 13:19
刷新问题
作者:
WANG....
时间:
2017-10-22 13:14
wulin 发表于 2017-10-16 09:08
你的显示程序延时位置不对,另外集中分解数据会耽误时间使个位亮度大于其他位。给你改了一下,你试试。
#i ...
谢谢
作者:
admin
时间:
2017-10-23 00:59
这是我6年前些的 单片机数码消隐问题的的解决方案:
http://www.51hei.com/bbs/dpj-10971-1.html
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1