/*************************************************************************** 名称:用定时器定时做时钟 内容,自动从00-00-00开始,有按键功能 芯片型号:STC89C52RC 功能脚说明:P0为段选脚,P3为位选脚,所有引脚低电平有效. 程序员:玄溪 日期:2012.2.6 /***************************************************************************/ #include <reg52.h> #define uchar unsigned char #define uint unsigned int uchar code du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit K1=P1^0; //分+ sbit K2=P1^1; //分- sbit K3=P1^2; //时+ sbit K4=P1^3; //时- uchar time; //定义中断时间次数 uchar second; //定义秒 uchar minute; //定义分 uchar hour; //定义时 //===========延时函数============// void delay() { uchar j; for(j=0;j<200;j++); } //=========显示秒函数=======// void displaysecond(uchar s) //带返回值 { P3=0xbf; P0=du[s/10]; delay(); P3=0x7f; P0=du[s%10]; delay(); P3=0xff; if(K2==0) { s++; if(s==60) { s=0; } } } //========显示分函数=============// void displayminute(uchar m) { P3=0xf7; P0=du[m/10]; delay(); P3=0xef; P0=du[m%10]; delay(); P3=0xdf; P0=0xbf; delay(); P3=0xff; if(!K1) { delay(); if(!K1) { TR0=0; m++; if(m==60) m=0; } } if(!K2) { delay(); if(!K2) { TR0=0; m--; if(m==0) m=59; } } TR0=1; } //========显示时函数==============// void displayhour(uchar h) { P3=0xfe; P0=du[h/10]; delay(); P3=0xfd; P0=du[h%10]; delay(); P3=0xfb; P0=0xbf; delay(); P3=0xff; if(!K3) { delay(); if(!K3) { TR0=0; h++; if(h==24) h=0; } } if(!K4) { TR0=0; delay(); if(!K4) { h--; if(h==0) h=23; } } TR0=1; } //=============主函数============// void main(void) { TMOD=0x01; EA=1; ET0=1; TH0=(65536-46083)/256; //赋初值 TL0=(65536-46083)%256; TR0=1; while(1) { displaysecond(second); delay(); displayminute(minute); delay(); displayhour(hour); delay(); } } //=======定时器中断子函数=================// void inter0()interrupt 1 { time++; if(time==20) { time=0; second++; } if(second==60) { second =0; minute++; } if(minute==60) { minute=0; hour++; } if(hour==24) { hour=0; } TH0=(65536-46083)/256; //赋初值 TL0=(65536-46083)%256; }
//=========显示秒函数=======//
void displaysecond(uchar s) //带返回值
{
P3=0xbf;
P0=du[s/10];
delay();
P3=0x7f;
P0=du[s%10];
delay();
P3=0xff;
if(K2==0)
{
s++;
if(s==60)
{
s=0;
}
}
}
你把上面程序的两部分交换下试试. 不过整个程序布局不是很好,显得有些冗乱.
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |