返回顶部

【51单片机系列】使用74HC595控制数码管显示

使用74HC595结合数码管显示字符。

proteus仿真设计如下,74HC595的输出端连接到动态数码管的位选和静态数码管的段选,动态数码管的段选连接到P0口。这两个数码管都是共阴极的。

74HC595结合数码管显示字符

静态数码管显示字符0-F,软件设计如下:

/*
	实现功能:74HC595芯片控制静态数码管显示字符0-F
	[2023-12-11] zoya
*/
#include "reg52.h"
#include "intrins.h"
#include "HC595.h"

// 共阴极数码管编码
u8 code smg[] = {0x3F, 0x06, 0x5B, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,  // 0~9
0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; // a~f+不显示
	
// 延时函数,i=1时延时10us
void Delay(u16 i)
{
	while(i--);
}

void main()
{
	u8 i;
	while(1)
	{
		for(i=0;i<17;i++)
		{
			HC595SendByte(smg[i]);  // 发送段选数据
			Delay(50000);
		}
	}
}

HC595SendByte函数参考前面的文章“【51单片机系列】74HC595扩展实验之使用74HC595芯片在LED点阵中显示数字”。

仿真结果:

74HC595控制静态数码管显示0-F

动态数码管显示0-7,软件代码如下:

/*
	实现功能:74HC595芯片控制动态数码管显示0-7
	[2023-12-11] zoya
*/
#include "reg52.h"
#include "intrins.h"
#include "HC595.h"

#define GPIO_LED P0

// 共阴极数码管编码
u8 code smg[] = {0x3F, 0x06, 0x5B, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,  // 0~9
0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; // a~f+不显示

u8 duan = 0xfe;
// 延时函数,i=1时延时10us
void Delay(u16 i)
{
	while(i--);
}

// 数码管显示函数
void digDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		HC595SendByte(duan);
		GPIO_LED = smg[i];
		Delay(150);
		duan = _crol_(duan,1);
		GPIO_LED = 0x00;
	}
}

void main()
{
	while(1)
	{
		digDisplay();
	}
}

仿真结果:

74HC595控制动态数码管显示0-7

显示动态数码管时尝试使用多个延时时间,均不能达到38译码器稳定显示0-7的效果,这也是一个bug,希望日后了解更多可以解决。

posted @ 2023-12-12 10:59  Zoya23  阅读(133)  评论(0编辑  收藏  举报