【C51自学笔记】数码管(静态与动态显示)+74HC138+点阵的动态显示

数码管:

  •    数码管由7个发光二极管组成一个日字形,如果需要显示小数点,那么就再加一个点,就是8段数码管。      
  •   数码管显示亮度高,响应速度快,分共阴和共阳两种形式,常用的有单个的和4联的,还有两联的和专门用来显示时间的。
  • 分类:共阴;共阳

  • 编码问题:

    必须对数字或字符进行编码。因此为LED显示器提供的编码正好是一个字节。也有采用BCD-7段译码芯片的。

  • 显示问题:​​​​​​

v静态显示方式

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。

v动态显示

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

  • 数码管下方有一个反相器。默认P3输出1,即默认数码管共阴。
  • 现在需要操作P1,扫描所有数码管

如何扫描:

  • P3:10000 P1送入数字编码
  • P3:01000 P1送入数字编码
  • P3:00100 P1送入数字编码
  • P3:00010 P1送入数字编码
  • P3:00001 P1送入数字编码

送入数字编码:按照16进制编码表即可

其他类型的数码管:

四个管子同时接出a---dp

74HC138译码器:

  • A1,A2,A3三个加权(A0A1A2的输入相当于一个八进制数)输入可以产生八个互斥输出Y0-Y7

输入输出特性:

使能条件:E1E2 :低电平 E3:高电平

芯片使用:

G2A G2B G1:代表E1E2E3

ABC:A0A1A2

点亮数码管:

 //静态显示
 #include <reg52.h>

unsigned char a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};

int main()
{
	P1=a[1];
	//接地端默认使数码管共阴
	while(1);	
	return 0;
}
 //数码管的动态显示
 /*
 思路:
 1.向138芯片的A123输出选中数码管,选中谁 谁是低电平
 
 2.同时P10输出十六进制
 */
 
 #include <reg52.h>
 
sbit smgen=P2^3;//573芯片 高电平 
sbit rs=P3^6;//其他芯片会影响 所以用这个脚关闭那个芯片。

unsigned char table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};//对应着数字
unsigned char table2[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};
//总线驱动:A1A2A3

void delay(unsigned int a)

{
	while(a--);
}

unsigned int t;

void main()
{
	unsigned char i;
	rs=0;//OE接地
	t = 50;
	while(1)
	{
		for(i=0;i<8;i++)
		{
		P2=table2[i];
		smgen=1;
		P1=table1[i];
		delay(t);
		}
	}	
}

点阵:

如何显示:

  • 上图原理图中:横向是P0 纵向是P1 此板使用左边原理图。延序号有P0-P7
  • 如果想让点阵点亮,则保证P0i = 0;P1j = 1

举例:动态显示数字0:

  • P0选中第一列 P0 = 1111 1110  ;P1 = 0000 0000 
  • P0选中第二列 P0 = 1111 1101  ;P1 = 0000 0000 
  • P0选中第三列 P0 = 1111 1011  ;P1 = 0011 1110 
  • P0选中第四列 P0 = 1111 0111  ;P1 = 0100 0001 
  • P0选中第五列 P0 = 1110 1111  ;P1 = 0100 0001 
  • P0选中第六列 P0 = 1101 1111  ;P1 = 0100 0001 
  • P0选中第七列 P0 = 1011 1111  ;P1 = 0011 1110 
  • P0选中第八列 P0 = 0111 1111  ;P1 = 0000 0000 
 #include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int

sbit en1=P2^0;//573高电平
sbit en2=P2^3;//573高电平
sbit rs=P3^6;//某个芯片需要关闭

uchar table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar table2[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};

void init(void)
{
	en1=1;
	en2=1;
	rs=0;
}

void delay(uint a)
{
	while(a--);
}

void main()
{
	 uchar i;
	 init();//初始化
	 while(1)
	 {
		 for(i=0;i<8;i++)
		 {
		 P0=table1[i];
		 P1=table2[i];
		 delay(40);
		 }
	 }

}

猜你喜欢

转载自blog.csdn.net/f_zmmfs/article/details/81152044