之前点亮了板载LED灯,总是感觉灯少了,所以找了个数码管模块,由5块74HC595组成的驱动数码管模块。
如下图所示,就是数码管全部点亮的状态:
然后点亮之后的效果图:
说一下数码管模块的接口:
共计5个接口,分别是VCC, GND, SDI, CLK, LOAD,并且驱动74HC595完全可以利用SPI驱动。
我这边是用IO口驱动的,分别用的是7, 6, 5这3个IO输出高低电平。
下面是部分代码,写的不好,大神见笑。
宏定义部分:
#define SDI_H() digitalWrite(7,HIGH)
#define SDI_L() digitalWrite(7,LOW)
#define SCK_H() digitalWrite(6,HIGH)
#define SCK_L() digitalWrite(6,LOW)
#define SCK() SCK_L();delay_us(1);SCK_H();delay_us(1)
#define LOAD_H() digitalWrite(5,HIGH)
#define LOAD_L() digitalWrite(5,LOW)
#define SCK() SCK_L();delay_us(1);SCK_H();delay_us(1)
#define LOAD() LOAD_L();delay_us(1);LOAD_H(); delay_us(1);LOAD_L();delay_us(1)
#define LED_H() digitalWrite(LED_BUILTIN, HIGH)
#define LED_L() digitalWrite(LED_BUILTIN, LOW)
#define LED_ON 0
#define LED_OFF (!LED_ON)
在stm32的HAL库函数中,经常发现宏定义是这么用的
#define xxxxx do{...}while(0)
最近在网上查了下这样写的好处,这个
文章(链接)写的挺好的感觉。
http://www.jb51.net/article/101567.htm
发送一个字节的数据:
void hc595_SendByte(uint8_t dat){
uint8_t i;
for(i = 0; i < 8; i++){
if((dat << i) & 0x80) SDI_H();
else SDI_L();
delay_us(1);
SCK(); // CLK: L -> H
delay_us(1);
}
}
在数码管上面显示当前数据,也就是LOAD有一个脉冲:
void hc595_Display(){
delay_us(1);
LOAD();
}
一次性发送5个字节数据,这样可以一次性全部更新数码管:
void hc595_Send5Figure(uint32_t dat){
uint32_t temp;
uint8_t i;
for(i = 0; i < 5; i++){
temp = dat % 10;
Serial.print(CharCode, HEX);
Serial.println(" ");
hc595_SendByte(CharCode);
dat /= 10;
}
hc595_Display();
}
最后,把所有代码压缩了,估计没有下载价值。
OK,这次就这样,下次见。
之前点亮了板载LED灯,总是感觉灯少了,所以找了个数码管模块,由5块74HC595组成的驱动数码管模块。
如下图所示,就是数码管全部点亮的状态:
然后点亮之后的效果图:
说一下数码管模块的接口:
共计5个接口,分别是VCC, GND, SDI, CLK, LOAD,并且驱动74HC595完全可以利用SPI驱动。
我这边是用IO口驱动的,分别用的是7, 6, 5这3个IO输出高低电平。
下面是部分代码,写的不好,大神见笑。
宏定义部分:
#define SDI_H() digitalWrite(7,HIGH)
#define SDI_L() digitalWrite(7,LOW)
#define SCK_H() digitalWrite(6,HIGH)
#define SCK_L() digitalWrite(6,LOW)
#define SCK() SCK_L();delay_us(1);SCK_H();delay_us(1)
#define LOAD_H() digitalWrite(5,HIGH)
#define LOAD_L() digitalWrite(5,LOW)
#define SCK() SCK_L();delay_us(1);SCK_H();delay_us(1)
#define LOAD() LOAD_L();delay_us(1);LOAD_H(); delay_us(1);LOAD_L();delay_us(1)
#define LED_H() digitalWrite(LED_BUILTIN, HIGH)
#define LED_L() digitalWrite(LED_BUILTIN, LOW)
#define LED_ON 0
#define LED_OFF (!LED_ON)
在stm32的HAL库函数中,经常发现宏定义是这么用的
#define xxxxx do{...}while(0)
最近在网上查了下这样写的好处,这个
文章(链接)写的挺好的感觉。
http://www.jb51.net/article/101567.htm
发送一个字节的数据:
void hc595_SendByte(uint8_t dat){
uint8_t i;
for(i = 0; i < 8; i++){
if((dat << i) & 0x80) SDI_H();
else SDI_L();
delay_us(1);
SCK(); // CLK: L -> H
delay_us(1);
}
}
在数码管上面显示当前数据,也就是LOAD有一个脉冲:
void hc595_Display(){
delay_us(1);
LOAD();
}
一次性发送5个字节数据,这样可以一次性全部更新数码管:
void hc595_Send5Figure(uint32_t dat){
uint32_t temp;
uint8_t i;
for(i = 0; i < 5; i++){
temp = dat % 10;
Serial.print(CharCode, HEX);
Serial.println(" ");
hc595_SendByte(CharCode);
dat /= 10;
}
hc595_Display();
}
最后,把所有代码压缩了,估计没有下载价值。
OK,这次就这样,下次见。