关于数码管的问题
P2=0x7F;
while(1)
{
delay100ms(10);//延时1秒函数
P2=_cror_(P2,1);//一位右移
}
P2口分别接8个7断数码管,低电平动作。
P1都是数码管a,b,c,d,e,f,g,dp的公共断,高电平动作。因为PI没有操作所以是高电平,一旦P2给哪个数码管通电数码管将显示全亮。
这段程序的目的是先让左边第一个灯全亮,延时一秒,然后第二个延时一秒,第三个...如此循环。
但是它只是最左边的灯亮了1秒后就再也没灯亮了。
然后我把P2拔了接到了8个LED灯,这个LED就可以按一位右移的方式亮灯。
小弟实在是百思不得其解,为什么LED可以跑,数码管就不能了呢 ?望好心人指点!先谢谢了!
坐等解答。
数码管和普通的发光二极管的根本区别在于数码管有位选和段选,数码管跑起来必须是位选跑起来,而发光二极管只要一个电平就可以点亮,数码管还得设置恰当的延时,否则你根本看不到数码管是跑的,而且如果你的数码管一位的话必须一个口接一个,很浪费io口,四位的话就算程序没错也会四位一个跑,而不是八位一个跑!
问题补充:刚刚又试了一下,代码如下:
int disp;
P2=disp=0x7F;
while(1)
{
delay100ms(10);
disp=_cror_(disp,1);
P2=disp;
}
这样就没有问题了,这段程序无非是间接给P2赋值,这样就没有问题了。这样我就很难理解了 ,到底是哪个细节没有注意到呢 ?
你可以在proteus里边仿真一下,或者就拿自己板子三个口接一个一位的数码管或者四位的不要在一个口上那样可以跑起来,当你回头看这程序的时候你会感觉很浪费mcu资源……
如果你认为数码管是简单的赋值那你就错了,数码管有并口和串口之分,也有共阴共阳之分,还有位选段选之分,这些led是没有的,程序也在这些不同的区别上有所不同,简单的赋值不会控制到他功能……
谢谢你的两次回答 !
文笔不好,意思没有表达清楚,不好意思。
我这里位选和段选都是分开的,而且延时也有。我奇怪的是,位选的P2(P2的I/O口直接接八个数码管,没有接位选芯片)直接位移(如P2=_cror_(P2,1)) 的时候,8个数码管只有最高位的那个亮了一下,然后延时了一秒就灭了,其他的灯再也不亮。但当我又定义了一个变量用来实现P2的位移(disp=_cror_(P2,1) ,P2=disp),这样数码管就从左到又跑起来了。
上面有一句写错了 ,disp=_cror_(P2,1) ;P2=disp;改成disp=_cror_(disp,1) ;P2=disp
是这样子,段选和位选都有俩个数组,Table_duanxuan[数字012345678的代码],位选一个数组同样Table_weixuan[八位数码管的位选代码],然后对俩部分进行延时显示……
你要是还是不理解那你就去网上下载一个封装好的数码管程序你看看那些成熟的程序的写法,这样对你理解也有指导和规范的效果!实在不懂就去研究成熟的程序!一定要封装的那种!
谢谢你的耐心解答
学习了,谢谢
这样好像是吧可以的1
学习了
解释得好
我也遇到小编的问题,我在想位选一直都有值,就算位选 段选的延时不同,但8位数码管总有一个会显示啊,为什么八个一个都不亮呢
