数码管动态显示一边暗一边亮还有重叠怎么回事?代码哪里不对?

#include"reg52.h"
#include"intrins.h"
sbit a=P3^3;sbit b=P3^7;
//b是所锁存器DULA口,a是开关 P2是位选 ,P1是段选和锁存器连接
void main()
{ a=0;
while(1){
int c,v;
P2=0XF0;
b=1;
P1=0X4F;
b=0;
for(c=2;c>0;c--)
for(v=2;v>0;v--);
P2=0XF;
b=1;
P1=0X6D;
b=0;
}
}

既然是位选和段选,怎么也得用到两个锁存器吧?你怎么就用到一个?
一个是位选锁存器,一个是段选锁存器。打开位选锁存器,选中你要点亮的数码管。然后再关闭位选锁存器。接着打开段选锁存器,然后输出你要亮的数字,再关闭段选锁存器。再加一个while(1);
以上我说的是静态显示。你先把这个亮起来吧。
你的动态显示有头文件#include"intrins.h",可是你的移位语句没有在程序里体现啊。动态显示其实就是静态显示的组合。所以你先把静态搞清楚。追问

就一个锁存器。静态搞清楚,动态要怎么写代码,左边4行显示5右边四行显示3

追答

动态显示利用的是余辉效应:就是数码管暗的时候不是一下子暗掉,会有很短的一点时间亮着,我们的眼睛是无法看出来的。
动态显示说明白点,就是轮流点亮,不是所有的数码管一起点亮。先在锁存器锁存你要输出的数字,然后再轮流选中你要点亮的数码管。比如你先动态点亮所有的数码管为5。当然还有考虑延时。

追问

延时怎么弄,我用
for(c=2;c>0;c--)
for(v=2;v>0;v--);
这个很快了,怎么一个亮一个暗的

追答

#include"reg52.h"

#include"intrins.h"

sbit a=P3^3;sbit b=P3^7;

 //b是所锁存器DULA口,a是开关 P2是位选 ,P1是段选和锁存器连接

void main()

{ a=0;

  while(1){

int c,v;

  P2=0XF0;

  b=1;

  P1=0X4F;

  b=0;

for(c=2;c>0;c--)

for(v=2;v>0;v--);
 P1=0xff;
for(c=2;c>0;c--)

for(v=2;v>0;v--);
  P2=0XF;

  b=1;

  P1=0X6D;

  b=0;
for(c=2;c>0;c--)

for(v=2;v>0;v--);
 P1=0xff;
for(c=2;c>0;c--)

for(v=2;v>0;v--);

 }

}

这是我在你的程序的基础上修改的,然后在软件上仿真的。你自己看看。如果你在板子上不行的话,我估计会是延时问题。这个软件在延时显示上不是那么完美。

延时可以在keil上面调,比较准确的,这里我也讲不清。你还是去下个单片机小精灵,有免费的。软件自动给出延时程序。一般延时在1~5ms之间。

你要动态显示没那么复杂。你用的是两个4段数码管,可以一起显示。主要是你没消影,所以你显示的是九。消影就是让数码管暗。

void delay(void)   //误差 0us

{

    unsigned char a,b;

    for(b=111;b>0;b--)

        for(a=12;a>0;a--);

}这是晶振12MHZ下的3ms延时

我上面说的一起显示意思是,两个4段数码管轮流显示。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-08
不妨到我们这个电子世家单片机群:255847245,里面的同行或许能帮得到你。
第2个回答  2013-05-07
等一下先,我慢慢看追问

( ⊙ o ⊙ )

数码管动态显示一边暗一边亮还有重叠怎么回事?代码哪里不对?
一个是位选锁存器,一个是段选锁存器。打开位选锁存器,选中你要点亮的数码管。然后再关闭位选锁存器。接着打开段选锁存器,然后输出你要亮的数字,再关闭段选锁存器。再加一个while(1);以上我说的是静态显示。你先把这个亮起来吧。你的动态显示有头文件#include"intrins.h",可是你的移位...

...做动态显示的实验,为什么数码管显示的不对。程序代码,电路图如下...
缺少消隐环节,改动如下:void main(){ uchar i = 0;while(1) { P1 = 0; \/\/消隐.P2 = control[i];\/\/换位.P1 = dofly[i]; \/\/显示.delay(200);i++;if(i == 8) i = 0;} }

单片机串口控制数码管显示两位数字时显示不对。
程序都是对的,你对16进制 10进制数。可能没理解透彻。。。你的数码管显示是10进制显示模式。所以出现了这种情况。你可以改成16进制显示。也可以自己发送数据的时候换算一下10进制应该是什么?是否跟显示的值一样?文本模式也是显示的对的。。。下面网址是ASII码表。你发送的文本1ASII码值就是49(10进...

为什么让数码管显示1是要赋0x03?难道点亮bc管不是0110,0x06吗?还有...
这是哪里的题?答案是错的,你的算法也不对。看那原理图,数码管是共阳的,因此,段控端应该是0有效,不是1有效(共阴数码管才是1有效)。所以,显示1,应该是b,c两段亮,是两个0,段码=1111 1001=0xf9。程序应该写 P0=0xf9;那参考程序的三行都是错的,这是哪里的错误程序。

共阳极数码管,我给的oxff为什么全亮了呢?锁存器显示的也不对啊?
首先看下数码管对吗,是共阴的还是共阳的其次 要知道PROTUES仿真是理想状态下的,单片机的IO口电流不足以驱动数码管,可以用三极管来驱动

我的四位数码管(12个引脚,8个段选,四个位选)段选跟P0口连接,位选跟P2...
哦!你这是动态扫描,不对啊,段码还要有一只小欧数的限流电阻。只是注意把扫描频率(50Hz)放低点就会亮很多。

...65536之间的任一数,当单片机收到后在数码管上动态显示出来...
看你的仿真图,是用虚拟终端发的,对吗?如果是的话,你这个题目又错啦。因为虚拟终端只能以ASCII码的形式发送,不能以16进制发送的,非要用16进制发送,必须在电脑上用串口调试助手,而且是发送两个字节。所以,不论是仿真图,还是程序都是不可能完成这个题目的,因为题目本身就是错误的。

电磁炉出现e6是怎么回事
如电磁炉频繁出现该E6代码,可能是电磁炉因散热通风口受阻或散热风扇不转导致散热不良,也可能是电磁炉温度传感器故障,需要申请售后检修。故障解决 1、不开机(按电源键指示灯不亮)(1)按键不良-检查并更换按键板 (2)电源线配线松脱-重接 (3)电源线不通电-重接或换新 (4)保险丝熔断-更换 (...

电磁炉出现“E6”就停止工作了,这是怎么回事?
电磁炉出现“E6”就停止工作了,这是因为锅下超温,锅里没有水干烧所致。各品牌电磁炉故障代码:1、万和电磁炉故障对照表~~~100W灯 E0 断路开路(主传感器坏)400W灯 E5 短路(主传感器坏)800W灯 E3 高压保护 1200W灯 E4 低压保护 1500W灯 E2 IGBT超温 1900W...

相似回答