STM32F103C8T6控制两片74HC595级联的3641BS八位数码管
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
-
首先要知道595的工作原理
这个可以百度百科74HC595,附链接:[https://baike.baidu.com/item/74HC595],简单讲,就是串行发送并行输出的转换。
3641BS中使用了两片595级联,一片595能输出一个字节,3641BS中,一片595用来作为数码管位选端,一片用来作为数据选择端。两片595,3个I/O口最多可以动态显示8位的数码管。 -
实现程序
//main();
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "hc595.h"
unsigned char disbuffer[8]={1,2,3,4,5,6,7,8};
int main(void)
{
SystemInit(); // ÅäÖÃϵͳʱÖÓΪ72M
LED_GPIO_Config(); //LED ¶Ë¿Ú³õʼ»¯
HC595_Init();
while (1)
{
HC595Display(disbuffer);
}
}
//74hc595.c
#include "hc595.h"
unsigned char Pos[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char Segout[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned int Val;
void HC595_Init(void)
{
GPIO_InitTypeDef GPIO_InitS;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitS.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitS.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitS.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitS);
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
}
void HC595SendData(unsigned int SendVal)
{
uint8_t i;
for (i=0; i<16; i++)
{
if (((SendVal << i) & 0x8000) != 0 )
DIO(1);
else
DIO(0);
SCLK(0);
delay_ms(1000);
SCLK(1);
RCLK(0);
delay_ms(1000);
RCLK(1);
}
void HC595Display(unsigned char *disbuffer)
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
j=disbuffer[i];
Val=Segout[j]&0x00ff;
Val<<=8;
Val=Val+Pos[i];
HC595SendData(Val);
}
}
//74hc595.h
#ifndef HC_595
#define HC_595
#include "stm32f10x.h"
#include "delay.h"
extern unsigned char Pos[8];
extern unsigned char Segout[16];
extern unsigned int Val;
#define DIO(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_12);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_12)
#define SCLK(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_13);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_13)
#define RCLK(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_14);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_14)
void HC595_Init(void);
void HC595SendData(unsigned int SendVal);
void HC595Display(unsigned char *disbuffer);
#endif
最后,附上一张效果图: