P0.0,0.1,0.2接三个按键,调节时间.
采用24小时制*********************************/
#include
#define uchar unsigned char
#define uint unsigned int
#define off 0
#define on 1
uchar SEC,MIN,HOUR,DIGIT,FLASH; //秒,分,时,位
uint COUN; //4ms计数器,250次为1s
sbit P37=P3^7; //显示秒的I/O口
sbit P17=P1^7;
uchar data paragraph[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-10数字
/****************************************************************************************
定时器0的中断程序**/
void t0(void)interrupt 1 using 1
{TH0=0x4c;
TL0=0x00;
COUN=COUN+1; //计数器20ms加1,一直加50次到1s
if(COUN==20) //如果COUN到250
{COUN=off; //则清0
//FLASH=!FLASH; //秒取反
SEC=SEC+1;} //秒加1
if(SEC==60) //如果秒到60
{SEC=off; //则清0
MIN=MIN+1;} //秒进位后分加1
if(MIN==60) //如果分到60
{MIN=off; //则清0
HOUR=HOUR+1;} //分进位后时加1
if(HOUR==24) //如果时到24
{HOUR=off;} //时清0,一天到重新
}
/*****************************************************************************************
毫秒延时程序**/
void delay(uchar i)
{uchar a,b;
while(i--)
{for(a=0;a<5;a++)
for(b=0;b<100;b++);
}
}
/*****************************************************************************************
显示刷新程序**/
void refurbish(void)
{
P1=paragraph[SEC%10]; //余数送P1
P3=DIGIT; //位左移5
delay(1);
P1=paragraph[SEC/10]; //整数送P1
P3=DIGIT<<1; //位驱动4
delay(1); //延时1ms
P1=paragraph[MIN%10]; //余数送P1
P17=off;
P3=DIGIT<<2; //位左移3
delay(1);
P1=paragraph[MIN/10]; //整数送P1
P3=DIGIT<<3; //位驱动2
delay(1); //延时1ms
P1=paragraph[HOUR%10]; //余数送P1
P17=off;
P3=DIGIT<<4; //位左移1
delay(1);
P1=paragraph[HOUR/10]; //整数送P1
P3=DIGIT<<5; //位驱动
delay(1);
}
//*****************************************************************************************
//主程序
void main(void)
{P1=0xff;
P3=0xff;
DIGIT=0X01; //位选择
TMOD=0X01; //定时器T0开作于模试1(16位计数器)
TH0=0x4c;
TL0=0x00;
SEC=off; //秒清0
MIN=off; //分清0
HOUR=off; //时清0
COUN=off; //20ms计数器
TR0=on; //打开定时器0
EA=on; //打开总中断
ET0=on; //打开T0中断
while(1)
refurbish();
}