实现目标
1、三位数码动态扫描;
2、stm32f103 hal库驱动74hc595 芯片。
一、74hc595 芯片
74hc595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在sck 的上升沿,串行数据由sdl输入到内部的8位位移缓存器,并由q7'输出,而并行输出则是在lck的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端oe的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。
74hc595管脚介绍及逻辑表
74hc595的数据来源于14脚,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。假如,我们要将二进制数据0111 1111 输入到74hc595的移位寄存器中,下面来上一张动态图,模拟了前2个位输入的情景。
8位数据输入完成后,给12脚一个上升沿,数据从位移寄存器转移到存储寄存器。
二、原理图设计
。
三、stm32cubemx 配置
1.管脚配置
四、程序设计
1、74hc595驱动程序
/* user code begin 4 */
void hc595_send_byte(unsigned char byte)
{
unsigned char i;
for (i = 0; i < 8; i ++) //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
{
/**** 步骤1:将数据传到ds引脚 ****/
if (byte & 0x80) //先传输高位,通过与运算判断第八是否为1
hal_gpio_writepin(gpioa, data_pin, gpio_pin_set); //如果第八位是1,则与 595 ds连接的引脚输出高电平
else //否则输出低电平
hal_gpio_writepin(gpioa, data_pin, gpio_pin_reset);
/*** 步骤2:shcp每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
hal_gpio_writepin(gpioa, shcp_pin, gpio_pin_reset); // shcp拉低
for_delay_us(5); // 适当延时
hal_gpio_writepin(gpioa, shcp_pin, gpio_pin_set); // shcp拉高, shcp产生上升沿
for_delay_us(5);
byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
}
/** 步骤3:stcp产生一个上升沿,移位寄存器的数据移入存储寄存器 **/
hal_gpio_writepin(stcp_gpio_port, stcp_pin, gpio_pin_reset); // 将stcp拉低
for_delay_us(5);
hal_gpio_writepin(stcp_gpio_port, stcp_pin, gpio_pin_set);// 再将stcp拉高,stcp即可产生一个上升沿
for_delay_us(5);
}
/*
for循环实现延时us
*/
void for_delay_us(uint32_t nus)
{
uint32_t delay = nus * 168/4;
do
{
// __nop();
}
while (delay --);
}
/* user code end 4 */
2、共阳数码管码表
//共阳数码管码表
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
3、函数申明
void hc595_send_byte(unsigned char byte);
void for_delay_us(uint32_t nus);
4、动态显示数字“123”
while (1)
{
hal_gpio_writepin(gpioa, seg1_pin, gpio_pin_set);
hal_gpio_writepin(gpioa, seg2_pin, gpio_pin_reset);
hal_gpio_writepin(gpiob, seg3_pin, gpio_pin_reset);
hc595_send_byte(table[1]);//函数调用
for_delay_us(5); // 适当延时
hc595_send_byte(0xff); // 消影
hal_gpio_writepin(gpioa, seg2_pin, gpio_pin_set);
hal_gpio_writepin(gpioa, seg1_pin, gpio_pin_reset);
hal_gpio_writepin(gpiob, seg3_pin, gpio_pin_reset);
hc595_send_byte(table[2]);//函数调用
for_delay_us(5); // 适当延时
hc595_send_byte(0xff);// 消影
hal_gpio_writepin(gpioa, seg2_pin, gpio_pin_reset);
hal_gpio_writepin(gpioa, seg1_pin, gpio_pin_reset);
hal_gpio_writepin(gpiob, seg3_pin, gpio_pin_set);
hc595_send_byte(table[3]);//函数调用
for_delay_us(5); // 适当延时
hc595_send_byte(0xff);// 消影
/* user code end while */
/* user code begin 3 */
}
五、实验现象
六、仿真实现
总结
发表评论