//使用STM32F103作为MCU,74HC595驱动8段数码管的程序
#define HC595_OE_H() GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define HC595_OE_L() GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#define HC595_RCK_H() GPIO_SetBits(GPIOB, GPIO_Pin_13)
#define HC595_RCK_L() GPIO_ResetBits(GPIOB, GPIO_Pin_13)
#define HC595_SCK_H() GPIO_SetBits(GPIOB, GPIO_Pin_14)
#define HC595_SCK_L() GPIO_ResetBits(GPIOB, GPIO_Pin_14)
#define HC595_DAT_H() GPIO_SetBits(GPIOB, GPIO_Pin_15)
#define HC595_DAT_L() GPIO_ResetBits(GPIOB, GPIO_Pin_15)
void HC595_init(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
HC595_start();
}
void HC595_start(void)
{
HC595_OE_L();
}
void HC595_stop(void)
{
HC595_OE_H();
}
void HC595_shift_byte(uint8_t byte)
{
uint8_t i = 0;
for (i = 0; i < 8; i++) {
if (byte & 0x80)
HC595_DAT_L();
else
HC595_DAT_H();
HC595_SCK_L();
HC595_SCK_H();
byte = byte << 1;
}
HC595_RCK_L();
HC595_RCK_H();
}
//每执行HC595_shift_byte一次,串联起来的8段数码管就会将自己的显示往左边推移一位;
//HC595_shift_byte的入口参数byte的二进制,刚好对应8段数码管的段位;
//是不是很森破呢~