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

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

首先LED显示器工作方式有两种:静态显示方式和动态显示方式。下面细说两种不同的显示。
1.静态显示:
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
以七段码为例:
在这里插入图片描述你需要8根线去控制它,你若想让它对应的地方亮,就给它对应的8位2进制代码为1,然后输入,就可以命它发亮而且是一直发亮,但是这是仅仅一个七段码就需要8根线来控制,而一个板子可以使用的接口是有限的,故就用到了动态显示。
小显示,代码大家都懂
在这里插入图片描述

2.动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
这上面就是说其实每次仅仅只有一个亮,但是每个灯亮的时间很短,变化很快,你就看到了都在亮。
如下图,这是我做的小时钟。
在这里插入图片描述这是运行的的时候,看起来是都亮的。
在这里插入图片描述但是一静止,就只有一个亮了。(上图有个锁存器(中转器)没有显示)中转器的多些肯定是比版子多好很多
这里我讲为什么,一个锁存器控制亮的地方(控制一个亮),一个锁存器控制亮的样子(这是我就输入对应七段码二进制了),
而且可以一说的是我就同样一个版子,加上两个锁存器,控制了8个七段码合成的屏幕(一个板子是没有64根线的哈)。
代码如下

#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);//这是一个小延迟,以下每个变化后都有,大家可以想想每个都是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++;                 //这里上面共用6个dealy(5),就是dealy(30),而1000是一秒,33*30=990我就t%33来控制一秒变化(这里有点误差)
				   if(t%34==0)                    //控制每秒变化,接下来就是改数了
					 {
						 i++;
						 if(i==10)
						 {
							 i=0;
							 j++;
							 if(j==6)
							 {
								 j=0;
								 h++;
								 if(h==10)
								 {
									 h=0;
									 l++;
								 }
							 }
						 }
					 }
	     }
	
	}
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值