GPIO 发表于 2020-6-20 21:28:48

STC-Y3单片机TM1637驱动4位数码管模块程序C51源码 (演示4位16进制累加+冒号1HZ闪烁)



/*
STC-Y3测试通过 晶振频率:12Mhz
*/
#include "reg51.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int


u8 code nbr = {        //共阴数码管段码数据 0-F dp-a
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
void DelayUs(u16 i){        //微秒延时
      for(;i>0;i--)
                _nop_();
}
//========== TM1637 驱动程序开始 ========
sbit TM1637_CLK        = P3^4;   //TM1637时钟线
sbit TM1637_DIO = P3^5;   //TM1637数据线


void TM1637_start(){        //IIC开始
         TM1637_CLK=1;
         TM1637_DIO=1;
         DelayUs(2);
         TM1637_DIO=0;
}

void TM1637_ack() {        //IIC应答
      u8 i;
      TM1637_CLK=0;
      DelayUs(5);
      while(TM1637_DIO==1&&(i<250))i++;
      TM1637_CLK=1;
      DelayUs(2);
      TM1637_CLK=0;
}

void TM1637_stop(){        //IIC停止
         TM1637_CLK=0;
         DelayUs(2);
         TM1637_DIO=0;
         DelayUs(2);
         TM1637_CLK=1;
         DelayUs(2);
         TM1637_DIO=1;
         DelayUs(2);
}

void TM1637_Write(u8 d){        //TM1637写数据函数
      u8 i;   
      for(i=0;i<8;i++){
                TM1637_CLK=0;
                TM1637_DIO = d & 0x01 ? 1 : 0;
                DelayUs(3);
                d>>=1;   
                TM1637_CLK=1;
                DelayUs(3);
      }
}
/*
//向TM1637发送数码管段码数据
        参数1:千位 参数2:百位
        参数3:十位 参数4:个位
        参数5:显示冒号 (1显示0不显示)
*/
void TM1637_display(u8 a,u8 b,u8 c,u8 d,bit h){
      TM1637_start();
      TM1637_Write(0x40);//写数据+自动地址加1+普通模式
      TM1637_ack();
      TM1637_stop();
      TM1637_start();
      TM1637_Write(0xc0);//设置显示首地址即第一个LED
      TM1637_ack();

      TM1637_Write(a);
      TM1637_ack();
      TM1637_Write(b|(u8)h<<7);
      TM1637_ack();
      TM1637_Write(c);
      TM1637_ack();
      TM1637_Write(d);
      TM1637_ack();

      TM1637_stop();
      TM1637_start();
      TM1637_Write(0x8F);//开显示(最大亮度)
      TM1637_ack();
      TM1637_stop();
}
/*
向TM1637发送16进制数字
        参数1:16进制数字
        参数2:显示冒号 (1显示0不显示)
*/
void TM1637_dec(u16 hex,bit h){               
        TM1637_display(nbr[(hex>>12)&0xF],nbr[(hex>>8)&0xF],nbr[(hex>>4)&0xF],nbr,h);

}


//========== TM1637 驱动程序结束 ========

void Delay100ms()                //100毫秒延时
{
        unsigned char i, j, k;

        i = 5;
        j = 144;
        k = 71;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

sfr AUXR   = 0x8E;

void InitTimer0(){        //初始化定时器0 (用于1HZ闪烁冒号)
    TMOD = 0x01;
    TH0 = 0x15;
    TL0 = 0xA0;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
u16 i=0;        //16进制累加计数
u8 ms5=0;        //5毫秒定时器中断次数计数
bit colon=0;        //冒号显示状态

void main(){                //入口函数
AUXR = AUXR|0x80;
InitTimer0();
        while(1){
        TM1637_dec(i++,colon);
        Delay100ms();
}
}


void Timer0Interrupt() interrupt 1 {        //5毫秒定时器中断
    TH0 = 0x15;
    TL0 = 0xA0;

        if(++ms5 == 100) {
        ms5 = 0;
        colon =! colon;
        }
}
页: [1]
查看完整版本: STC-Y3单片机TM1637驱动4位数码管模块程序C51源码 (演示4位16进制累加+冒号1HZ闪烁)