其他分享
首页 > 其他分享> > 笔记:51单片机——静态数码管和动态数码管的分别

笔记:51单片机——静态数码管和动态数码管的分别

作者:互联网

单片机的机子上有8个数码管,当需要用到的时候可以看到这个管每次选择哪个亮的时候,数电课本上都知道138译码器是比较好的位选择器。就是当我们需要选择哪个数码管亮的时候,分别对应的就给138译码器的三个引脚位给电平,

138译码器译码规则从上往下是低位到高位1 2 4 ,右边的引脚就对应这LED位位选择端,当需要选择哪个数码管亮的时候,就给这个译码器选择就好了。

然后选择好位之后就到段选了,因为选择了数码管就有给亮的数字是多少,这里可以定义一个数组然后赋值给P0端口,数组就是两个8421码,对应着a b c d e f g dp。8421 8421这样子。然后16进制码就是在右边往左边读,就好像让数码管亮数字2就是  a b g e d 点亮就给电平,然后16进制是0x5d

选择的原理大概是这样,

这个是数组显示0-15的

#include <reg52.h>
#include "led.h"


sbit LED=P2^2;     //定义138译码管脚
sbit LED1=P2^3;
sbit LED2=P2^4;

u16 code number[]={0x3f,0x06,0x5b,0x4f,0x66,
                   0x6d,0x7d,0x07,0x7f,0x6f,
				   0x77,0x7c,0x39,0x5e,0x79,0x71};  //0~15    10~15显示abcdef

下面是选择

void delay(unsigned int xms)	  //延迟函数  1表示1ms
{
	unsigned char i, j;
	while(xms--){
	i = 2;
	j = 239;
	do
	{
	  while (--j);
	} while (--i); }


}

void led(u8 s,u8 chr)
{
   	 switch(s)
	 {
      	case 1:LED=1;LED1=1;LED2=1;break;   //选择左边往右数第一个,下面依次往右数
		case 2:LED=0;LED1=1;LED2=1;break;
		case 3:LED=1;LED1=0;LED2=1;break;
		case 4:LED=0;LED1=0;LED2=1;break;
		case 5:LED=1;LED1=1;LED2=0;break;
		case 6:LED=0;LED1=1;LED2=0;break;
		case 7:LED=1;LED1=0;LED2=0;break;
		case 8:LED=0;LED1=0;LED2=0;break;
	 }
	  P0=number[chr];   //选择数码管显示的数字数组第几个。
	  delay(10);
	  //P0=0x00;	   //消隐用于同时显示多个数字出现的时候就需要把注释去掉
}

说到这里有一个注释的P0=0x00就是动态数码管和静态数码管的区别了,正常显示只能让一个数码管亮的,并不能让多个同时亮。当然可以这样,先亮一个然后灭掉,再让另一个亮,这样子只有闪的够快就能骗过人的眼睛。这样子就能让人以为是同时有多个数码管亮。其不然还是一个时间里只有一个亮,只是亮灭的够快,就好像同时亮一样。这里需要延迟一下是因为,当位选  段选   灭,位选  段选   灭,位选  段选   灭 这里执行的时间一样,会导致出现一种错觉就是,会不会下次出现的是 段选   灭 位选 或者    灭  位选  段选,所以需要给一定的机械延迟,让单片机识别出来这样时间段是不同的执行规则。给它一定的反应时间。

标签:LED1,case,LED2,LED,单片机,51,break,数码管
来源: https://blog.csdn.net/m0_64478952/article/details/123588725