TM1637驱动数码管Word格式文档下载.docx
《TM1637驱动数码管Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《TM1637驱动数码管Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
#include<
intrins.h>
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;
}Min;
/***********************************************************
*****
*****主函数
***********************************************************/
voidmain(void)
{
timer0_init();
time_set(5,0);
//设置5小时倒计时
while
(1)
{
time_display();
//显示时间
if(countTime<
=10)
{
dpFlag=0;
}
else
=20)
dpFlag=1;
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<
{
Min.shi=5;
if(Hour.shi&
(--Hour.ge<
{
Hour.ge=9;
if(--Hour.shi<
=-1)
{
Hour.shi=0;
}
}
else
if((!
Hour.shi)&
Hour.ge=0;
}
else
if((!
(!
Hour.ge)&
Min.shi=0;
if(((!
Min.shi))&
(Min.ge<
Min.ge=0;
}
voidtime_display(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信号
voidTM1637_start(void)
CLK=1;
DIO=1;
delay_140us();
DIO=0;
CLK=0;
voidTM1637_stop(void)
stop信号
voidTM1637_stop(void)
voidTM1637_write1Bit(unsignedcharmBit)
写1bit
unsignedcharmBit
voidTM1637_write1Bit(unsignedcharmBit)
if(mBit)
DIO=1;
DIO=0;
voidTM1637_write1Byte(unsignedcharmByte)
写1byte
unsignedcharmByte
voidTM1637_write1Byte(unsignedcharmByte)
charloop=0;
for(loop=0;
loop<
8;
loop++)
TM1637_write1Bit((mByte>
>
loop)&
0x01);
//取得最低位
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_write1Byte(addr);
//地址
voidtimer0_init()
定时50ms,实际运行中由于指令运行造成的延时,实际时间肯定大于50ms
voidtimer0_init(void)
TMOD=0X01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
voidtimer0_isr()interrupt1
//50ms
//
countTime++;
Delay_1ms(unsignedinti)
延时子程序,延时时间为140us
voiddelay_140us(void)
inti;
for(i=0;
i<
20;
i++)
_nop_();
延时子程序,延时时间为1ms*x
x(延时一毫秒的个数)
***********************************************************************/
/*
voidDelay_1ms(unsignedinti)//1ms延时
unsignedcharx,j;
for(j=0;
j<
i;
j++)
for(x=0;
x<
=148;
x++);
*/