tm1637驱动数码管程序

采用功率cmos工艺,显示模式(8段×6位),支持共阳数码管输出,键扫描(8×2bit),增强型抗干扰按键识别电路,辉度调节电路(占空比8级可调),两线串行接口(clk,dio),振荡方式:内置rc振荡(450khz+-5%),内置上电复位电路,内置自动消隐电路。
引脚功能:
当传输数据时,当scl高电平时,dio由高变低则代表开始信号,当scl高电平时,dio由低变高则代表停止信号,只有当scl低电平时dio上的数据才可以发生改变,在scl高电平时dio上的数据要保持不变,此时数据发送出去,当正确传输8位数据后tm1637会第九个时钟在dio管脚上给出一个ack信号,把dio拉低。传输时序类似于i2c通信。传输数据是低位在前高位在后。
传输过程:
下面仅是数码管驱动程序:
驱动的下面这种数码管,普通也行,只是看不到1s的闪烁效果。
/*******************************
**** describe: tm1673控制芯片,可以设置时间的倒计时(定时不准,可以自己校准),四个数码管0xc0,0xc1,0xc2,0xc3
**** time: 2015.05.14
**** author: zys
********************************/
#include
#include
sbit clk = p0^0; //时钟信号
sbit dio = p0^1; //数据/地址数据
//共阴极数码管
unsigned char code segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1-9
unsigned char code segdatadp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小数点只用于地址0xc1
unsigned char dpflag = 0; //控制第二个数码管的dp的显示
void tm1637_start( void );
void tm1637_stop( void );
void tm1637_write1bit(unsigned char mbit);
void tm1637_write1byte(unsigned char mbyte);
void tm1637_writecammand(unsigned char mdata);
void tm1637_writedata(unsigned char addr, unsigned char mdata);
void time_set(char hour, char min);
void time_judge( void );
void time_display( void );
void timer0_init( void );
void delay_140us( void );
void delay_1ms(unsigned int i);
unsigned int counttime = 0;
unsigned char time, sec;
struct {
char shi;
char ge;
}hour;
struct {
char shi;
char ge;
}min;
/***********************************************************
*****
***** 主函数
*****
***********************************************************/
void main( void )
{
timer0_init();
time_set(5, 0); //设置5小时倒计时
while(1)
{
time_display(); //显示时间
if(counttime <= 10)
{
dpflag = 0;
}
else
if(counttime <= 20)
{
dpflag = 1;
}
else
{
counttime = 0;
time_judge();
}
}
}
/********************************************************************
* 名称 : void time_set(char hour, char min)
* 功能 : 设置时间
* 输入 : char hour, char min
* 输出 : 无
**************************************************************/
void time_set(char hour, char min)
{
if((hour < 0) || (min<0))
{
hour = 0;
min = 0;
}
hour.shi = hour/10;
hour.ge = hour%10;
min.shi = min/10;
min.ge = min%10;
}
/*************************************************************
* 名称 : time_judge( void )
* 功能 : 判断时间变化
* 输入 : void
* 输出 : 无
**************************************************************/
void time_judge( void )
{
if(++sec == 60) //60秒
{
sec = 0;
if((hour.shi || hour.ge || min.shi || min.ge) && (--min.ge <= -1))
{
min.ge = 9;
if((hour.shi) ||(hour.ge) && (--min.shi <= -1))
{
min.shi = 5;
if(hour.shi && (--hour.ge <= -1))
{
hour.ge = 9;
if(--hour.shi <= -1)
{
hour.shi = 0;
}
}
else
if((!hour.shi) && (--hour.ge <= -1))
{
hour.ge = 0;
}
}
else
if((!hour.shi) && (!hour.ge) && (--min.shi <= -1))
{
min.shi = 0;
}
}
else
if(((!hour.shi) && (!hour.ge) && (!min.shi) ) && (min.ge loop)&0x01); //取得最低位
}
clk = 0;
delay_140us();
dio = 1;
delay_140us();
clk = 1;
delay_140us();
while(dio == 1); //获得应答位
}
/********************************************************************
* 名称 : void tm1637_writecammand(unsigned char mdata)
* 功能 : 写指令1byte
* 输入 : unsigned char mdata
* 输出 : 无
**************************************************************/
void tm1637_writecammand(unsigned char mdata)
{
tm1637_start();
tm1637_write1byte(mdata); //数据
tm1637_stop();
}
/********************************************************************
* 名称 : void tm1637_writedata(unsigned char addr, unsigned char mdata)
* 功能 : 固定地址写数据1byte
* 输入 : unsigned char addr, unsigned char mdata
* 输出 : 无
**************************************************************/
void tm1637_writedata(unsigned char addr, unsigned char mdata)
{
tm1637_start();
tm1637_write1byte(addr); //地址
tm1637_write1byte(mdata); //数据
tm1637_stop();
}
/********************************************************************
* 名称 : void timer0_init()
* 功能 : 定时50ms,实际运行中由于指令运行造成的延时,实际时间肯定大于50ms
* 输入 : 无
* 输出 : 无
**************************************************************/
void timer0_init( void )
{
tmod=0x01;
th0=(65535-50000)/256;
tl0=(65535-50000)%256;
et0=1;
ea=1;
tr0=1;
}
/********************************************************************
* 名称 :
* 功能 : 定时50ms,实际运行中由于指令运行造成的延时,实际时间肯定大于50ms
* 输入 : 无
* 输出 : 无
**************************************************************/
void timer0_isr() interrupt 1
{
th0=(65535-50000)/256; //50ms
tl0=(65535-50000)%256;//
counttime++;
}
/********************************************************************
* 名称 : delay_1ms(unsigned int i)
* 功能 : 延时子程序,延时时间为 140us
* 输入 :
* 输出 : 无
**************************************************************/
void delay_140us( void )
{
int i;
for(i=0; i<20; i++)
_nop_();
}
/********************************************************************
* 名称 : delay_1ms(unsigned int i)
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
/*
void delay_1ms(unsigned int i)//1ms延时
{
unsigned char x,j;
for(j=0;j for(x=0;x<=148;x++);
}
*/

解析:扫地机器人现状分析及未来发展趋势
FH511大电流红外遥控+按键换段定时灯串PCBA方案
直线电机模组的运输安装维护注意事项
地下车库空气质量监控系统的组成及安装位置
加密资产钱包和支付宝钱包存在什么差异
tm1637驱动数码管程序
基于GPRS的动车组无线监控系统
kvm切换器让机房管理一切变得简单化
海思电气拓扑AI融合方案提升客户服务保障能力
遥控器背光照明电路原理详解
TI推出业界最佳性能同步集成型电源模块TPS84610
如何实现车载移动多媒体系统的应用设计
常见的共射极放大电路
2018全国科普日拉开帷幕,VR沉浸式体验给大家带来不一样的感受
纳芯微40V车规级多通道半桥驱动NSD830x-Q1,冷风热风掌控自如
智媒的未来是人工智能与机器人的融合
贴片SMT导电硅胶弹片新极限(可替代传统的PCB铍铜弹片)
单片机如何读取4-20ma信号
MYZR-STM32MP157-CB152开发板:让网关更智能,生活更舒适
数据分析外包出去好不好?有什么利弊?