数 码 管
通过 74HC164 移位寄存器将 DispBuff 数组前 6 个段码(0-5)逐位串行发送并转换为并行信号,驱动 6 位数码管显示 "012345"。
1. Write74HC164(unsigned char byte):串行发送 1 字节数据到单个 74HC164
功能:将 1 字节(8 位)数据通过串行方式写入 74HC164 移位寄存器。
过程:
用for循环从cnt=0x01(最低位)到cnt=0x80(最高位)循环 8 次(对应 1 字节的 8 位)。
每次循环先拉低时钟PCLK=0,准备数据;
通过if(byte & cnt)判断当前位(cnt对应的位)是否为 1,若为 1 则置PDat=1,否则置PDat=0;
拉高时钟PCLK=1,利用上升沿触发 74HC164 采集当前PDat的电平,存入移位寄存器;
用_nop_()短暂延时,确保时钟信号稳定。
作用:将并行的 1 字节数据(如数码管段码)拆分为 8 位串行信号,逐位传输给 74HC164。
2. WriteDisplayArray(unsigned char *Dat, unsigned char Len):批量驱动多位数码管
功能:向级联的多个 74HC164 发送指定长度的段码数据,实现多位数码管显示。
过程:
先拉低PClr=0(低电平有效),复位所有级联的 74HC164(清除原有数据),短暂延时后拉高PClr=1释放复位;
用for循环执行Len次(Len为数码管位数),每次调用Write74HC164发送Dat数组中的一个段码,并通过*Dat++移动到下一个数据。
关键逻辑:利用 74HC164 的级联特性(前一级的串行输出接后一级的串行输入),先发送的数据会被后发送的数据 “推” 到后续寄存器,最终所有Len个段码会分别存入对应的 74HC164,并行输出驱动多位数码管。
两者关系
Write74HC164是基础的 “单字节串行发送” 工具,WriteDisplayArray则是基于它实现的 “多字节批量发送” 功能 —— 前者负责将单个段码拆分为串行信号,后者负责协调多个段码的发送顺序和初始复位,共同完成多位数码管的显示驱动。
#include<REG51.H>
#include<stdio.h>
#include<intrins.h>sbit PClr =P1^0; //清除显示引脚,低电平有效
sbit PCLK =P1^1; //时钟信号,上升沿采集数据
sbit PDat =P1^2; //数据引脚//0-F
const unsigned char DispBuff[]={0x3f,0x06,0x5B,0X4F,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay_ms(unsigned int ms)
{unsigned char i=180, j=73;while(ms--){i = 2;j = 199;do{while (--j);} while (--i);}}//实现循环8次 将 1 字节(8 位)数据逐位发送到 74HC164 移位寄存器,
void Write74HC164(unsigned char byte)
{unsigned char cnt;for(cnt =0x01;cnt>0;cnt<<=1){PCLK=0;if(byte&cnt){PDat=1;}else{PDat=0;}PCLK=1;//短暂延时,确保时钟信号稳定_nop_();}
}void WriteDisplayArray(unsigned char *Dat,unsigned char Len)
{unsigned char cnt;PClr =0;_nop_();PClr =1;for(cnt=0;cnt<Len;++cnt){Write74HC164(*Dat++);}
}void main()
{WriteDisplayArray(DispBuff,6);while(1){}
}char putchar(char c)
{ES=0;SBUF=c;while(TI!=1);TI=0;ES=1;return c;
}