📄 main_bak.c
字号:
/*
* Copyright (C) 2007, 华中科技大学电气与电子科技创新中心
* All Rights Reserved.
*
* 文件名: main.c
* 文件描述: 万年历主程序
*
* 当前版本: 1.0
* 作者: Zuowenping(fmku007@163.com)
* 完成日期: 2007年12月17日
*
*/
#include "reg51.h"
#include "intrins.h"
#include "lcd1602.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define MAIN_COUN 49
#define KEY1 0xfe
#define KEY2 0xfd
#define KEY3 0xfb
#define KEY4 0xf7
#define START 0x01
#define PAUSE 0x02
#define STPAU 0x03
#define STOP 0x00
#define UP 0x01
#define DOWN 0x02
u8 int_coun=0,sec=0,sec_pre=0;
u8 wink_mode=0;
u8 key_temp=0;
u8 key_coun=0;
u8 sys_mode=1;
bit key_flag=0;
void Sys_Init();
void calc_time(u8* min,u8* hour,u16* m_day,u16* year,u8* month,u8* day);
unsigned char calc_day(u16 year);
void display(u8 sec,u8 min,u8 hour,u16 year,u8 day,u8 month);
void calc_month_day(u16 m_day,u16 year,u8* month,u8* day);
void wink_set(u8 wink);
void delay(u16 timeinms);
void key_scan();
void key_proc(u8* min,u8* hour,u16* m_day,u16* year,u8* month,u8* day);
void stopwatch_ctrl(u8 ctrl);
void time_adj(u8 ctrl,u8* min,u8* hour,u16* m_day,u16* year,u8* month,u8* day);
static u8 code non_leap_table[]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31}; //0-11:non_leap 12-23 leap year month table
void int_svr() interrupt 3
{
TH1=184;
TL1=0;
if(int_coun<MAIN_COUN)
int_coun+=1;
else
{ int_coun=0;
if(sec<59)
sec+=1;
else
sec=0;
}
if(int_coun==MAIN_COUN/2)
{/*put_char(13,1,32);*/wink_set(wink_mode);}
else if(int_coun==0)
put_char(13,1,':');
}
void main()
{
u8 hour,min,month,day;
u16 m_day=365,year=2000;
Sys_Init();
while(1)
{
if(sec_pre!=sec)
{
calc_time(&min,&hour,&m_day,&year,&month,&day);
display(sec,min,hour,year,day,month);
sec_pre=sec;
}
key_scan();
key_proc(&min,&hour,&m_day,&year,&month,&day);
}
}
void Sys_Init()
{
lcd_init();
TMOD=0x10;
TH1=184;
TL1=0;
EA=1;
ET1=1;
TR1=1;
}
void calc_time(u8* min,u8* hour,u16* m_day,u16* year,u8* month,u8* day)
{
if(sec_pre==59)
{
if(*min<59)
*min+=1;
else
{
*min=0;
if(*hour<23)
*hour+=1;
else
{
*hour=0;
if(*m_day<(365+calc_day(*year)))
*m_day+=1;
else
*m_day=1;
}
}
}
calc_month_day(*m_day,*year,month,day);
}
unsigned char calc_day(u16 year)
{
if((year%4==0&&year%100!=0)||year%400==0)
return 1;
else
return 0;
}
void calc_month_day(u16 m_day,u16 year,u8* month,u8* day)
{
u8 leap_flag,i;
u16 day_sum=0;
if(calc_day(year))
leap_flag=12;
else
leap_flag=0;
// leap_flag=12;
for(i=1;i<13;i++)
{
day_sum+=non_leap_table[leap_flag+i-1];
if(day_sum>=m_day)
{
*month=i;
*day=m_day+non_leap_table[leap_flag+i-1]-day_sum;
break;
}
}
}
void display(u8 sec,u8 min,u8 hour,u16 year,u8 day,u8 month)
{
put_char(0,0,year/1000+48);
put_char(1,0,(year%1000)/100+48);
put_char(2,0,year%1000%100/10+48);
put_char(3,0,year%1000%100%10+48);
put_char(5,0,month/10+48);
put_char(6,0,month%10+48);
put_char(8,0,day/10+48);
put_char(9,0,day%10+48);
put_char(8,1,hour/10+48);
put_char(9,1,hour%10+48);
put_char(11,1,min/10+48);
put_char(12,1,min%10+48);
put_char(14,1,sec/10+48);
put_char(15,1,sec%10+48);
put_char(4,0,'-');
put_char(7,0,'-');
put_char(10,1,':');
}
void wink_set(u8 wink)
{
switch(wink)
{
case 0:
break;
case 1:
{
put_char(0,0,' ');
put_char(1,0,' ');
put_char(2,0,' ');
put_char(3,0,' ');
break;
}
case 2:
{
put_char(5,0,' ');
put_char(6,0,' ');
break;
}
case 3:
{
put_char(8,0,' ');
put_char(9,0,' ');
break;
}
case 4:
{
put_char(8,1,' ');
put_char(9,1,' ');
break;
}
case 5:
{
put_char(11,1,' ');
put_char(12,1,' ');
break;
}
case 6:
{
put_char(14,1,' ');
put_char(15,1,' ');
break;
}
default: break;
}
}
void delay(u16 timeinms)
{
u16 i,j;
for (i=timeinms;i>0;i--)
for(j=0;j<1000;j++)
_nop_();
}
void key_scan()
{
P1=0xFF;
if(P1!=0xFF)
{
key_temp=P1;
delay(2);
if(key_temp==P1&&key_coun<255)
key_coun+=1;
}
else
key_coun=0;
}
void key_proc(&min,&hour,&m_day,&year,&month,&day)
{
if(key_coun>50)
{
if(key_temp==KEY1)
{
sys_mode=0;
wink_mode=1;
}
put_str("long ",1);
return;
}
if(key_coun>5&&(P1!=key_temp))
{
switch(key_temp) {
case KEY1:
{
if(sys_mode==1)
sys_mode=2;
if(sys_mode==2)
sys_mode=3;
if(sys_mode==3)
sys_mode=1;
if(sys_mode==0)
{
if(wink_mode<6)
wink_mode+=1;
else
wink_mode=1;
}
break;
}
case KEY2:
{
if(sys_mode==2)
stopwatch_ctrl(STPAU);
if(sys_mode==0)
time_adj(UP);
break;
}
case KEY3:
{
if(sys_mode==2)
stopwatch_ctrl(STOP);
if(sys_mode==0)
time_adj(DOWN,min,hour,m_day,year,month,day);
break;
}
case KEY4:
{
if(sys_mode==0)
sys_mode=1;
wink_mode=0;
break;
}
default: break;
}
put_str("short",1);
key_coun=0;
}
}
void stopwatch_ctrl(u8 ctrl)
{}
void time_adj(u8 ctrl)
{
switch(wink_mode)
{
case 0:
break;
case 1:
if(ctrl==UP);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -