自己写的四位数码管驱动
74HC595
使用Hal库
LED.C
#include "main.h"
#include "gpio.h"
#define getbit(x,y) ((x)>>(y)&1) //first bit is y=0
#define SCLK0 HAL_GPIO_WritePin(SCLK_GPIO_Port,SCLK_Pin,GPIO_PIN_RESET)
#define SCLK1 HAL_GPIO_WritePin(SCLK_GPIO_Port,SCLK_Pin,GPIO_PIN_SET)
#define RCLK0 HAL_GPIO_WritePin(RCLK_GPIO_Port,RCLK_Pin,GPIO_PIN_RESET)
#define RCLK1 HAL_GPIO_WritePin(RCLK_GPIO_Port,RCLK_Pin,GPIO_PIN_SET)
#define DO0 HAL_GPIO_WritePin(DO_GPIO_Port,DO_Pin,GPIO_PIN_RESET)
#define DO1 HAL_GPIO_WritePin(DO_GPIO_Port,DO_Pin,GPIO_PIN_SET)
uint16_t code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uint16_t num[]={0x01,0x02,0x04,0x08};
void SendByte(uint16_t a){
for(uint16_t i=8;i>0;i--){
SCLK0;
if(getbit(a,i-1)&1) DO0;
else DO1;
SCLK1;
}
}
void SendNum(uint16_t co,uint16_t nu){
uint16_t C = ~code[co];
uint16_t N = ~num[nu];
SendByte(C);
SendByte(N);
RCLK0;
RCLK1;
}
uint16_t GetNum(uint16_t A,uint16_t B){
if(A==0) return 0;
if(B==1) return A%10;
if(B==2) return A/10%10;
if(B==3) return A/100%10;
else return A/1000%10;
}
void Display(uint16_t Number){
for(uint16_t i=1;i<=4;i++){
SendNum(GetNum(Number,i),i-1);
HAL_Delay(3);
}
}
LED.H
#ifndef __LED_H
#define __LED_H
#include "main.h"
void SendByte(uint16_t a);
void SendNum(uint16_t co,uint16_t nu);
uint16_t GetNum(uint16_t A,uint16_t B);
void Display(uint16_t Number);
#endif
使用时,要设置引脚别名为SCLK,RCLK,DO。将驱动加入KEIL工程后,直接调用Display()函数就行,传递参数为四位无符号整形。