1、什么是动态数码管
(1)数码管还是原来的数码管(共阳极或共阴极均可)记住:数码管有2端:COM端(共极)和段码端(IO口)
(2)段码一侧还是接一个单片机端口
(3) COM(共极)接单片机一个IO口(J16),多个联排数码管的COM共同接一个IO端口
分析对比静态和动态数码管,发现本质区别是:静态数码管中只要给了段码数码管就一定工作i(显示只取决于段码端),动态数码管中段码端给了段码值后还需要coM端配合才能点亮数码管。
2、动态数码是如何工作
(1)在某一特定时间段中,联排数码管中只有一个数码管在工作,其他均在休息(不工作)
(2)COM端选择哪个数码管工作,段码端输出这个数码管要显式的数字的段码;延时COM端选择下一个数码管工作,同时段码端改输出这个数码管要显示的数字的段码;延时:COM端选择下一个数码管工作·…
(3)快速切换工作的数码管,则人看到的是所有的数码管都在亮(其实亮度是比静态驱动低的)。
(4)动态数码管利用了人眼的视觉暂留。
3、动态数码管显示编程实战1
本节目标:先实验得出数码管的段码表
(1)接线确定:段码端接P0,COM端接P1端口
(2)COM端选择一个数码管亮:P1.0-P1.7随便选1个输出0(因为是共阴极),其余输出1
(3)段码端给不同的值来测试得到段码表
#include <REGX51.H>
void main(void)
{
P0 = 0x6d;//0110 1101
P1 = 0xbf;//1011 1111
}
由测试得出:
P0端口代码段和静态数码管一样。
x x x x x x x x
dp g f e d c b a
P1端口:1011 1111得出
P1.0对于的从左到右第一个LED灯。
4、动态数码管显示编程实战2
目标:8个联排数码管依次显示12345678
(1)编程思路:先选中第1数码管,然后段码端送1的段码,然后延时一会儿;然后切换选中第2数码管,然后段码端送2的段码,然后延时一会儿;·……直到第8个数码管显示完为一个周期。
#include <REGX51.H>
//定义延迟函数
void relay (void)
{
unsigned char k = 200;
unsigned char h = 200;
while(k--)
{
while(h--)
;
}
}
void main(void)
{
unsigned char i[8] = {0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f};//依次显示1到8
unsigned char j[8] = {0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};//从左到由LED依次亮
unsigned char n;
while(1)
{
for(n=0; n<=7; n++)
{
P1 = j[n];//从左到由LED依次亮
P0 = i[n];//依次显示1到8
relay();
}
}
}
实验结论:
1、延时时间太长,数字会闪动。(延迟200改为2)
2、把时间改短后发现有2个问题:
第一个是亮的不够亮,第二个是暗的不够暗,
解决方案就是在每个数码管亮完要切换下一个数码管时消隐(P0 = 0x00)。
#include <REGX51.H>
//定义延迟函数
void relay (void)
{
unsigned char k = 2;
unsigned char h = 2;
while(k--)
{
while(h--)
;
}
}
void main(void)
{
unsigned char i[8] = {0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f};//依次显示1到8
unsigned char j[8] = {0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};//从左到由LED依次亮
unsigned char n;
while(1)
{
for(n=0; n<=7; n++)
{
P1 = j[n];//从左到由LED依次亮
P0 = i[n];//依次显示1到8
relay();
P0 = 0x00;//消影
}
}
}