单片机学习三——点亮数码管及动态扫描

[复制链接]
7228|20
 楼主| wtm_dxyb 发表于 2010-6-16 12:29 | 显示全部楼层 |阅读模式
#include <reg52.h>
sbit d0=P2^0;
sbit d1=P2^1;
sbit d2=P2^2;
void delay(int z);
void main()
{
while(1)
  {
P0=0x3f;
d0=0,
d1=0,
d2=0;   
  delay(1) ;
P0=0x06;
d0=1,
d1=0,
d2=0;
   delay(1);
P0=0x5b;
d0=0,
d1=1,
d2=0;
  delay(1);
P0=0x4f;
d0=1,
d1=1,
d2=0;
   delay(5);
P0=0x66;
d0=0,
d1=0,
d2=1;
   delay(1);
P0=0x6d;
    d0=1,
d1=0,
d2=1;
    delay(5);
P0=0x7d;
    d0=0,
d1=1,
d2=1;
delay(5);
P0=0x07;
    d0=1,
d1=1,
d2=1;
delay(1);
  }
}
void delay(int z)
{
int i,y;
for(i=z;i>0;i--)
  for(y=100;y>0;y--);
}
问题如下如果不加delay()(延时函数)数码管显示数字模糊,好像被其他什么数字覆盖。请高手帮忙解决!
isoar 发表于 2010-6-16 13:06 | 显示全部楼层
你的程序需要改进,在送出第N+1位的段码前,一定要先把第N位的位段码关闭,不然第N+1位的段码会在第N位有个短暂的残留。这个只讲原理的教科书上都没有,没实际做过的老师也肯定不会这么用的。另外,人眼的视觉残留需要一定时间,所以点亮要显示的段码以后必须要保持一定的时间。

你按这个顺序去循环看看:
“第N位位码有效(点亮第N位)”——“延时”——“关闭所有位显示”——“送出N+1位段码”——“第N+1位位码有效(点亮第N+1位)”——

主程序延时方式显示只能是做教学用,实际工程应用,最好还是通过定时器来实现扫面显示,循环延时太浪费cpu资源了,不能一片单片机只做一个显示吧。
xwj 发表于 2010-6-16 13:17 | 显示全部楼层
呵呵,LS正解。
 楼主| wtm_dxyb 发表于 2010-6-16 13:18 | 显示全部楼层
[img]file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/YMT6803$H][SQB]L)OA_7SR.jpg[/img]
我买的单片机开发版原理图是这个样子的,74138控制七个共阴数码管,锁存器74573控制端直接接高电位! 2# isoar
crazy_madfly 发表于 2010-6-16 13:26 | 显示全部楼层
isoar 发表于 2010-6-16 15:49 | 显示全部楼层
本帖最后由 isoar 于 2010-6-16 15:50 编辑

呵呵,你把图片的链接连到c盘,只有你一个人能看到吧。

段码和位码是用什么芯片控制是没有关系的,只要扫描的顺序对了就行了。
hanfei08131106 发表于 2010-6-16 16:42 | 显示全部楼层
顶二楼的、、、
xw802 发表于 2010-8-20 16:30 | 显示全部楼层
把你程序改了一下,这样似乎简洁很多吧
#include<reg52.h>
#define uchar unsigned char
uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
uchar code tablewe[]={0,1,2,3,4,5,6,7};
void delay(int z)
{
  int i,y;
  for(i=z;i>0;i--)
  for(y=100;y>0;y--);
}
void main()
{
uchar i;
P0=0x00;
while(1)
{
    for(i=0;i<8,i++)
   {
     P2=tablewe[i];
     P0=tabledu[i];
     delay(2);
   }
}
}

评分

参与人数 1威望 +1 收起 理由
wtm_dxyb + 1

查看全部评分

海南男人U2 发表于 2010-8-22 20:09 | 显示全部楼层
楼上的改的很好!
xiaoyu9632 发表于 2010-8-22 23:19 | 显示全部楼层
二楼是正解,思维方式首先得 学二楼这么去思考才能得到真正经得起考验的程序。人眼是有视觉暂留效果的,约为24HZ以上就可以在动态扫描过程中造成数字没被改变的假象。当然实际上一般都会取的更高。你可以通过这个区计算,首先知道有几个数码管?然后保证每个数码在30HZ以上的频率可以刷新一次,然后使用各定时中断,在中断中设个标志,到时间就设置该标志然后再主循环中检测该标志(这要是主循环时间不是太长的情况下,不然就直接在中断中去做,通常中断执行的时间不超过中断的2/3即可)然后执行位段显示操作,操作如二楼所说。在送第n+1个断码前关闭第N位的断码是为了消影。动态扫描就是有开就有关的。
Eakin1317 发表于 2010-8-25 14:52 | 显示全部楼层
8楼不错哟!
Eakin1317 发表于 2010-8-25 14:54 | 显示全部楼层
不过二楼的更有意义“授之以鱼不如授之以渔”!
hsgzlgg 发表于 2010-9-3 15:32 | 显示全部楼层
8楼在
delay(2); 后面加
P0=0x00;
关断就是二楼的意思了。
我赞成二楼的思路!
xixihaha0 发表于 2010-9-3 19:25 | 显示全部楼层
想到了三年前的我
autopccopy 发表于 2010-9-3 19:25 | 显示全部楼层
你的程序需要改进,在送出第N+1位的段码前,一定要先把第N位的位段码关闭,不然第N+1位的段码会在第N位有个短暂的残留。这个只讲原理的教科书上都没有,没实际做过的老师也肯定不会这么用的。另外,人眼的视觉残留需 ...
isoar 发表于 2010-6-16 13:06


顶2L, 要先关段码这个我也是前两天才摸索出来的,当时是显示完后关位码,在显示下一个,就是出现上一个的残影,百思不得其解!因为按逻辑来说,关闭位码应该就不会有显示的,很多例程也是这样。后来才摸索了很久先将段码(置0XFF)就搞定!:)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
rclong 发表于 2010-9-3 19:43 | 显示全部楼层
我用74HC138驱动八位数码管也一般采用8楼的程序

不过还是想体验一下74HC575驱动的静态显示
JACK_1986 发表于 2011-6-18 21:43 | 显示全部楼层
学习ing:)
hotpower 发表于 2011-6-18 21:53 | 显示全部楼层
最基础的
liangying33 发表于 2011-6-18 22:15 | 显示全部楼层
:lol学习中
sdll 发表于 2013-2-1 17:04 | 显示全部楼层
谢谢这里的朋友 也帮我解决了这个问题。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

20

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部