TM1637带秒点四位LED显示器模块ARDUINO驱动程序

几块钱网上买了块LED显示模块,IIC接口,TM1637驱动,四位显示,带秒点.写了个用于ESP32模块的ARDUINO驱动程序,将笔记放这里,以备未来使用.

 模块文件:TM1637.C

#ifndef TM1637_H
  #define TM1637_H
  /*TM1637四位LED数码管(带秒点)显示驱动,每位数码管可以显示一位十六进制数据0~F,支持秒点显示和亮度调节.
   *         _________________________________ 
   *GND---- |   __      __       __      __   |
   *VCC---- |  |__|    |__|  .  |__|    |__|  |
   *DIO---- |  |__|    |__|  .  |__|    |__|  |
   *CLK---- |_________________________________|
   *           LED3    LED2     LED1    LED0   
  */
class TM1637{
  private:
    //1/4脉冲宽度设置。使用不同的时钟频率需要调节此参数以适应IIC总线操作速度.
    #define TM1637_DELAY_US 1
    const uint8_t displayChar[16]={0X3F,0X30,0X5B,0X79,0X74,0X6D,0X6F,0X38,0X7F,0X7D,0X7E,0X67,0X0F,0X73,0X4F,0X4E};//十六进制数字BCD码(请根据印刷板数码管连接情况使用不同的编码数组)。
    uint8_t DIO=26;//IIC数据线。
    uint8_t CLK=27;//IIC时钟线。
    uint8_t Brightness=0;//亮度值。
    boolean secondPoint=true;//是否显示秒点。(实际就是LED1的小数点)
    uint8_t displayBuffer[6];//显存。
  protected:
    void init(void){uint8_t index;pinMode(DIO, OUTPUT);pinMode(CLK, OUTPUT);iic_stop();for(index=0;index<6;index++){displayBuffer[index]=0xff;}Brightness=7;writeBuffer();}
    void iic_start(void){digitalWrite(CLK,LOW);delayMicroseconds(TM1637_DELAY_US);digitalWrite(DIO,HIGH);delayMicroseconds(TM1637_DELAY_US);digitalWrite(CLK,HIGH);delayMicroseconds(TM1637_DELAY_US);digitalWrite(DIO, LOW);delayMicroseconds(TM1637_DELAY_US);}
    void iic_stop(void){ digitalWrite(CLK,LOW);delayMicroseconds(TM1637_DELAY_US);digitalWrite(DIO, LOW);delayMicroseconds(TM1637_DELAY_US);digitalWrite(CLK,HIGH);delayMicroseconds(TM1637_DELAY_US);digitalWrite(DIO,HIGH);delayMicroseconds(TM1637_DELAY_US);}
    void iic_waitACK(void){uint16_t Index;digitalWrite(CLK, LOW);delayMicroseconds(TM1637_DELAY_US);digitalWrite(DIO, HIGH);for(Index=0;Index<10;Index++){if(!digitalRead(DIO)){break;}delayMicroseconds(TM1637_DELAY_US);}digitalWrite(CLK,HIGH);delayMicroseconds(TM1637_DELAY_US);digitalWrite(CLK,LOW);delayMicroseconds(TM1637_DELAY_US);}
    void iic_writeByte(uint8_t InData){uint8_t Index;for(Index=0;Index<8;Index++){digitalWrite(CLK, LOW);delayMicroseconds(TM1637_DELAY_US);if(InData&0x01){digitalWrite(DIO, HIGH);}else{digitalWrite(DIO, LOW);}delayMicroseconds(TM1637_DELAY_US);digitalWrite(CLK, HIGH);delayMicroseconds(TM1637_DELAY_US);delayMicroseconds(TM1637_DELAY_US);InData=InData>>1;}digitalWrite(CLK, LOW);delayMicroseconds(TM1637_DELAY_US);}
    void writeBuffer(void){uint8_t Index;iic_start();iic_writeByte(0x40);iic_waitACK();iic_stop();iic_start();iic_writeByte(0xc0);iic_waitACK();for(Index=0;Index<6;Index++){if(secondPoint==true && Index==1){iic_writeByte(displayBuffer[Index]|0x80);}else{iic_writeByte(displayBuffer[Index]);}iic_waitACK();}iic_stop();iic_start();iic_writeByte(Brightness&0x07|0x88);iic_waitACK();iic_stop();}

  public:
    TM1637(void){;}
    TM1637(uint8_t In_DIO,uint8_t In_CLK){DIO=In_DIO;CLK=In_CLK;}
    void begin(void){init();}
    void begin(uint8_t In_DIO,uint8_t In_CLK){DIO=In_DIO;CLK=In_CLK;begin();}
    uint8_t read(uint8_t Address){if(Address>=6){return 0;}else{return displayBuffer[Address];}}
    uint8_t write(uint8_t Address,uint8_t Data){if(Address>=6||Data>=16){return 1;}displayBuffer[Address]=displayChar[Data];writeBuffer();return 0;}//写显存(00H~05H)。成功返回0,失败返回1。
    uint8_t brightness(uint8_t In_Data){if(In_Data>7){Brightness=7;}else{Brightness=In_Data;}writeBuffer();return Brightness;}//设置亮度(0~7)。
    uint8_t brightness(void){return Brightness;}//获取亮度值。
    void point(void){secondPoint=!secondPoint;writeBuffer();}//改变秒点显示状态。
    void point(boolean In_secondPoint){secondPoint=In_secondPoint;writeBuffer();}//显示(熄灭)秒点。
    void point(int In_secondPoint){if(In_secondPoint==0){secondPoint=false;}else{secondPoint=true;}writeBuffer();}//显示(熄灭)秒点。
};
#endif

主程序文件:TM1637.INO(演示数码管显示,秒点闪烁,亮度调节)

#include "TM1637.C"
TM1637 LED_FOR;
void setup() {
  LED_FOR.begin(26,27);//初始化,设置IIC通信引脚.
  LED_FOR.brightness(7);//LED亮度最大.
}

void loop() {
  uint8_t index;
  uint16_t TemNum;
  TemNum=millis();
  if(TemNum%1000<500){LED_FOR.point(true);}else{LED_FOR.point(false);}//秒点闪烁.
  for(index=0;index<4;index++){
    TemNum=TemNum/10;
    LED_FOR.write(index,TemNum%10);//显示四位数字.
  }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟渔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值