?? calender.lst
字號:
C51 COMPILER V7.50 CALENDER 02/24/2006 20:38:40 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CALENDER
OBJECT MODULE PLACED IN calender.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE calender.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //@@***********************************************************
2 //-------------------------------------------------------------
3 //
4 // 文件名 :Calender.c
5 // 描述 :日歷時鐘模塊,用于不帶時鐘芯片的系統
6 // 語言 :C
7 // 作者 :Jean J. Labrosse
8 // 修改 :李艷平
9 // 日期 :2002-05-17
10 // 說明 :原來的程序用于UCII_RTOS中,現移植C51中
11 //@@***********************************************************
12 #define SYS_CLOCK_EN 1
13 #if SYS_CLOCK_EN
14
15 #include "typedef.h"
16 #include "reg52.h"
17 #include "string.h"
18 #include "stdlib.h"
19 #include "Stdio.h"
20
21 #define FOSC 22118400L
22 #define MACHINE_NUM 12 /*根據需要調整,如:W777E58=4*/
23 #define TICKS_PER_SEC 10 /* # of clock ticks to obtain 1 second */
24
25 #define CLK_DATE_EN 1 /* Enable DATE (when 1) */
26
27 #define ENTER_CRITICAL() EA=1
28 #define EXIT_CRITICAL() EA=0
29
30 #if CLK_DATE_EN
31 typedef struct clk_month
32 {
33 UCHAR MonthDays; /* Number of days in each month */
34 char *MonthName; /* Name of the month */
35 UCHAR MonthVal; /* Value used to compute day of the week */
36 } CLK_MONTH;
37 #endif
38
39 static UCHAR ClkTickCtr; /* Counter used to keep track of system clock ticks */
40
41 static UCHAR ClkHr;
42 static UCHAR ClkMin;
43 static UCHAR ClkSec; /* Counters for local TIME
44 */
45 #if CLK_DATE_EN
46 static UCHAR ClkDay; /* Counters for local DATE */
47 static UCHAR ClkDOW; /* Day of week (0 is Sunday) */
48 static UCHAR ClkMonth;
49 static UINT ClkYear;
50 #endif
51 /*********************************************************************************************************
-*
52 * FUNCTION PROTOTYPES
53 **********************************************************************************************************
-/
C51 COMPILER V7.50 CALENDER 02/24/2006 20:38:40 PAGE 2
54 static BOOL ClkUpdateTime(void);
55
56 #if CLK_DATE_EN
57 static BOOL ClkIsLeapYear(UINT year);
58 static void ClkUpdateDate(void);
59 static void ClkUpdateDOW(void);
60 #endif
61
62 void Init_sys_timer(void);
63 void Sys_clk_init(void);
64 void Sys_clk_task(void);
65
66 void Clk_format_time(UCHAR mode, char *s);
67 void Clk_set_time(UCHAR hr, UCHAR min, UCHAR sec);
68 int Cmp_now_time(UCHAR hr, UCHAR min, UCHAR sec);
69
70 #if CLK_DATE_EN
71 void Clk_format_date(UCHAR mode, char *s);
72 void Clk_set_date(UCHAR month, UCHAR day, UINT year);
73 void Clk_set_date_time(UCHAR month, UCHAR day, UINT year, UCHAR hr, UCHAR min, UCHAR sec);
74 int Cmp_now_date_time(UCHAR month, UCHAR day, UINT year, UCHAR hr, UCHAR min, UCHAR sec);
75 #endif
76 /*********************************************************************************************************
-/
77
78
79 #if CLK_DATE_EN
80 static char code *ClkDOWTbl[] = { /* NAME FOR EACH DAY OF THE WEEK
- */
81 "Sunday ",
82 "Monday ",
83 "Tuesday ",
84 "Wednesday ",
85 "Thursday ",
86 "Friday ",
87 "Saturday "
88 };
89
90
91 static CLK_MONTH code ClkMonthTbl[] = { /* MONTHS TABLE
- */
92 {0, "", 0}, /* Invalid month */
93 {31, "January ", 6}, /* January */
94 {28, "February ", 2}, /* February (note leap years are handled by code) */
95 {31, "March ", 2}, /* March */
96 {30, "April ", 5}, /* April */
97 {31, "May ", 0}, /* May */
98 {30, "June ", 3}, /* June */
99 {31, "July ", 5}, /* July */
100 {31, "August ", 1}, /* August */
101 {30, "September ", 4}, /* September */
102 {31, "October ", 6}, /* October */
103 {30, "November ", 2}, /* November */
104 {31, "December ", 4} /* December */
105 };
106 #endif
107 /*
108 *********************************************************************************************************
109 * TIME-OF-DAY CLOCK TASK
110 *
111 * Description : This task is created by Sys_clk_init() and is responsible for updating the time and date.
112 * Sys_clk_task() executes every second.
C51 COMPILER V7.50 CALENDER 02/24/2006 20:38:40 PAGE 3
113 * Arguments : None.
114 * Returns : None.
115 * Notes : CLK_DLY_TICKS must be set to produce 1 second delays.
116 *********************************************************************************************************
117 */
118 void Sys_clk_task (void)
119 {
120 1 if(++ClkTickCtr==TICKS_PER_SEC)
121 1 {
122 2 ClkTickCtr=0;
123 2
124 2 if (ClkUpdateTime() == TRUE)
125 2 {
126 3 #if CLK_DATE_EN
127 3 ClkUpdateDate(); /* And date if a new day (i.e. MM-DD-YY) */
128 3 #endif
129 3 }
130 2 }
131 1 }
132
133 //@@***********************************************************
134 //
135 // 功能: 系統時鐘中斷服務函數
136 // 函數: void Sys_tick_isr(void)
137 // 語言: C
138 // 輸入: NONE
139 // 輸出: NONE
140 // 作者: 李艷平
141 // 日期: 2002-05-17
142 //
143 //@@***********************************************************
144 //-------------------------------------------------------------
145 void Sys_tick_isr(void) interrupt 5 using 3
146 {
147 1 TF2=0;
148 1 Sys_clk_task();
149 1
150 1 }
151
152 //@@***********************************************************
153 //
154 // 功能: 系統定時器初始化
155 // 函數: void Vtimer_init(void)
156 // 語言: C
157 // 輸入: NONE
158 // 輸出: NONE
159 // 作者: 李艷平
160 // 日期: 2002-05-17
161 //
162 //@@***********************************************************
163 //-------------------------------------------------------------
164 void Init_sys_timer(void)
165 {
166 1 BYTE_WORD Init_value;
167 1
168 1
169 1 Sys_clk_init();
170 1
171 1 T2CON=0x00;
172 1 Init_value.word=FOSC/(TICKS_PER_SEC*MACHINE_NUM);
173 1 TH2=RCAP2H=-Init_value.bytes.high;
174 1 TL2=RCAP2L=-Init_value.bytes.low;
C51 COMPILER V7.50 CALENDER 02/24/2006 20:38:40 PAGE 4
175 1
176 1 ET2=1;
177 1 TR2=1;
178 1
179 1 //TMOD&=0xF0; //使用定時器0,但在中斷中需要重新賦初值,因而我更傾向用Timer2
180 1 //TMOD|=0x01;
181 1
182 1 // Init_value.word=FOSC/(TICKS_PER_SEC*MACHINE_NUM);
183 1 //TH0=-Init_value.bytes.high;
184 1 //TL0=-Init_value.bytes.low;
185 1
186 1 //ET0=1;
187 1 //TR0=1;
188 1 }
189
190 /*
191 *********************************************************************************************************
192 * TIME MODULE INITIALIZATION
193 * TIME-OF-DAY CLOCK INITIALIZATION
194 *
195 * Description : This function initializes the time module. The time of day clock task will be created
196 * by this function.
197 * Arguments : None
198 * Returns : None.
199 *********************************************************************************************************
200 */
201 void Sys_clk_init (void)
202 {
203 1 ClkTickCtr = 0;
204 1 Clk_set_time(11,32,0);
205 1 #if CLK_DATE_EN
206 1 Clk_set_date(5,28,2002);
207 1 #endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -