飞道的博客

嵌入式静态显示与动态显示

231人阅读  评论(0)
                                                            **嵌入式静态显示与动态显示**

首先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++;
								 }
							 }
						 }
					 }
	     }
	
	}

转载:https://blog.csdn.net/qq_54674051/article/details/115641403
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场