/*
*单片机型号: AT89S52
*开发环境: Keil uVision3
*晶震频率: 12M
*功能: TM1637做时钟显示,可以由按键控制数码屏显示0-9
*/
#include<reg52.h>
#include<intrins.h>
#include<TM1637.h>
#define uchar unsigned char
#define uint unsigned int
uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar CODEDP[10] = {0x00,0x00,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar show_LED[6],key;
uchar TIME_count;
uchar TIME_seconds,seconds_2,sub_1,sub_2; //时间寄存器,依次从秒个位至分十位
/**********************************
定时中断函数入口
功能: 每50MS中断一次
**********************************/
void time0(void) interrupt 1 using 2
{
TH0=0x3c;
TL0=0xb0;
TIME_count++;
if(TIME_count==20)
{
TIME_count = 0;
TIME_seconds++; // 秒寄存器加1
}
}
/*********************************
时钟函数
功能: 处理时钟显示
**********************************/
void TIME_show()
{
show_LED[3] = CODEDP[TIME_seconds];// 数码屏上最后一个“8”字,依次下去
show_LED[2] = CODEDP[seconds_2]; //数码屏倒数第二个“8”字,
show_LED[1] = CODEDP[sub_1];
show_LED[0] = CODEDP[sub_2];
if(TIME_seconds == 10) //对时间数据进行处理,以免溢出。
{
TIME_seconds = 0;
seconds_2+=1;
}
if(seconds_2 == 6)
{
seconds_2 = 0;
sub_1 +=1;
}
if(sub_1 == 10)
{
sub_1 = 0;
sub_2 +=1;
}
if(sub_2 == 6)
{
sub_2 = 0;
sub_1 = 0;
seconds_2 = 0;
}
}
/*********************************
延时函数
功能: 1ms延时
**********************************/
void delay_ms(uchar cyc)
{
//cyc=1的时候,延时1ms
uchar ii,jj;
for(jj=1;jj<=cyc;jj++)
{
for(ii=0;ii<200;ii++)
{
nop;
}
}
}
//----------主函数-----------------
void main()
{
P1=0xff;//初始化单片机I/O口
TH0=0x3c;
TL0=0xb0;
TMOD=0x01; //定时器设置
IE=0x82;
EA=1;
ET0=1;
TR0=1;
while(1)//循环
{
key=readkey();
if (key !=255) show_LED[5] = CODE[key];
TIME_show();
showled(show_LED);
delay_ms(50);
}
}