第三章、stc89c52单片机控制数码管显示

文章介绍了如何使用STC89C52单片机通过138译码器和74HC245芯片来驱动共阴极LED数码管进行静态和动态显示,包括位选和段选的操作,以及动态显示时的消影现象处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 LED的两种连接:共阳极 和 共阴极(stc89c52使用的是共阴极连接)

以 共阴极为例:如果要显示数字6,则需要点亮 A,C,D,E,F,G

位选:3和8要接上低电平

段选:A,C,D,E,F,G接上高电平

四位一体的数码管:可以看出同一时刻,数码管只能显示同一个数字

位选 ---d138译码器(0为 选中)

 通过单片机3个引脚控制,8个LED位。例如:

选择LED1 ---->  CBA = 000-----> Y0

选择LED5 ---->  CBA = 100-----> Y4

选择LED8 ---->  CBA = 111-----> Y7

段选 ---- 控制每个数码管a,b,c,d,e,f,g,dg 

其中 J21控制74HC245 的数据传输方向。

LE 接VCC高电平  ----->  从A 到 B

LE 接GND低电平  ----->   从B到A

为什么要用一个74HC245芯片?

因为高电平点亮LED不够稳定,需要这个芯片加强信号!

1、点亮一个静态数码管---点亮第一个数码管显示数字6

位选: 选中LED8  ----> CBA=111 

P2_4 = 1;P2_3 = 1;P2_2 = 1

段选:选中a,c,d,e,f,g 

0111 1101  ---->  十六进制 :0x7D

P0 = 0x7D

#include <REGX52.H>
void main()
{
	while(1)
	{
		P2_4=1;   // 138 译码器 C
		P2_3=1;  // 138 译码器 B
		P2_2=1;  // 138 译码器 A
		P0= 0x7D;
	}
}

 程序优化 :将显示封装到函数中

#include <REGX52.H>

unsigned char NumberArray[]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,};

// location:第几个数码管显示   Number:数码管显示的数字
void display(unsigned char location,Number)
{
	switch(location)    //位选
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;    // 选中第一个数码管,LED8
		case 2:P2_4=1;P2_3=1;P2_2=0;break; 
		case 3:P2_4=1;P2_3=0;P2_2=1;break; 
		case 4:P2_4=1;P2_3=0;P2_2=0;break; 
		case 5:P2_4=0;P2_3=1;P2_2=1;break; 
		case 6:P2_4=0;P2_3=1;P2_2=0;break; 
		case 7:P2_4=0;P2_3=0;P2_2=1;break; 
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
		default:P2_4=1;P2_3=1;P2_2=1;
	}
     
	P0 = NumberArray[Number];
}

void main()
{
	while(1)
	{
		display(1,14);    //第一个数码管显示E
	}
}

2、动态数码管显示(多位数码管显示)

数码管的消影现象(图片中1,2,3 并没有显示清除,有阴影):

 问题:位选 段选 (这个位置会发生问题) 位选 段选  位选 段选

解决: 位选 段选 清零 位选 段选  清零  位选 段选

#include <REGX52.H>

unsigned char NumberArray[]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,};
void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;	
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void display(unsigned char location,Number)
{
	switch(location)    //λѡ
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;    // Ñ¡ÖеÚÒ»¸öÊýÂë¹Ü LED8
		case 2:P2_4=1;P2_3=1;P2_2=0;break; 
		case 3:P2_4=1;P2_3=0;P2_2=1;break; 
		case 4:P2_4=1;P2_3=0;P2_2=0;break; 
		case 5:P2_4=0;P2_3=1;P2_2=1;break; 
		case 6:P2_4=0;P2_3=1;P2_2=0;break; 
		case 7:P2_4=0;P2_3=0;P2_2=1;break; 
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
		default:P2_4=1;P2_3=1;P2_2=1;
	}

	P0 = NumberArray[Number];
	Delay(1);    //先延迟1ms
	P0=0x00;     //清零数码管

}

void main()
{
	while(1)
	{
		display(1,1);
		display(2,2);
		display(3,3);
	}
}

    Delay(1);    //先延迟1ms
    P0=0x00;     //清零数码管

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值