stm32共阴极四位数码管驱动

自己写的四位数码管驱动
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()函数就行,传递参数为四位无符号整形。

你可能感兴趣的:(stm32)