STC89C52单片机数码管介绍以及代码示例

目录

一,数码管介绍

二,数码管引脚定义

我们首先对单个引脚进行说明:

其次,我们对多个引脚管进行说明:

最后我们来详细说说如何进行位选还有段选

接着是段选

三,数码管段码表

四,数码管驱动方式

五,代码演示


一,数码管介绍

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件

二,数码管引脚定义

我们首先对单个引脚进行说明:

数码管分为共阳极连接和共阴极连接两种:

1,共阴极连接就是说3,8这一头连得是负极,所以在下面的那头给上高电平(即置1)就可以使二极管发光

2,共阳极连接就是说3,8这一头连得是正极,所以在下面的那头给上低电平(即置0)就可以使二极管发光

注意:在实际编写代码的时候这一点一定要搞清楚,或者进行实验后发现亮光的二极管的位置和预想的不对,那么对赋值的I/O口使用取反符号~也行

其次,我们对多个引脚管进行说明:

在这里的显示方式我们简单的归纳为这么几步:位选 段选 清零 位选 段选 清零

首先说明什么是扫描数码管,我们发现,数码管在构造时为了节省端口(单片机就40个引脚,不能全用来显示数码管吧,嘿嘿)把一排的数码管端口都共用了,所以为了同时显示四个数字,我们是不是得这样:

1,先在DIG1,DIG2,DIG3,DIG4,选一个

2,在端口用二进制代码或者十六进制代码显示我们想要显示的字符

3,最后将端口清零,就是全灭,因为端口是共用的,所以这样可以避免扫描过快时,第二个位置也显示相同的字符;

最后利用定时器以很快地速度重复这三个步骤,就可以实现数码管的扫描操作了

然后我们之前解释的显示方式就一一对应了即1就表示位选,2就表示段选,3,就表示清零。

最后我们来详细说说如何进行位选还有段选

首先还是由于节省I/O口的原因,所以在这里我们在位选的时候要用到这个74HC138译码器:

他的所用很简单,看图就可以知道,他是将p22,p23,p24三个引脚转换为LED1到LED8,这8个接口,刚刚好来控制我们板子上从左到右的8位数码管

接着是段选

就比较方便:可以看到下面的原理图上每个“8”字型的数码管上都有a,b,c,d,e,f,g,dp接口,分别对应的是P0_0到P0_7的8个接口。这里根据调试发现数码管是共阴极。所以置P0_0到P0_7为1即可 

三,数码管段码表

鉴于数码管的特殊构造,所以只能显示一部分字母

四,数码管驱动方式

在本节我们所说的数码管的驱动实际上是由软件(代码)来驱动的,但是一但有比数码管更加高的优先级的硬件时,我们就需要“外挂”即自带驱动扫描芯片的数码管显示器

五,代码演示

在8,7,6位置分别连续显示1,2,3

#include <REGX52.H>
void xianshi(unsigned char location,number);
void Delay1ms(unsigned int xms)	;
void main()
{
		
	while(1){
	  xianshi(8,1);
	  xianshi(7,2);
	  xianshi(6,3);
	  }
	
}

void xianshi(unsigned char location,number){

	switch(location){
		case 1: P2_4=0;P2_3=0;P2_2=0; break;
		case 2: P2_4=0;P2_3=0;P2_2=1; break;
	    case 3: P2_4=0;P2_3=1;P2_2=0; break;
		case 4: P2_4=0;P2_3=1;P2_2=1; break;
		case 5: P2_4=1;P2_3=0;P2_2=0; break;
	    case 6: P2_4=1;P2_3=0;P2_2=1; break;
		case 7: P2_4=1;P2_3=1;P2_2=0; break;
	    case 8: P2_4=1;P2_3=1;P2_2=1; break;
	}

	switch (number){
	 case 0: P0=0x3F   ; break;//0011 1111
	 case 1: P0=0x06   ; break;//0000 0110
	 case 2: P0=0x5B   ; break;//0101 1011
	 case 3: P0=0x4F   ; break;//0100 1111
	 case 4: P0=0x66   ; break;//0110 0110
	 case 5: P0=0x6D   ; break;//0110 1101
	 case 6: P0=0x7D   ; break;//0111 1101
	 case 7: P0=0x07   ; break;//0000 0111
	 case 8: P0=0x7F   ; break;//0111 1111
	 case 9: P0=0x6F   ; break;//0110 1111
	 }
   Delay1ms(1);
	 P0=0x00;
}

void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
while(xms){
			i = 12;
			j = 169;
			do
			{
				while (--j);
			} while (--i);
     xms--;
		}
}

posted @ 2022-04-09 17:36  爱吃炸鸡的小猪  阅读(1009)  评论(0编辑  收藏  举报