打印

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

[复制链接]
6141|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#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

使用特权

评论回复
5
crazy_madfly| | 2010-6-16 13:26 | 只看该作者
ggg

使用特权

评论回复
6
isoar| | 2010-6-16 15:49 | 只看该作者
本帖最后由 isoar 于 2010-6-16 15:50 编辑

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

段码和位码是用什么芯片控制是没有关系的,只要扫描的顺序对了就行了。

使用特权

评论回复
7
hanfei08131106| | 2010-6-16 16:42 | 只看该作者
顶二楼的、、、

使用特权

评论回复
8
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
9
海南男人U2| | 2010-8-22 20:09 | 只看该作者
楼上的改的很好!

使用特权

评论回复
10
xiaoyu9632| | 2010-8-22 23:19 | 只看该作者
二楼是正解,思维方式首先得 学二楼这么去思考才能得到真正经得起考验的程序。人眼是有视觉暂留效果的,约为24HZ以上就可以在动态扫描过程中造成数字没被改变的假象。当然实际上一般都会取的更高。你可以通过这个区计算,首先知道有几个数码管?然后保证每个数码在30HZ以上的频率可以刷新一次,然后使用各定时中断,在中断中设个标志,到时间就设置该标志然后再主循环中检测该标志(这要是主循环时间不是太长的情况下,不然就直接在中断中去做,通常中断执行的时间不超过中断的2/3即可)然后执行位段显示操作,操作如二楼所说。在送第n+1个断码前关闭第N位的断码是为了消影。动态扫描就是有开就有关的。

使用特权

评论回复
11
Eakin1317| | 2010-8-25 14:52 | 只看该作者
8楼不错哟!

使用特权

评论回复
12
Eakin1317| | 2010-8-25 14:54 | 只看该作者
不过二楼的更有意义“授之以鱼不如授之以渔”!

使用特权

评论回复
13
hsgzlgg| | 2010-9-3 15:32 | 只看该作者
8楼在
delay(2); 后面加
P0=0x00;
关断就是二楼的意思了。
我赞成二楼的思路!

使用特权

评论回复
14
xixihaha0| | 2010-9-3 19:25 | 只看该作者
想到了三年前的我

使用特权

评论回复
15
autopccopy| | 2010-9-3 19:25 | 只看该作者
你的程序需要改进,在送出第N+1位的段码前,一定要先把第N位的位段码关闭,不然第N+1位的段码会在第N位有个短暂的残留。这个只讲原理的教科书上都没有,没实际做过的老师也肯定不会这么用的。另外,人眼的视觉残留需 ...
isoar 发表于 2010-6-16 13:06


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

test_24c02.jpg (135.2 KB )

某次读写24c02的试验。。。呵呵。。

某次读写24c02的试验。。。呵呵。。

使用特权

评论回复
16
rclong| | 2010-9-3 19:43 | 只看该作者
我用74HC138驱动八位数码管也一般采用8楼的程序

不过还是想体验一下74HC575驱动的静态显示

使用特权

评论回复
17
JACK_1986| | 2011-6-18 21:43 | 只看该作者
学习ing:)

使用特权

评论回复
18
hotpower| | 2011-6-18 21:53 | 只看该作者
最基础的

使用特权

评论回复
19
liangying33| | 2011-6-18 22:15 | 只看该作者
:lol学习中

使用特权

评论回复
20
sdll| | 2013-2-1 17:04 | 只看该作者
谢谢这里的朋友 也帮我解决了这个问题。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

20

帖子

1

粉丝