?? clock.lst
字號:
C51 COMPILER V8.08 CLOCK 06/27/2008 20:17:06 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN clock.OBJ
COMPILER INVOKED BY: E:\Program Files\xp\Keil\C51\BIN\C51.EXE clock.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************************************************************************/
2 /* */
3 /* 多任務程序設計 */
4 /* */
5 /******************************************************************************/
6
7 #include <rtx51tny.h> /* RTX-51 tiny functions & defines */
8 #include <reg51.h>
9
10 //定義各任務
11 #define INIT 0
12 #define CLOCK_RUN 1
13 #define CLOCK_DISPLAY 2
14 #define KEY_SCAN 3
15 #define KEY_DEAL 4
16 #define CLOCK_BEEP 5
17 //增加一個任務:CLOCK_BEEP
18
19 //定義各個鍵值
20 #define UPKEY 6
21 #define DOWNKEY 5
22 #define MODEKEY 3
23
24 //定義數碼管顯示字符0-9,數碼管是共陰極
25 unsigned char numcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
26 //定義顯存,buf[0]對應最左邊數碼管,buf[7]對應最右邊數碼管
27 unsigned char buf[8];
28
29 struct Clock_Struc
30 {
31 unsigned char hour;
32 unsigned char minute;
33 unsigned char second;
34 } Clock,Beep_Clock,Display_Clock;
35
36 sbit BEEP = P2^3;
37
38 unsigned char keyvalue;
39
40 unsigned char status;
41 /*
42 status =0--Clock Run ; 1--Change Clock Minute 2--Change Clock Hour 3--Change Alarm Minute 4--Change AL
-ARM hour
43 status =1--Change Clock.minute
44 status =2--Change Clock.hour
45 status =3--Change Beep_Clock.minute
46 status =4--Change Beep_Clock.hour
47 */
48
49 /******************************************************************************/
50 /* Task 0 'job0': RTX-51 tiny starts execution with task 0 */
51 /******************************************************************************/
52 void job0 (void) _task_ INIT
53 {
54 1 Clock.hour = 11;
C51 COMPILER V8.08 CLOCK 06/27/2008 20:17:06 PAGE 2
55 1 Clock.minute = 59;
56 1 Clock.second = 50;
57 1
58 1
59 1 Beep_Clock.hour = 12;
60 1 Beep_Clock.minute = 0;
61 1 Beep_Clock.second = 0;
62 1
63 1 status = 0;
64 1
65 1 os_create_task (CLOCK_RUN); /* start task 1 */
66 1 os_create_task (CLOCK_DISPLAY); /* start task 2 */
67 1
68 1 os_create_task (KEY_SCAN);
69 1 os_create_task (KEY_DEAL);
70 1 os_create_task (CLOCK_BEEP);
71 1
72 1 //創建 CLOCK_BEEP 任務
73 1
74 1 os_delete_task (INIT); /* stop init task (no longer needed) */
75 1 }
76
77
78 /******************************************************************************/
79 /* Task 1 'job1': Clock Run */
80 /******************************************************************************/
81 void job1 (void) _task_ CLOCK_RUN
82 {
83 1 while(1)
84 1 {
85 2 os_wait (K_IVL, 50, 0); /* wait interval: 1 second */
86 2 os_send_signal(CLOCK_BEEP);
87 2 Clock.second ++ ;
88 2 if(Clock.second>=60)
89 2 {
90 3 Clock.second = 0 ;
91 3 Clock.minute ++;
92 3 if(Clock.minute>=60)
93 3 {
94 4 Clock.minute = 0;
95 4 Clock.hour++;
96 4 if(Clock.hour>=24)
97 4 Clock.hour = 0;
98 4 }
99 3 }
100 2 }
101 1 }
102
103
104 /******************************************************************************/
105 /* Task 2 'job2': Clock Display */
106 /******************************************************************************/
107 void job2 (void) _task_ CLOCK_DISPLAY
108 {
109 1 unsigned char i,j;
110 1 while(1)
111 1 {
112 2 if(status<=2)
113 2 Display_Clock = Clock;
114 2 else
115 2 Display_Clock = Beep_Clock;
116 2
C51 COMPILER V8.08 CLOCK 06/27/2008 20:17:06 PAGE 3
117 2
118 2 buf[0] = numcode[Display_Clock.hour/10];
119 2 buf[1] = numcode[Display_Clock.hour%10];
120 2 buf[2] = 0x40;
121 2 buf[3] = numcode[Display_Clock.minute/10];
122 2 buf[4] = numcode[Display_Clock.minute%10];
123 2 buf[5] = 0x40;
124 2 buf[6] = numcode[Display_Clock.second/10];
125 2 buf[7] = numcode[Display_Clock.second%10];
126 2
127 2 for(i=0;i<=7;i++)
128 2 {
129 3 P1 = buf[i];
130 3 P3 = i ;
131 3 for(j=0;j<20;j++)
132 3 ;
133 3 P1 = 0x00;
134 3 }
135 2 }
136 1 }
137
138 void job3 (void) _task_ KEY_SCAN
139 //此任務是不停地偵聽是否有鍵按下
140 {
141 1 unsigned char i;
142 1 while(1)
143 1 {
144 2 os_wait (K_IVL, 10, 0);
145 2 i = P2&0x07 ;
146 2 if(i!=0x07)
147 2 {
148 3 keyvalue = i ;
149 3
150 3 //在此添加一條語句,發送信號量給KEY_DEAL任務,告知有鍵按下
151 3 os_send_signal(KEY_DEAL);
152 3 while(i!=0x07)
153 3 i = P2&0x07; //等待鍵釋放
154 3 }
155 2 }
156 1
157 1
158 1 }
159
160
161
162 void job4 (void) _task_ KEY_DEAL
163 {
164 1 //此任務是進行按鍵處理
165 1 while(1)
166 1 {
167 2 //等待有鍵按下的信號量
168 2 os_wait(K_SIG,0,0);
169 2 /*
170 2 MODEKEY按鍵處理
171 2 當 status = 0 時,按下MODEKEY后,status = 1,系統進入修改走時的分針狀態
172 2 當 status = 1 時,按下MODEKEY后,status = 2,系統進入修改走時的時針狀態
173 2 當 status = 2 時,按下MODEKEY后,status = 3,系統進入修改鬧時的分針狀態
174 2 當 status = 3 時,按下MODEKEY后,status = 4,系統進入修改鬧時的時針狀態
175 2 當 status = 4 時,按下MODEKEY后,status = 0,系統進入正常的走時狀態
176 2
177 2 UPKEY處理
178 2 當status = 1,走時的分針加1
C51 COMPILER V8.08 CLOCK 06/27/2008 20:17:06 PAGE 4
179 2 當status = 2,走時的時針加1
180 2 當status = 3,鬧時的分針加1
181 2 當status = 4,鬧時的時針加1
182 2
183 2 DOWNKEY處理
184 2 當status = 1,走時的分針減1
185 2 當status = 2,走時的時針減1
186 2 當status = 3,鬧時的分針減1
187 2 當status = 4,鬧時的時針減1
188 2
189 2 */
190 2 if(keyvalue==MODEKEY)
191 2 {
192 3 status++;
193 3 if(status>=5)
194 3 status=0;
195 3 keyvalue=0;
196 3 }
197 2 switch(status)
198 2 {
199 3 case 1:
200 3 if(keyvalue==UPKEY)
201 3 {
202 4 Clock.minute++;
203 4 if(Clock.minute>=60)
204 4 Clock.minute=0;
205 4 }
206 3 if(keyvalue==DOWNKEY)
207 3 {
208 4 Clock.minute--;
209 4 if(Clock.minute==0xFF)
210 4 Clock.minute=59;
211 4 }
212 3 break;
213 3 case 2:
214 3 if(keyvalue==UPKEY)
215 3 {
216 4 Clock.hour++;
217 4 if(Clock.hour>=24)
218 4 Clock.hour=0;
219 4 }
220 3 if(keyvalue==DOWNKEY)
221 3 {
222 4 Clock.hour--;
223 4 if(Clock.hour==0xFF)
224 4 Clock.hour=23;
225 4 }
226 3 break;
227 3 case 3:
228 3 if(keyvalue==UPKEY)
229 3 {
230 4 Beep_Clock.minute++;
231 4 if(Beep_Clock.minute>=60)
232 4 Beep_Clock.minute=0;
233 4 }
234 3 if(keyvalue==DOWNKEY)
235 3 {
236 4 Beep_Clock.minute--;
237 4 if(Beep_Clock.minute==0xff)
238 4 Beep_Clock.minute=59;
239 4 }
240 3 break;
C51 COMPILER V8.08 CLOCK 06/27/2008 20:17:06 PAGE 5
241 3 case 4:
242 3 if(keyvalue==UPKEY)
243 3 {
244 4 Beep_Clock.hour++;
245 4 if(Beep_Clock.hour>=60)
246 4 Beep_Clock.hour=0;
247 4 }
248 3 if(keyvalue==DOWNKEY)
249 3 {
250 4 Beep_Clock.hour--;
251 4 if(Beep_Clock.hour==0xff)
252 4 Beep_Clock.hour=59;
253 4 }
254 3 break;
255 3
256 3 }
257 2
258 2 }
259 1 }
260 //增加一個任務,當走時Clock與設定的鬧時Beep_Clock時間相等(只要時針和分針相同),BEEP驅動LED點亮
261 void job5(void)_task_ CLOCK_BEEP
262
263 {
264 1 while(1)
265 1 {
266 2 os_wait(K_SIG,0,0);
267 2 if(Clock.hour==Beep_Clock.hour&&Clock.minute==Beep_Clock.minute)
268 2 BEEP=0;
269 2 }
270 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 513 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 29 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -