TM1637驱动数码管.docx

上传人:b****5 文档编号:7283285 上传时间:2023-01-22 格式:DOCX 页数:13 大小:407.43KB
下载 相关 举报
TM1637驱动数码管.docx_第1页
第1页 / 共13页
TM1637驱动数码管.docx_第2页
第2页 / 共13页
TM1637驱动数码管.docx_第3页
第3页 / 共13页
TM1637驱动数码管.docx_第4页
第4页 / 共13页
TM1637驱动数码管.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

TM1637驱动数码管.docx

《TM1637驱动数码管.docx》由会员分享,可在线阅读,更多相关《TM1637驱动数码管.docx(13页珍藏版)》请在冰豆网上搜索。

TM1637驱动数码管.docx

TM1637驱动数码管

TM1637是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU数字接口,数据锁存器,LED高压驱动,键盘扫描等电路。

采用功率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

sbitCLK=P0^0;//时钟信号

sbitDIO=P0^1;//数据/地址数据

//共阴极数码管

unsignedcharcodeSEGData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1-9

unsignedcharcodeSEGDataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//有小数点只用于地址0xc1

unsignedchardpFlag=0;//控制第二个数码管的dp的显示

voidTM1637_start(void);

voidTM1637_stop(void);

voidTM1637_write1Bit(unsignedcharmBit);

voidTM1637_write1Byte(unsignedcharmByte);

voidTM1637_writeCammand(unsignedcharmData);

voidTM1637_writeData(unsignedcharaddr,unsignedcharmData);

voidtime_set(charhour,charmin);

voidtime_judge(void);

voidtime_display(void);

voidtimer0_init(void);

voiddelay_140us(void);

voiddelay_1ms(unsignedinti);

unsignedintcountTime=0;

unsignedchartime,sec;

struct{

charshi;

charge;

}Hour;

struct{

charshi;

charge;

}Min;

/***********************************************************

*****

*****主函数

*****

***********************************************************/

voidmain(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();

}

}

}

/********************************************************************

*名称:

voidtime_set(charhour,charmin)

*功能:

设置时间

*输入:

charhour,charmin

*输出:

**************************************************************/

voidtime_set(charhour,charmin)

{

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

*输出:

**************************************************************/

voidtime_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<=-1))

{

Min.ge=0;

}

}

}

/********************************************************************

*名称:

voidtime_display(void)

*功能:

显示时间

*输入:

void

*输出:

**************************************************************/

voidtime_display(void)

{

TM1637_writeCammand(0x44);

TM1637_writeData(0xc0,SEGData[Hour.shi]);

if(dpFlag)

TM1637_writeData(0xc1,SEGDataDp[Hour.ge]);//小数点标志为1则用小数点那个数组

else

TM1637_writeData(0xc1,SEGData[Hour.ge]);

TM1637_writeData(0xc2,SEGData[Min.shi]);

TM1637_writeData(0xc3,SEGData[Min.ge]);

TM1637_writeCammand(0x8a);

}

/********************************************************************

*名称:

voidTM1637_start(void)

*功能:

start信号

*输入:

void

*输出:

**************************************************************/

voidTM1637_start(void)

{

CLK=1;

DIO=1;

delay_140us();

DIO=0;

delay_140us();

CLK=0;

delay_140us();

}

/********************************************************************

*名称:

voidTM1637_stop(void)

*功能:

stop信号

*输入:

void

*输出:

**************************************************************/

voidTM1637_stop(void)

{

CLK=0;

delay_140us();

DIO=0;

delay_140us();

CLK=1;

delay_140us();

DIO=1;

delay_140us();

}

/********************************************************************

*名称:

voidTM1637_write1Bit(unsignedcharmBit)

*功能:

写1bit

*输入:

unsignedcharmBit

*输出:

**************************************************************/

voidTM1637_write1Bit(unsignedcharmBit)

{

CLK=0;

delay_140us();

if(mBit)

DIO=1;

else

DIO=0;

delay_140us();

CLK=1;

delay_140us();

}

/********************************************************************

*名称:

voidTM1637_write1Byte(unsignedcharmByte)

*功能:

写1byte

*输入:

unsignedcharmByte

*输出:

**************************************************************/

voidTM1637_write1Byte(unsignedcharmByte)

{

charloop=0;

for(loop=0;loop<8;loop++)

{

TM1637_write1Bit((mByte>>loop)&0x01);//取得最低位

}

CLK=0;

delay_140us();

DIO=1;

delay_140us();

CLK=1;

delay_140us();

while(DIO==1);//获得应答位

}

/********************************************************************

*名称:

voidTM1637_writeCammand(unsignedcharmData)

*功能:

写指令1byte

*输入:

unsignedcharmData

*输出:

**************************************************************/

voidTM1637_writeCammand(unsignedcharmData)

{

TM1637_start();

TM1637_write1Byte(mData);//数据

TM1637_stop();

}

/********************************************************************

*名称:

voidTM1637_writeData(unsignedcharaddr,unsignedcharmData)

*功能:

固定地址写数据1byte

*输入:

unsignedcharaddr,unsignedcharmData

*输出:

**************************************************************/

voidTM1637_writeData(unsignedcharaddr,unsignedcharmData)

{

TM1637_start();

TM1637_write1Byte(addr);//地址

TM1637_write1Byte(mData);//数据

TM1637_stop();

}

/********************************************************************

*名称:

voidtimer0_init()

*功能:

定时50ms,实际运行中由于指令运行造成的延时,实际时间肯定大于50ms

*输入:

*输出:

**************************************************************/

voidtimer0_init(void)

{

TMOD=0X01;

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

ET0=1;

EA=1;

TR0=1;

}

 

/********************************************************************

*名称:

*功能:

定时50ms,实际运行中由于指令运行造成的延时,实际时间肯定大于50ms

*输入:

*输出:

**************************************************************/

voidtimer0_isr()interrupt1

{

TH0=(65535-50000)/256;//50ms

TL0=(65535-50000)%256;//

countTime++;

}

 

/********************************************************************

*名称:

Delay_1ms(unsignedinti)

*功能:

延时子程序,延时时间为140us

*输入:

*输出:

**************************************************************/

voiddelay_140us(void)

{

inti;

for(i=0;i<20;i++)

_nop_();

}

/********************************************************************

*名称:

Delay_1ms(unsignedinti)

*功能:

延时子程序,延时时间为1ms*x

*输入:

x(延时一毫秒的个数)

*输出:

***********************************************************************/

/*

voidDelay_1ms(unsignedinti)//1ms延时

{

unsignedcharx,j;

for(j=0;j

for(x=0;x<=148;x++);

}

*/

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 药学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1