**嵌入式静态显示与动态显示**
首先LED显示器工作方式有两种:静态显示方式和动态显示方式。下面细说两种不同的显示。
1.静态显示:
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
以七段码为例:
你需要8根线去控制它,你若想让它对应的地方亮,就给它对应的8位2进制代码为1,然后输入,就可以命它发亮而且是一直发亮,但是这是仅仅一个七段码就需要8根线来控制,而一个板子可以使用的接口是有限的,故就用到了动态显示。
小显示
2.动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
这上面就是说其实每次仅仅只有一个亮,但是每个灯亮的时间很短,变化很快,你就看到了都在亮。
如下图,这是我做的小时钟。
这是运行的的时候,看起来是都亮的。
但是一静止,就只有一个亮了。
而且可以一说的是我就同样一个版子,加上两个锁存器,控制了8个七段码合成的屏幕。
代码如下
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit du =P2^6;
sbit we =P2^7;
void delay(uint z) //时间函数dealy(1000)=1秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
unsigned char leddata[]={ //用一数组存更好变化
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
};
void main()
{
int i=0,j=0,h=0,l=0,t=0;
while(1)
{
we = 1; //每次前面都要段选与位选为0
P1 = 0xff;
we = 0;
du = 1;
P1 = 0x00;
du = 0;
du = 1;
P1 = leddata[i]; //个位秒
du = 0;
we = 1;
P1 = 0x7f;
we = 0;
delay(5);
we = 1;
P1 = 0xff;
we = 0;
du = 1;
P1 = 0x00;
du = 0;
du = 1;
P1 = leddata[j]; //十位秒
du = 0;
we = 1;
P1 = 0xbf;
we = 0;
delay(5);
we = 1;
P1 = 0xff;
we = 0;
du = 1;
P1 = 0x00;
du = 0;
du = 1;
P1 = leddata[h]; //各位分
du = 0;
we = 1;
P1 = 0xef;
we = 0;
delay(5);
we = 1;
P1 = 0xff;
we = 0;
du = 1;
P1 = 0x00;
du = 0;
du = 1;
P1 = leddata[l]; //十位分,下面小时没有变化,没有写出来,可以同上。
du = 0;
we = 1;
P1 = 0xf7;
we = 0;
delay(5);
we = 1;
P1 = 0xff;
we = 0;
du = 1;
P1 = 0x00;
du = 0;
du = 1;
P1 = leddata[1];
du = 0;
we = 1;
P1 = 0xfe;
we = 0;
delay(5);
we = 1;
P1 = 0xff;
we = 0;
du = 1;
P1 = 0x00;
du = 0;
du = 1;
P1 = leddata[2];
du = 0;
we = 1;
P1 = 0xfd;
we = 0;
delay(5);
t++;
if(t%34==0) //控制每秒变化
{
i++;
if(i==9)
{
i=0;
j++;
if(j==6)
{
j=0;
h++;
if(h==10)
{
h=0;
l++;
}
}
}
}
}
}