#include <REGX51.H>
#include "delay.h"
#include "lcd1602.h"
#include "string.h"
#include "stdio.h"
#include "menu.h"
void Timer0_Init(void);
void LCDShowService();
void EXT_Init();
unsigned char sec,min,hour;
unsigned char state =0;
void main()
{
EXT_Init();
Timer0_Init();
LCD_Init();
DelayXms(10);
StartMenu();
DelayXms(2000);
LCD_WriteCmd(LCD_SCREEN_CLR);
while(1)
{
LCD_ShowStr(0,0," Current Time");
LCDShowService();
}
}
void LCDShowService()
{
switch(state)
{
case 0:TR0 = 1;LCD_ShowHour();LCD_ShowMin();LCD_ShowSEC();break;
case 1:LCD_ShowSEC();break;
case 2:LCD_ShowMin();break;
case 3:LCD_ShowHour();break;
}
}
void Timer0_Isr(void) interrupt 1
{
static unsigned int timer0Cnt=0;
TR0 = 0;
timer0Cnt++;
if(timer0Cnt >=1000)
{
timer0Cnt =0;
sec++;
if(sec>=60)
{
sec = 0;
min++;
}
if(min>=60)
{
min =0;
hour++;
}
if(hour >=24)
{
hour =0;
}
}
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TR0 = 1;
}
void Timer0_Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
//TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
void EXT_Init()
{
IT0 = 1; //下降触发方式 INT0
IT1 = 1; //下降触发方式 INT1
EX0 = 1;
EX1 = 1;
}
void EXT0_ISR() interrupt 0
{
TR0 = 0;
state++;
if(state >3) //stae 1调秒 2分 3时
{
state = 0;
}
}
void EXT1_ISR() interrupt 2
{
switch(state)
{
case 1:sec++;if(sec>=60)sec=0;break;
case 2:min++;if(min>=60)min=0;break;
case 3:hour++;if(hour>=24)hour=0;break;
default:break;
}
}
51Proteus仿真LCD1602+定时计数器实现可调电子时钟的编程
于 2024-09-18 19:21:11 首次发布