STC单片机74hc164驱动8位数码管动态显示

本文介绍使用74HC164芯片驱动共阳极数码管的方法,包括硬件连接、编程步骤及显示代码。通过级联74HC164芯片实现了多位数码管的动态显示。

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

芯片介绍

74HC164、74HCT164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平时使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。

 

硬件与电原理图

数码显示模块来自淘宝优信电子的数码管模块(因为自己不想动手pcb布局(狗头保命))

电原理图:

由于74hc164是可以进行多联级的,只需要将第二级的74hc164的AB引脚接到第一级Q8引脚即可实现联级。数据传输方式为第一次传输的8位数据为驱动U2的,第二次传输8位数据为驱动U1。如果有3联级或多联级,以此类推。

顺便提一下:此模块数码管为阳极数码管;

编程步骤

将需要显示的数字进行分为千位,百位,十位,个位>>>发送显示千位数据>>>人为延时>>>将数码管选择第一位数据进行发送>>>人为延时>>>发送显示百位的数据>>>人为延时>>>将数码管选择第二位数据进行发送>>>人为延时>>>发送显示十位的数据>>>人为延时>>>将数码管选择第三位数据进行发送>>>人为延时>>>发送显示个位的数据>>>人为延时>>>将数码管选择第四位数据进行发送>>>循环;

数值显示分位代码

首先需要将数据进行分位,如果不进行分为个位,数码管无法将数值进行显示

void DATA_Part(uint byte)
{
    uchar Dat1,Dat2,Dat3,Dat4
    Dat1=byte/1000;    //千位
    Dat2=byte/100%10;  //百位
	Dat3=byte/10%10;   //十位
	Dat4=byte%10;      //个位
}

共阳极数码管0-9显示代码

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

共阴极数码管0-9显示代码

uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};

74hc164驱动显示代码

前4位显示驱动代码

sbit DAT1 = P0^1;
sbit CP1  = P0^0;


void sed_4bit(uint byte)
{
	uchar num,c,Dat1,Dat2,Dat3,Dat4,i=0,b=0,d=0;
	Dat1=byte/1000;
    Dat2=byte/100%10;
	Dat3=byte/10%10;
	Dat4=byte%10;
	i=0;
	b=0;
	d=0;
	for(b=0;b<4;b++)
	{
		switch(i)
		{
			case 0:i=1;num=tab[Dat1];for(c=0;c<8;c++)        
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 1:i=2;num=tab[Dat2];for(c=0;c<8;c++)    
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 2:i=3;num=tab[Dat3];for(c=0;c<8;c++) 
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 3:i=0;num=tab[Dat4];for(c=0;c<8;c++) 
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			default:break;
		}

		switch(d)
		{
			case 0:d=1;num=0x01;for(c=0;c<8;c++)
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 1:d=2;num=0x02;for(c=0;c<8;c++)
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 2:d=3;num=0x04;for(c=0;c<8;c++)
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 3:d=0;num=0x08;for(c=0;c<8;c++)
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			default:break;
		}
		Delay_ms(2);
	}
}

后4位显示驱动代码

void sed_4bit_late(uint byte)
{
	uchar num,c,Dat1,Dat2,Dat3,Dat4,i=0,b=0,d=0;
	Dat1=byte/1000;
    Dat2=byte/100%10;
	Dat3=byte/10%10;
	Dat4=byte%10;
	i=0;
	b=0;
	d=0;
	for(b=0;b<4;b++)
	{
		switch(i)
		{
			case 0:i=1;num=tab[Dat1];for(c=0;c<8;c++)         
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 1:i=2;num=tab[Dat2];for(c=0;c<8;c++) 
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 2:i=3;num=tab[Dat3];for(c=0;c<8;c++) 
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 3:i=0;num=tab[Dat4];for(c=0;c<8;c++) 
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			default:break;
		}

		switch(d)
		{
			case 0:d=1;num=0x10;for(c=0;c<8;c++)
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 1:d=2;num=0x20;for(c=0;c<8;c++)
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 2:d=3;num=0x40;for(c=0;c<8;c++)
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			case 3:d=0;num=0x80;for(c=0;c<8;c++)
                   {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;
			default:break;
		}
		Delay_ms(2);
	}
}

主函数显示

void main()
{
	uint i=0;
	Function();
	while(1)
	{  	
		sed_4bit(506);
		Delay500us();
		sed_4bit_late(442);
		Delay500us();
	}
}

 

实际效果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值