📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 10/24/2008 01:48:45 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*
2 * Copyright (C) 2007, 华中科技大学电气与电子科技创新中心
3 * All Rights Reserved.
4 *
5 * 文件名: main.c
6 * 文件描述: 万年历主程序
7 *
8 * 当前版本: 1.0
9 * 作者: Zuowenping(fmku007@163.com)
10 * 完成日期: 2007年12月17日
11 *
12 */
13 #include "reg51.h"
14 #include "intrins.h"
15 #include "lcd1602.h"
16
17
18 typedef unsigned char u8;
19 typedef unsigned int u16;
20
21 #define MAIN_COUN 49
22
23 #define KEY1 0xfe
24 #define KEY2 0xfd
25 #define KEY3 0xfb
26 #define KEY4 0xf7
27
28 #define START 0x01
29 #define PAUSE 0x02
30 #define STPAU 0x03
31 #define STOP 0x00
32
33 #define UP 0x01
34 #define DOWN 0x02
35
36
37 u8 int_coun=0,sec=40,sec_pre=0;
38 u8 wink_mode=0;
39 u8 key_temp=0;
40 u8 key_coun=0;
41 u8 sys_mode=1;
42 bit key_flag=0;
43 bit adj_flag=0;
44
45 u8 hour=23,min=59,month,day;
46 u16 m_day=365,year=2001;
47
48
49 void Sys_Init();
50 void calc_time();
51 unsigned char calc_day(u16 year);
52 void display();
53 void calc_month_day();
54 void wink_set(u8 wink);
55 void delay(u16 timeinms);
C51 COMPILER V7.06 MAIN 10/24/2008 01:48:45 PAGE 2
56 void key_scan();
57 void key_proc();
58 void stopwatch_ctrl(u8 ctrl);
59 void time_adj(u8 ctrl);
60
61
62
63 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
64
65
66
67 void int_svr() interrupt 3
68 {
69 1 TH1=184;
70 1 TL1=0;
71 1 if(int_coun<MAIN_COUN)
72 1 int_coun+=1;
73 1 else
74 1 { int_coun=0;
75 2 if(sec<59)
76 2 sec+=1;
77 2 else
78 2 sec=0;
79 2 }
80 1 if(int_coun==MAIN_COUN/2)
81 1 {/*put_char(13,1,32);*/wink_set(wink_mode);}
82 1 else if(int_coun==0)
83 1 put_char(13,1,':');
84 1
85 1 }
86
87
88 void main()
89 {
90 1 Sys_Init();
91 1 while(1)
92 1 {
93 2 if(sec_pre!=sec)
94 2 {
95 3 calc_time();
96 3 display();
97 3 sec_pre=sec;
98 3 }
99 2 key_scan();
100 2 key_proc();
101 2 }
102 1 }
103
104 void Sys_Init()
105 {
106 1 lcd_init();
107 1 TMOD=0x10;
108 1 TH1=184;
109 1 TL1=0;
110 1 EA=1;
111 1 ET1=1;
112 1 TR1=1;
113 1 }
114
115
116 void calc_time()
C51 COMPILER V7.06 MAIN 10/24/2008 01:48:45 PAGE 3
117 {
118 1 if(adj_flag)
119 1 {
120 2 calc_month_day();
121 2 return;
122 2 }
123 1 if(sec_pre==59)
124 1 {
125 2 if(min<59)
126 2 min+=1;
127 2 else
128 2 {
129 3 min=0;
130 3 if(hour<23)
131 3 hour+=1;
132 3 else
133 3 {
134 4 hour=0;
135 4 if(m_day<(365+calc_day(year)))
136 4 m_day+=1;
137 4 else
138 4 {
139 5 m_day=1;
140 5 year+=1;
141 5 }
142 4 }
143 3 }
144 2 }
145 1 calc_month_day();
146 1
147 1 }
148
149 unsigned char calc_day(u16 year)
150 {
151 1 if((year%4==0&&year%100!=0)||year%400==0)
152 1 return 1;
153 1 else
154 1 return 0;
155 1 }
156
157
158 void calc_month_day()
159 {
160 1 u8 leap_flag,i;
161 1 u16 day_sum=0;
162 1 if(calc_day(year))
163 1 leap_flag=12;
164 1 else
165 1 leap_flag=0;
166 1 // leap_flag=12;
167 1 for(i=1;i<13;i++)
168 1 {
169 2 day_sum+=non_leap_table[leap_flag+i-1];
170 2 if(day_sum>=m_day)
171 2 {
172 3 month=i;
173 3 day=m_day+non_leap_table[leap_flag+i-1]-day_sum;
174 3 break;
175 3 }
176 2 }
177 1 }
178
C51 COMPILER V7.06 MAIN 10/24/2008 01:48:45 PAGE 4
179 void display()
180 {
181 1
182 1 put_char(0,0,year/1000+48);
183 1 put_char(1,0,(year%1000)/100+48);
184 1 put_char(2,0,year%1000%100/10+48);
185 1 put_char(3,0,year%1000%100%10+48);
186 1
187 1
188 1 put_char(5,0,month/10+48);
189 1 put_char(6,0,month%10+48);
190 1
191 1
192 1 put_char(8,0,day/10+48);
193 1 put_char(9,0,day%10+48);
194 1
195 1 put_char(8,1,hour/10+48);
196 1 put_char(9,1,hour%10+48);
197 1
198 1 put_char(11,1,min/10+48);
199 1 put_char(12,1,min%10+48);
200 1
201 1 put_char(14,1,sec/10+48);
202 1 put_char(15,1,sec%10+48);
203 1
204 1 put_char(4,0,'-');
205 1 put_char(7,0,'-');
206 1 put_char(10,1,':');
207 1 }
208
209
210 void wink_set(u8 wink)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -