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]