/*main.c源程序*/
#include <reg52.h>
#include "E2ROM.c"
#include "key.c"
sfr WDT_CONTR = 0xE1;//定义STC单片机中新加入的看门狗寄存器
code uchar seven_seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管0--9(0时为有效断)
code uchar scan_bit[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf}; //数码管位选 6 5 4 3 2 1
uchar cp1 = 0;
uchar cp2 = 0;
uchar j = 0; //控制数码管的位选
uchar flash = 0; //控制小数点闪烁
/*延时函数*/
void delayms(uint ms)
{
uint i, j;
for(i = ms; i > 0; i--)//i = ms 即延时约ms毫秒
{
for(j = 110; j > 0; j--);
}
}
/***********************中断初始化函数**********************/
void timer0_init(void)
{
TMOD = 0x01; //中断方式1
TH0 = 0xf8;
TL0 = 0x2f; //对机器脉冲计数,2000个计满溢出引发中断
EA = 1; //开总中断
ET0 = 1; //开T0中断
TR0 = 1; //启动定时器T0
}
/*******************Timer0中断服务函数**********************/
void timer0_isr(void) interrupt 1
{
TH0 = 0xf8; //重新附初值
TL0 = 0x2f; //重新附初值
cp1++;
if(cp1 >= 250)//半秒
{
cp1 = 0;
cp2++;
flash = ~flash; //每半秒取反一次
}
if(cp2 >= 2)//一秒
{
cp2 = 0;
sec++;
SectorErase(0x2000); //擦除第一扇区
byte_write(0x2000, sec); //重新写入数据
}
if(sec >= 60)//当秒为60时分钟开始计数
{
sec = 0;
min++;
SectorErase(0x2200); //擦除第二扇区
byte_write(0x2200, min); //重新写入数据
}
if(min >= 60)//当分钟为60时小时开始计数
{
min = 0;
hour++;
SectorErase(0x2400); //擦除第三扇区
byte_write(0x2400, hour); //重新写入数据
}
if(hour >= 24)
{
hour = 0; //当小时大于24时小时赋值为0
}
P0 = 0xff; //Protues仿真需要消隐
//显示正在走时间
if(key_flag == 0)
{
switch(j)
{
case 0 : P0 = seven_seg[sec % 10]; break;
case 1 : P0 = seven_seg[sec / 10]; break;
case 2 : P0 = seven_seg[min % 10] & (0x7f | flash); break;
case 3 : P0 = seven_seg[min / 10]; break;
case 4 : P0 = seven_seg[hour % 10] & (0x7f | flash);break;
case 5 : P0 = seven_seg[hour / 10]; break;
}
}
//显示调整的小时
if(key_flag == 1)
{
switch(j)
{
case 0 : P0 = seven_seg[time[2] % 10]; break;
case 1 : P0 = seven_seg[time[2] / 10]; break;
case 2 : P0 = seven_seg[time[1] % 10] & 0x7f; break;
case 3 : P0 = seven_seg[time[1] / 10]; break;
case 4 : P0 = seven_seg[time[0] % 10] & 0x7f | flash; break;
case 5 : P0 = seven_seg[time[0] / 10] | flash; break;
}
}
//显示调整的分钟
if(key_flag == 2)
{
switch(j)
{
case 0 : P0 = seven_seg[time[2] % 10]; break;
case 1 : P0 = seven_seg[time[2] / 10]; break;
case 2 : P0 = seven_seg[time[1] % 10] & 0x7f | flash; break;
case 3 : P0 = seven_seg[time[1] / 10] | flash; break;
case 4 : P0 = seven_seg[time[0] % 10] & 0x7f; break;
case 5 : P0 = seven_seg[time[0] / 10]; break;
}
}
//显示调整的秒
if(key_flag == 3)
{
switch(j)
{
case 0 : P0 =
#include "E2ROM.c"
#include "key.c"
sfr WDT_CONTR = 0xE1;//定义STC单片机中新加入的看门狗寄存器
code uchar seven_seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管0--9(0时为有效断)
code uchar scan_bit[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf}; //数码管位选 6 5 4 3 2 1
uchar cp1 = 0;
uchar cp2 = 0;
uchar j = 0; //控制数码管的位选
uchar flash = 0; //控制小数点闪烁
/*延时函数*/
void delayms(uint ms)
{
uint i, j;
for(i = ms; i > 0; i--)//i = ms 即延时约ms毫秒
{
for(j = 110; j > 0; j--);
}
}
/***********************中断初始化函数**********************/
void timer0_init(void)
{
TMOD = 0x01; //中断方式1
TH0 = 0xf8;
TL0 = 0x2f; //对机器脉冲计数,2000个计满溢出引发中断
EA = 1; //开总中断
ET0 = 1; //开T0中断
TR0 = 1; //启动定时器T0
}
/*******************Timer0中断服务函数**********************/
void timer0_isr(void) interrupt 1
{
TH0 = 0xf8; //重新附初值
TL0 = 0x2f; //重新附初值
cp1++;
if(cp1 >= 250)//半秒
{
cp1 = 0;
cp2++;
flash = ~flash; //每半秒取反一次
}
if(cp2 >= 2)//一秒
{
cp2 = 0;
sec++;
SectorErase(0x2000); //擦除第一扇区
byte_write(0x2000, sec); //重新写入数据
}
if(sec >= 60)//当秒为60时分钟开始计数
{
sec = 0;
min++;
SectorErase(0x2200); //擦除第二扇区
byte_write(0x2200, min); //重新写入数据
}
if(min >= 60)//当分钟为60时小时开始计数
{
min = 0;
hour++;
SectorErase(0x2400); //擦除第三扇区
byte_write(0x2400, hour); //重新写入数据
}
if(hour >= 24)
{
hour = 0; //当小时大于24时小时赋值为0
}
P0 = 0xff; //Protues仿真需要消隐
//显示正在走时间
if(key_flag == 0)
{
switch(j)
{
case 0 : P0 = seven_seg[sec % 10]; break;
case 1 : P0 = seven_seg[sec / 10]; break;
case 2 : P0 = seven_seg[min % 10] & (0x7f | flash); break;
case 3 : P0 = seven_seg[min / 10]; break;
case 4 : P0 = seven_seg[hour % 10] & (0x7f | flash);break;
case 5 : P0 = seven_seg[hour / 10]; break;
}
}
//显示调整的小时
if(key_flag == 1)
{
switch(j)
{
case 0 : P0 = seven_seg[time[2] % 10]; break;
case 1 : P0 = seven_seg[time[2] / 10]; break;
case 2 : P0 = seven_seg[time[1] % 10] & 0x7f; break;
case 3 : P0 = seven_seg[time[1] / 10]; break;
case 4 : P0 = seven_seg[time[0] % 10] & 0x7f | flash; break;
case 5 : P0 = seven_seg[time[0] / 10] | flash; break;
}
}
//显示调整的分钟
if(key_flag == 2)
{
switch(j)
{
case 0 : P0 = seven_seg[time[2] % 10]; break;
case 1 : P0 = seven_seg[time[2] / 10]; break;
case 2 : P0 = seven_seg[time[1] % 10] & 0x7f | flash; break;
case 3 : P0 = seven_seg[time[1] / 10] | flash; break;
case 4 : P0 = seven_seg[time[0] % 10] & 0x7f; break;
case 5 : P0 = seven_seg[time[0] / 10]; break;
}
}
//显示调整的秒
if(key_flag == 3)
{
switch(j)
{
case 0 : P0 =