【ARDUINO LEONARDO试用体验】+三,驱动74HC595点亮数码管

  • xhuaihe
  • LV4工程师
  • |      2017-08-09 22:18:31
  • 浏览量 1049
  • 回复:0
之前点亮了板载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,这次就这样,下次见。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子