共2条
1/1 1 跳转至页
问
这个问题困扰我半个多月了,一直没能解决掉,请大家帮帮我!谢谢了
用51单片机做数码管动态显示的部分,51的P0口+驱动芯片连接5只数码管的段选部分,P2口+驱动芯片连接数码管的位选,作出来的效果总是很闪烁,请问是怎么回事?还有就是程序里面用到了一个高速采样AD的定时中断,大概在2ms到5ms之间,请问怎么样设计程序才能让数码管尽量不闪烁?谢谢了 答 1: 你先把AD去掉,调试一下,看看闪烁吗? 答 2: to jcsasm :把AD去掉显示没有问题的,但是问题是我要显示的数据就是从AD采集以后处理显示出来的。我还尝试着把显示部分放在中断里面,但是还是有一点闪烁,而且显示一旦放到中断里面,系统程序有时候就执行乱了。请问引起闪烁一般都有什么样的问题?
以下是我的显示部分程序,请帮我看一下还应该怎么改,谢谢
译码:
unsigned char get_code(unsigned char i)
{
unsigned char p;
switch(i){
case 0:p=0x5F; break;
case 1:p=0x05; break;
case 2:p=0x9B; break;
case 3:p=0x8F; break;
case 4:p=0xC5; break;
case 5:p=0xCE; break;
case 6:p=0xDE; break;
case 7:p=0x07; break;
case 8:p=0xDF; break;
case 9:p=0xCF; break;
case 10:p=0x7F; break;//小数点位显示
case 11:p=0x25; break;
case 12:p=0xBB; break;
case 13:p=0xAF; break;
case 14:p=0xE5; break;
case 15:p=0xEE; break;
case 16:p=0xFE; break;
case 17:p=0x27; break;
case 18:p=0xFF; break;
case 19:p=0xEF; break;
case 'R':p=0xD7;break;
case 'S':p=0xCE; break;
case 'E':p=0xDA; break;
case 'L':p=0x58; break;
case 'A':p=0xD7;break;
case 'd':p=0x9D;break;
case 'P':p=0xD3;break;
case 'U':p=0x5D;break;
case '-':p=0x80;break;//符号位显示
default:p=0x00;break;
}
return p;
}
显示:(要显示的数据放在display_buffer数组中)
void Display(void)
{
unsigned char i;
static unsigned char star_count=0;
SDA^=1;
switch(display_bit){
case 1: i=0;break;
case 2: i=1;break;
case 4: i=2;break;
case 8: i=3;break;
case 16:i=4;break;
default:break;
}
P2=0x00;
//闪烁位判断与操作
if(star_bit==display_bit && star_count<25)
{P0=0;star_count++;}
else if(star_bit==display_bit && star_count>=25)
{P0=get_code(display_buffer[i]);star_count++;}
//小数点位判断与操作
else if(state==0 && (4-point)==i && (4-point)!=4)
P0=get_code(display_buffer[i]+10);
else
P0=get_code(display_buffer[i]);
P2=display_bit;
if(star_count>=50)star_count=0;
if(display_bit<16) display_bit=display_bit*2;
else display_bit=0x01;
} 答 3: 你还没有理解闪烁的原因,要对症下药!即然是动态显示,那么一定要反复的输出显示数据,当输出显示数据之间的时间间隔太小时,就会出现闪烁!最好的问题就是用静态的,否则就要让间隔时间很小。 答 4: 只要刷新速度高于20次/秒,就没问题 答 5: 估计用静态的好一点采样频率达不到不闪的 时候
我看用静态的吧 答 6: 就几个管的显示,很容易搞定的就几个管的显示,很容易搞定的,关键是要把它放在中断里,时间1~10ms,要写精练点,就可以了。我做了N个类似的显示,都这么做的,1ms的延迟,其他什么都没影响,绝对不闪,8个数字都可以。 答 7: 你的动态显示的思路不对5个数码管,放在中断里处理,时间中断为不大于4ms(4*5=20ms,正好在公频内,假如大于20ms人眼就会感到闪烁)。每来一次中断,就显示一个LED的值,循环显示5位数码管。由于“视觉残留”的效果,人的眼睛还是以为其他的LED是在闪烁的,当你的AD值改正了,只要修改显示的值就行了,显示值在中断中送到端口。 答 8: 保证频率了,如何扫描不均匀的话也可能会闪烁 答 9: 要写精练点要写精练点,如果不是,在中断内还没执行完一个管的切换,下一个中断又来了,自然会死机 答 10: 阿南,你是在天津上的大学吗?(找人) 答 11: 谢谢大家那个闪烁的问题基本上解决了,我就是把显示程序放到中断里面,中断周期是3个ms,现在肉眼看不出来闪了,我得思路就是有新数据的时候才更新显示缓冲区,否则就不更新,效果还不错,谢谢大家!
但是这样引起来另外一个问题,显示的时候某些为会有些突闪,有时候甚至灭零处理的数码管位也会突然的显示一个数出来,请问各位大哥有没有遇到过着样的问题?谢谢了 答 12: 动态扫描在满足一定扫描频率下尽量增加每一位的保持时间就不会闪//简单示例:
dl2ms(void); /* 延时 2MS */
void readkey(void); /* 读键 */
void dokey(); /* 键处理 */
void cshow(void); /*更改显示函数*/
void addsec(void); /*秒计数、进位 */
void show (void); /* 显示扫描 */
void lao (void); /* 闹铃 */
void main (void) { /* 主程序*/
//前面初始化
while (1) { /* 无限循环 */
if (ons) addsec();
readkey();
if (onk) dokey();
show( );
dl2ms( );
}
}
void show (void) { /* 显示扫描 */
P1=0xff;
P3=P3|0xb8;
switch (shd){
case 0:shd1=0;break;
case 1:shd2=0;break;
case 2:shd3=0;break;
case 3:shd4=0;break;
default:shd=4;
}
P1=stab[sshow[shd]];
shd--;
}
用51单片机做数码管动态显示的部分,51的P0口+驱动芯片连接5只数码管的段选部分,P2口+驱动芯片连接数码管的位选,作出来的效果总是很闪烁,请问是怎么回事?还有就是程序里面用到了一个高速采样AD的定时中断,大概在2ms到5ms之间,请问怎么样设计程序才能让数码管尽量不闪烁?谢谢了 答 1: 你先把AD去掉,调试一下,看看闪烁吗? 答 2: to jcsasm :把AD去掉显示没有问题的,但是问题是我要显示的数据就是从AD采集以后处理显示出来的。我还尝试着把显示部分放在中断里面,但是还是有一点闪烁,而且显示一旦放到中断里面,系统程序有时候就执行乱了。请问引起闪烁一般都有什么样的问题?
以下是我的显示部分程序,请帮我看一下还应该怎么改,谢谢
译码:
unsigned char get_code(unsigned char i)
{
unsigned char p;
switch(i){
case 0:p=0x5F; break;
case 1:p=0x05; break;
case 2:p=0x9B; break;
case 3:p=0x8F; break;
case 4:p=0xC5; break;
case 5:p=0xCE; break;
case 6:p=0xDE; break;
case 7:p=0x07; break;
case 8:p=0xDF; break;
case 9:p=0xCF; break;
case 10:p=0x7F; break;//小数点位显示
case 11:p=0x25; break;
case 12:p=0xBB; break;
case 13:p=0xAF; break;
case 14:p=0xE5; break;
case 15:p=0xEE; break;
case 16:p=0xFE; break;
case 17:p=0x27; break;
case 18:p=0xFF; break;
case 19:p=0xEF; break;
case 'R':p=0xD7;break;
case 'S':p=0xCE; break;
case 'E':p=0xDA; break;
case 'L':p=0x58; break;
case 'A':p=0xD7;break;
case 'd':p=0x9D;break;
case 'P':p=0xD3;break;
case 'U':p=0x5D;break;
case '-':p=0x80;break;//符号位显示
default:p=0x00;break;
}
return p;
}
显示:(要显示的数据放在display_buffer数组中)
void Display(void)
{
unsigned char i;
static unsigned char star_count=0;
SDA^=1;
switch(display_bit){
case 1: i=0;break;
case 2: i=1;break;
case 4: i=2;break;
case 8: i=3;break;
case 16:i=4;break;
default:break;
}
P2=0x00;
//闪烁位判断与操作
if(star_bit==display_bit && star_count<25)
{P0=0;star_count++;}
else if(star_bit==display_bit && star_count>=25)
{P0=get_code(display_buffer[i]);star_count++;}
//小数点位判断与操作
else if(state==0 && (4-point)==i && (4-point)!=4)
P0=get_code(display_buffer[i]+10);
else
P0=get_code(display_buffer[i]);
P2=display_bit;
if(star_count>=50)star_count=0;
if(display_bit<16) display_bit=display_bit*2;
else display_bit=0x01;
} 答 3: 你还没有理解闪烁的原因,要对症下药!即然是动态显示,那么一定要反复的输出显示数据,当输出显示数据之间的时间间隔太小时,就会出现闪烁!最好的问题就是用静态的,否则就要让间隔时间很小。 答 4: 只要刷新速度高于20次/秒,就没问题 答 5: 估计用静态的好一点采样频率达不到不闪的 时候
我看用静态的吧 答 6: 就几个管的显示,很容易搞定的就几个管的显示,很容易搞定的,关键是要把它放在中断里,时间1~10ms,要写精练点,就可以了。我做了N个类似的显示,都这么做的,1ms的延迟,其他什么都没影响,绝对不闪,8个数字都可以。 答 7: 你的动态显示的思路不对5个数码管,放在中断里处理,时间中断为不大于4ms(4*5=20ms,正好在公频内,假如大于20ms人眼就会感到闪烁)。每来一次中断,就显示一个LED的值,循环显示5位数码管。由于“视觉残留”的效果,人的眼睛还是以为其他的LED是在闪烁的,当你的AD值改正了,只要修改显示的值就行了,显示值在中断中送到端口。 答 8: 保证频率了,如何扫描不均匀的话也可能会闪烁 答 9: 要写精练点要写精练点,如果不是,在中断内还没执行完一个管的切换,下一个中断又来了,自然会死机 答 10: 阿南,你是在天津上的大学吗?(找人) 答 11: 谢谢大家那个闪烁的问题基本上解决了,我就是把显示程序放到中断里面,中断周期是3个ms,现在肉眼看不出来闪了,我得思路就是有新数据的时候才更新显示缓冲区,否则就不更新,效果还不错,谢谢大家!
但是这样引起来另外一个问题,显示的时候某些为会有些突闪,有时候甚至灭零处理的数码管位也会突然的显示一个数出来,请问各位大哥有没有遇到过着样的问题?谢谢了 答 12: 动态扫描在满足一定扫描频率下尽量增加每一位的保持时间就不会闪//简单示例:
dl2ms(void); /* 延时 2MS */
void readkey(void); /* 读键 */
void dokey(); /* 键处理 */
void cshow(void); /*更改显示函数*/
void addsec(void); /*秒计数、进位 */
void show (void); /* 显示扫描 */
void lao (void); /* 闹铃 */
void main (void) { /* 主程序*/
//前面初始化
while (1) { /* 无限循环 */
if (ons) addsec();
readkey();
if (onk) dokey();
show( );
dl2ms( );
}
}
void show (void) { /* 显示扫描 */
P1=0xff;
P3=P3|0xb8;
switch (shd){
case 0:shd1=0;break;
case 1:shd2=0;break;
case 2:shd3=0;break;
case 3:shd4=0;break;
default:shd=4;
}
P1=stab[sshow[shd]];
shd--;
}
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |