74hc595点亮数码管
1、初识74HC595
1.1、74HC595管脚介绍及逻辑表
1.2工作原理介绍
单片机系统中,常采用74HC595作为LED的静态显示接口。74HC595的管脚如上图所示。
该芯片内含8位串入、串/并出移位寄存器和8位三态输出锁存器。寄存器和锁存器分别有各
自的时钟输入(SRCLK和RCLK),都是上升沿有效。当SRCLK从低到高电平跳变时,串行输入数据(SER)移入寄存器:当RCLK从低到高电平跳变时,寄存器的数据置入锁存器。清除端(SRCLR)的低电平只对寄存器复位(Q7为低电平),而对锁存器无影响。当输出允许控制(E)为高电平时,并行输出(Q0~Q7)为高阻态,而串行输出(Q)不受影响。74HC595最多需要5根控制线,即SER、SRCLK、RCLK、SRCLR和E。其中SRCLR可以直接接到高电平,用软件来实现寄存器清零:如果不需要软件改变亮度,E可以直接接到低电
平,而用硬件来改变亮度。把其余三根线和单片机的/O口相接,即可实现对LED的控制。数据从SDI口送入74HC595,在每个SRCLK的上升沿,SER口上的数据移入寄存器,在SRCLK的第9个上升沿,数据开始从Q7移出。如果把第一个74HC595的Q7和第二个74HC595的SER相接,数据即移入第二个74HC595中,照此一个一个接下去,可任意多个。数据全部传送完后,给RCLK一个上升沿,寄存器中的数据即置入锁存器中。此时如果E为低电平,数据即从并口Q0~Q7输出,把Q0-Q7与LED的8段相接,LED就可以显示了。想要软件改变LED亮度,只需改变E的占空比就行了。
1.3,原理总结
由原理可知,当打开寄存器时,给高电平,数据传入寄存器中,此时须关闭锁存器脉冲(RCLK = 0),当数据全部传进寄存器中时,打开锁存器(RCLK = 1),并且打开输入允许控制位E = 0(原理图一般初始接高电平),数据就全部进入锁存器当中,此时74HC595配置完成。
2 数码管配置
2.1数码管编码表
2.1.1、共阴数码管引脚定义及其16进制码表
code u8 Nixietube_Cd[] = {
// 七段数码管显示0到F的编码表
/*显示0~9*/
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f,
/*显示a~f*/
0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,
/*八段全熄灭,显示空,地址0x10*/
0x00};
3 程序实现
##3.1
首先配置74HC595,给其写入一个位
void WriteOnebit(u8 b)
{
NUM_SCK = 0;//根据自己原理图进行配置对应引脚名称
NUM_SER = a;
NUM_SCK = 1;
}
配置完成一个位的数据输入后,我们此时要知道,要使共阴数码管亮,就必须传入位选和段选两个信号值,共9位,如果是四个数码管,则为12位。
以4个数码管为例:
先设置一个拥有大小为4的数字,分别保存4位数码管的4个位值
u8 nixietube_buffer[4];
void Nixietube_Value_id(void)
{
static u8 current_num = 0;
u8 nixietube_code_temp;
char i;
NUM_RCK = 0;//此时先将锁存器低电平关掉
if (current_num >= 4) {
current_num = 0;
}
//给一个current_num,会输出四位 ,循环四次 依次输出0111 1011 1101 1110,进行位选
for (i = 0; i < 4; i--) {
if (i == current_num) {
Wrinte_one_bit(0);
} else {
Wrinte_one_bit(1);
}
}
nixietube_code_temp = nixietube_buffer[current_num];//将当前数码管显存中的值赋给nixietube_code_temp ,并进行移位操作,使其一一进入寄存器当中
//进行段选
for (i = 0; i < 8; i++) {
Wrinte_one_bit(nixietube_code_temp & 0x80);//取每次值的最高位
nixietube_code_temp <<= 1;//进行左移
}
current_num++;
NUM_RCK = 1;//此时将锁存器高电平打开
NUM_OE = 0;
}
此时完成了数码管的位选和段选,此时对数码管进行赋值
比如想输入2023
nixietube_buffer[0] = Nixietube_Cd[2];
nixietube_buffer[1] = Nixietube_Cd[0];
nixietube_buffer[2] = Nixietube_Cd[2];
nixietube_buffer[3] = Nixietube_Cd[3];
至此数码管显示2023就完成了