dateandtime.c
来自「本源程序是基于AT89C51单片机的」· C语言 代码 · 共 566 行 · 第 1/2 页
C
566 行
if(key==3) day-- ; //如果按下的是减1 键(3号键),日减1
if(day==0) //日下限循环
day=days-1 ;
CharToStr(day) ; //将校正后的日数据转换成相对应的ASCII码
Delay1ms(50) ; //延时100ms
LCD_Print(DATA) ; //日显示刷新
goto Day_set ; //日校正循环
Week_set: LCD_GoToXY(12,1) ; //星期调整
key=Key_Scan() ; //键盘扫描
if(key==1) goto Hour_set ; //如果按下的是功能键(1号键),转时校正
if(key==2) week++ ; //如果按下的是加1 键(2号键),星期加1
if(week==8) //星期上限循环
week=1 ;
if(key==3) week-- ; //如果按下的是减1 键(3号键),星期减1
if(week==0) //星期下限循环
week=7 ;
WeekToStr(week) ; //将校正后的星期数据转换成相对应的ASCII码
Delay1ms(50) ; //延时100ms
LCD_GoToXY(12,1) ; //定位到星期在LCD屏上的显示位置
LCD_Print(Week_Str) ; //星期显示刷新
goto Week_set ; //日和星期校正循环
Hour_set: LCD_GoToXY(0,2) ; //时校正
key=Key_Scan() ; //键盘扫描
if(key==1) goto Minute_set ; //如果按下的是功能键(1号键),转分校正
if(key==2) hour++ ; //如果按下的是加1 键(2号键),时加1
if(hour==24) //时上限循环
hour=0 ;
if(key==3) hour-- ; //如果按下的是减1 键(3号键),时减1
if(hour==-1) //时下限循环
hour=23 ;
CharToStr(hour) ; //将校正后的时数据转换成相对应的ASCII码
Delay1ms(50) ; //延时100ms
LCD_Print(DATA) ; //时显示刷新
goto Hour_set ; //时校正循环
Minute_set:LCD_GoToXY(3,2) ; //分校正
key=Key_Scan() ; //键盘扫描
if(key==1) goto RET ; //如果按下的是功能键(1号键),退出校正状态
if(key==2) minute++ ; //如果按下的是加1 键(2号键),分加1
if(minute==60) //分上限循环
minute=0 ;
if(key==3) minute-- ; //如果按下的是减1 键(3号键),分减1
if(minute==-1) //分下限循环
minute=59 ;
CharToStr(minute) ; //将校正后的分数据转换成相对应的ASCII码
Delay1ms(50) ; //延时100ms
LCD_Print(DATA) ; //分显示刷新
goto Minute_set ; //分校正循环
RET: EX1=1 ; //开INT1中断,开始计时
LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH); //关光标,光标不闪烁
}
/***定时器显示或设定****************************************************************/
void Timer_Show_Set(void)
{
unsigned char key ;
unsigned char w=10 ;
bit Timer_set_sin=0 ; //定时器设定标志,为1表示正处于定时器设定状态
Timer_Show_sin=1 ; //表示现在已处于定时器显示状态
LCD_Write(LCD_COM,LCD_CLEAR) ; //清屏
Delay1ms(50);
LCD_Print(" Timer") ; //在显示屏的第一行中间显示“Timer"
CharToStr(Timer_hour) ;
LCD_GoToXY(3,2) ; //定位到显示屏的第二行第四个字符
LCD_Print(DATA) ; //显示定时器的时钟
LCD_Print(":") ; //在定时器的时钟后显示“:”
CharToStr(Timer_minute) ;
LCD_Print(DATA) ; //显示定时器的分钟
LCD_Print(" ") ; //在定时器的分钟后空一格
if(Timer_ON_OFF==1) LCD_Print("1");//如果Timer_ON_OFF=1,则显示1,表示定时开
else
LCD_Print("0") ; //如果Timer_ON_OFF!=1,则显示0,表示定时关
LCD_Print(" ") ; //空一格
CharToStr(Timer_Ring) ; //将歌曲编号转换成相对应的ASCII码
LCD_Print(DATA) ; //显示歌曲编号
while(--w) //在定时器显示状态下,大约在2s内没有按下
{ //功能键,就返回正常显示状态
Delay1ms(100) ;
key=Key_Scan() ;
if(key==1)
{Timer_set_sin=1;break;}
}
if(Timer_set_sin) //如果Timer_set_sim为1,则进入定时器设定状态
{ LCD_ShowMode(LCD_SHOW|LCD_CORSOR|LCD_FLASH); //开光标,光标闪烁
T_hour_set:LCD_GoToXY(3,2) ; //定时器时设定
key=Key_Scan() ; //键盘扫描
if(key==1) goto T_minute_set ;//如果按下的是功能键(1号键),转定时器分设定
if(key==2) Timer_hour++ ; //如果按下的是加1 键(2号键),定时器时加1
if(Timer_hour==24) //时上限循环
Timer_hour=0 ;
if(key==3) Timer_hour-- ; //如果按下的是减1 键(3号键),定时器时减1
if(Timer_hour==-1) //时下限循环
Timer_hour=23 ;
LCD_GoToXY(3,2) ;
CharToStr(Timer_hour) ; //将校正后的定时器时数据转换成相对应的ASCII码
Delay1ms(50) ; //延时100ms
LCD_Print(DATA) ; //定时器时显示刷新
goto T_hour_set ; //定时器时设定循环
T_minute_set:LCD_GoToXY(6,2) ; //定时器分设定
key=Key_Scan() ; //键盘扫描
if(key==1) goto T_ON_OFF ; //如果按下的是功能键(1号键),退出校正状态
if(key==2) Timer_minute++ ; //如果按下的是加1 键(2号键),分加1
if(Timer_minute==60) //分上限循环
Timer_minute=0 ;
if(key==3) Timer_minute-- ; //如果按下的是减1 键(3号键),分减1
if(Timer_minute==-1) //分下限循环
Timer_minute=59 ;
CharToStr(Timer_minute) ; //将校正后的分数据转换成相对应的ASCII码
Delay1ms(50) ; //延时100ms
LCD_Print(DATA) ; //分显示刷新
goto T_minute_set ; //分校正循环
T_ON_OFF: LCD_GoToXY(9,2) ; //定时器开/关设定
key=Key_Scan() ; //键盘扫描
if(key==1) goto T_song_set ; //如果按下的是功能键(1号键),转定时器分校正
if(key==2||key==3)
Timer_ON_OFF=!Timer_ON_OFF ; //按下加1键或减1键,定时器开关标志(Timer_ON_OFF),
//取反,因为它只有开(1)和关(0)两种状态
Delay1ms(50) ; //延时100ms
if(Timer_ON_OFF==1) LCD_Print("1");//如果Timer_ON_OFF=1,则显示1,表示定时开
else LCD_Print("0") ; //如果Timer_ON_OFF=0,则显示0,表示定时关
goto T_ON_OFF ; //定时器开/关设定循环
T_song_set:LCD_GoToXY(11,2) ; //定时器提示铃声设定
key=Key_Scan() ; //键盘扫描
if(key==1) goto T_RET ; //如果按下的是功能键(1号键),退出定时器设定状态
if(key==2) Timer_Ring++ ; //如果按下的是加1 键(2号键),铃声编号加1
if(Timer_Ring==4)
Timer_Ring=1 ;
if(key==3) Timer_Ring-- ; //如果按下的是减1 键(3号键),铃声编号减1
if(Timer_Ring==0)
Timer_Ring=3 ;
CharToStr(Timer_Ring) ; //将铃声编号转换成相对应的ASCII码
Delay1ms(50) ; //延时100ms
LCD_Print(DATA) ; //铃声编号显示刷新
Ring() ;
goto T_song_set ; //定时器提示铃声设定循环
T_RET:Timer_set_sin=0 ; //退出定时器设定状态
LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH); //关光标,光标不闪烁
}
Timer_Show_sin=0 ; //退出定时器显示状态
}
/***主程序**************************************************************************/
void main(void)
{ float i=0; unsigned char keys ;
Delay1ms(250) ;
LCD_Initial() ; //LCD1602初始化
Delay1ms(100) ;
LCD_Print(" Welcome") ; //开机画面
Delay1ms(50) ;
LCD_GoToXY(0,2) ;
LCD_Print(" HangKaiKun") ;
Delay1ms(250) ; //延时250ms
Delay1ms(250) ; //延时250ms
Delay1ms(250) ; //延时250ms
Delay1ms(250) ; //延时250ms
Delay1ms(250) ; //延时250ms
LCD_Write(LCD_COM,LCD_CLEAR) ; //清屏
IT1=1 ; //置INT1为边沿触发模式
IT0=1 ; //置INT0为边沿触发模式
PX1=1 ; //置INT1为高优先级
IE=0x84 ; //INT1开中
while(1)
{keys=Key_Scan() ; //键盘扫描
if(keys==1) //若为功能键,转校时程序
Set_TimeAndDate() ;
if(keys==2) //若为加1 键,转定是显示程序
Timer_Show_Set() ;
if(keys==4&&!Speak_sin) //若为报时键,转语音报时程序
SpeakTime() ;
if(Timer_sin) //判断是否响铃
Ring() ; //是,则转响铃程序
while(Temperature_sin)
{float i ;
i=ReadTemperature() ; //读取温度值
IntToStr(i) ; //将温度值转换成相对应的ASCII码
LCD_GoToXY(9,2) ; //定位到温度显示区
LCD_Print(temp) ; //显示温度
Temperature_sin=0 ; //表示温度处理完毕
}
}
}
/***中断1服务程序(用于完成计时和日历转变和刷新,以及判断定时是否已到)***************/
void int1(void) interrupt 2 using 1
{
second++ ; //秒加1
led_on-- ; //LCD背光时间值减1
if((second%2==0)&&!Timer_sin) //如果不在定时器显示或设计状态,则每隔
Temperature_sin=1 ; //两秒启动一次温度检测
if(led_on==-1) //LCD背光灯亮的时间结束,关闭LCD背光灯
led_on=0 ;
if(second==60) //若秒满60,则秒置0,分加1
{ second=0 ;
minute++ ;
if(minute==60) //若分满60,则分置0,时加1
{ minute=0 ;
hour++ ;
if(hour==24) //若时满24,则时置0,日和星期加1
{ hour=0 ;
week++ ;
day++ ;
if(week==8) //若星期满8,则星期置1,
week=1 ;
if(day==days) //若日满28(二月)、29(润年二月、30(月小)
{ day=1 ; // 31(月大),则日置1,月加1
month++ ;
Momth_Days(month) ; //确定校正后,月的天数
if(month==13) //若月满13,则月置1
{ month=1 ;
year++ ;
Momth_Days(month) ; //确定校正后,月的天数
Leap_Year(year) ; //判断润年
if(year==100) //若年满100,则年置0
year=0 ;
Leap_Year(year); //判断润年
}
}
}
}
}
if(~Timer_Show_sin)
{
if((Timer_hour==hour)&&(Timer_minute==minute)&&second==0)//判断定时是否已到
if(Timer_ON_OFF) Timer_sin=1;
LCD_GoToXY(0,1) ; //年刷新
LCD_Print("20") ;
CharToStr(year) ; //年数据转成ASCII码
LCD_Print(DATA) ;
LCD_Print("-") ; //在年显示后面显示“-”
CharToStr(month) ; //月数据转成ASCII码
LCD_Print(DATA) ; //月刷新
LCD_Print("-") ; //在月显示后面显示“-”
CharToStr(day) ; //日数据转成ASCII码
LCD_Print(DATA) ; //日刷新
WeekToStr(week) ; //星期数据转成ASCII码
LCD_GoToXY(12,1) ; //定位到星期显示区
LCD_Print(Week_Str); //星期刷新
CharToStr(hour) ; //时数据转成ASCII码
LCD_GoToXY(0,2) ; //定位到时显示区
LCD_Print(DATA) ; //时刷新
LCD_Print(":") ; //在小时显示后显示“:”
CharToStr(minute) ; //分数据转成ASCII码
LCD_Print(DATA) ; //分刷新
LCD_Print(":") ; //在分显示后显示“:”
CharToStr(second) ; //秒数据转成ASCII码
LCD_Print(DATA) ; //秒刷新
}
}
/***中断0服务程序(完成发音任务)*****************************************************/
void int0(void) interrupt 0 using 2
{
if(Timer_sin&&!Speak_sin) //
{ Delay1ms(50) ; //
Play=0 ; //放音
Delay1ms(10) ; //延时10ms
Play=1 ;
}
if(Speak_sin)
{ if(Speak[Number]==0xff) //报时时,遇到'\0',报时结束
{ EX0=0 ; //
Number=0 ; //
Speak_sin=0 ; //
}
else
{ P1=Speak[Number] ; //
Delay1ms(50) ; //
Play=0 ; //放音
Delay1ms(10) ; //延时10ms
Play=1 ; //
Number++ ; //下一个音
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?