一、硬件原理
1.1 数码管
5161AS数码管引脚图:
5161AS数码管原理图:
1.2 74HC595芯片
《74HC595芯片介绍和使用详解》:
74HC595芯片介绍和使用详解【干货】_枉少年不纯洁的博客-CSDN博客_74hc595^v9^control,157^v4^control&utm_term=74hc595&spm=1018.2226.3001.4187
注:74HC595与74ls595是两种不同的芯片,前者为CMOS电路,后者为TTL电路。74ls595是简单的数据分配器,不需要CP脉冲,也不需要同步;74HC595需要同步传输。在实际工作原理和驱动程序上,两者区别不大。
时序图:
图片来源:74系列595芯片使用详解(包含电路设计要点与驱动程序示例)_Naisu Xu的博客-CSDN博客_74ls595
二.编码说明
2.1 数码管驱动编码
八位二进制数据控制一个数码管,从高位到低位依次控制h、g、f、e、d、c、b、a,1亮0熄。
逆序编码原因:最先进入移位寄存器的数据为控制最后一个LED的信号,因此需逆序编码。当全部数据写入驱动芯片,并经过移位寄存器移位后,各位数据将是顺序排列。
2.2十六进制数编码参考
Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};//依次为 0、1、2、3、4、5、6、7、8、9、A,b,C,d,E,F,空
三、驱动代码参考
3.4 三位数码管显示驱动参考代码
void SEG_DisplayValue(u8 Bit1, u8 Bit2, u8 Bit3) { u8 i = 0; u8 code_tmp = 0; RCLK_L;//存储寄存器时钟置0 code_tmp = Seg7[Bit3];//最低位数码管数据应首先写入,原因同“逆序编码原因” for(i = 0; i < 8; i++) { SCK_L; if(code_tmp & 0x80) { SER_H; } else { SER_L; } code_tmp = code_tmp << 1; SCK_L; SCK_H;//移位寄存器时钟置1,将高位数据向低位移一位 } code_tmp = Seg7[Bit2]; for(i = 0; i < 8; i++) { SCK_L; if(code_tmp & 0x80) { SER_H; } else { SER_L; } code_tmp = code_tmp << 1; SCK_L; SCK_H; } code_tmp = Seg7[Bit1]; for(i = 0; i < 8; i++) { SCK_L; if(code_tmp & 0x80) { SER_H; } else { SER_L; } code_tmp = code_tmp << 1; SCK_L; SCK_H; } RCLK_L; RCLK_H;//存储寄存器时钟置1,将移位寄存器数据逐位写入存储寄存器并从输出引脚输出 }