📄 main.lst
字号:
0040 D28C +1 209 SETB TR0
0042 D2A9 +1 210 SETB ET0
0044 D2AF +1 211 SETB EA
0046 22 +1 212 RET
+1 213
+1 214 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;
+1 215 ;The Now tick counter update
+1 216 ;Note: No need push stack the Timer0 interrupt saved be
0047 +1 217 TIMER_TICK_NOW_COUNTER_:
0047 C3 +1 218 CLR C
+1 219
0048 E509 +1 220 MOV A,VAR_TIMER_TICK_NOW_BYTE0
004A 3401 +1 221 ADDC A,#0x01
004C F509 +1 222 MOV VAR_TIMER_TICK_NOW_BYTE0,A
+1 223
004E E50A +1 224 MOV A,VAR_TIMER_TICK_NOW_BYTE1
0050 3400 +1 225 ADDC A,#0x00
0052 F50A +1 226 MOV VAR_TIMER_TICK_NOW_BYTE1,A
+1 227
0054 020098 +1 228 LJMP TIMER_INTERRUPT_0_FOR_MULTI_TASK__TIMER_TICK_NOW_COUNTER_RETURN
+1 229 ;RET return by youself
+1 230
+1 231 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;
+1 232 ;Timer0 interrupt trigger
+1 233 ;The most importance function for multi task
+1 234 ;Close All interrupt when multi task switching
+1 235 ;Switch multi task, Now Tick++
0057 +1 236 TIMER_INTERRUPT_0_FOR_MULTI_TASK:
+1 237 ;Disable all interrupt
0057 C2AF +1 238 CLR EA
A51 MACRO ASSEMBLER MAIN 04/19/2009 02:07:50 PAGE 5
+1 239
+1 240 ;Disable Timer0 interrupt
+1 241 ;Note: In Interrupt period don't changed Timer counter If close Timer0
+1 242 ;else Timer counter still be changed, but the programs code run time is not same
0059 C28C +1 243 CLR TR0
005B C2A9 +1 244 CLR ET0
+1 245
+1 246 ;Save current task data,The PC already in stack
+1 247 ;Note: PUSH,POP,CALL,RET,RETI instruction effect SP pointer
+1 248
+1 249 ;PSW,A,B
005D C0D0 +1 250 PUSH PSW
005F C0E0 +1 251 PUSH ACC
0061 C0F0 +1 252 PUSH B
+1 253
+1 254 ;Data pointer
0063 C082 +1 255 PUSH DPL
0065 C083 +1 256 PUSH DPH
+1 257
+1 258 ;R0~R7
0067 C000 +1 259 PUSH 0x00
0069 C001 +1 260 PUSH 0x01
006B C002 +1 261 PUSH 0x02
006D C003 +1 262 PUSH 0x03
006F C004 +1 263 PUSH 0x04
0071 C005 +1 264 PUSH 0x05
0073 C006 +1 265 PUSH 0x06
0075 C007 +1 266 PUSH 0x07
+1 267
+1 268 ;Save current SP
0077 E508 +1 269 MOV A,VAR_TASK_CURRENT_ID
0079 04 +1 270 INC A
007A 75F018 +1 271 MOV B,#DEFINE_TASK_BLOCK
007D A4 +1 272 MUL AB
007E 341F +1 273 ADDC A,#DEFINE_SP_START_ADDRESS
0080 F8 +1 274 MOV R0,A
0081 A681 +1 275 MOV @R0,SP
+1 276
+1 277 ;Next Task
0083 3418 +1 278 ADDC A,#DEFINE_TASK_BLOCK
0085 F8 +1 279 MOV R0,A
+1 280
0086 C3 +1 281 CLR C
0087 9480 +1 282 SUBB A,#0x80
0089 0508 +1 283 INC VAR_TASK_CURRENT_ID
+1 284
008B 400E +1 285 JC TASK_SWITCH_TO_NEXT
008D 750800 +1 286 MOV VAR_TASK_CURRENT_ID,#0x00
0090 741F +1 287 MOV A,#DEFINE_SP_START_ADDRESS
0092 3418 +1 288 ADDC A,#DEFINE_TASK_BLOCK
0094 F8 +1 289 MOV R0,A
+1 290
+1 291 ;Note:
+1 292 ;Here use LJMP instead CALL instruction call sub function
+1 293 ;because save the stack buffer space
+1 294 ;don't forget return the sub function by youself
0095 020047 +1 295 LJMP TIMER_TICK_NOW_COUNTER_
0098 +1 296 TIMER_INTERRUPT_0_FOR_MULTI_TASK__TIMER_TICK_NOW_COUNTER_RETURN:
+1 297
0098 0201FA +1 298 LJMP IR_PROCESS_00
009B +1 299 TIMER_INTERRUPT_0_FOR_MULTI_TASK__IR_PROCESS_RETURN:
+1 300
+1 301 ;Resume SP
009B +1 302 TASK_SWITCH_TO_NEXT:
009B 8681 +1 303 MOV SP,@R0
+1 304
A51 MACRO ASSEMBLER MAIN 04/19/2009 02:07:50 PAGE 6
+1 305 ;R7~R0
009D D007 +1 306 POP 0x07
009F D006 +1 307 POP 0x06
00A1 D005 +1 308 POP 0x05
00A3 D004 +1 309 POP 0x04
00A5 D003 +1 310 POP 0x03
00A7 D002 +1 311 POP 0x02
00A9 D001 +1 312 POP 0x01
00AB D000 +1 313 POP 0x00
+1 314
+1 315 ;Data pointer
00AD D083 +1 316 POP DPH
00AF D082 +1 317 POP DPL
+1 318
+1 319 ;B,A,PSW
00B1 D0F0 +1 320 POP B
00B3 D0E0 +1 321 POP ACC
00B5 D0D0 +1 322 POP PSW
+1 323
+1 324 ;Eanble Timer0 interrup
00B7 D28C +1 325 SETB TR0
00B9 D2A9 +1 326 SETB ET0
+1 327
+1 328 ;Enable all interrupt
00BB D2AF +1 329 SETB EA
00BD 32 +1 330 RETI
331
332 ;$include (..\Common\Clock.inc)
+1 333 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;
+1 334 ;Clock part
+1 335 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;
+1 336 ;Clock initialization
00BE +1 337 CLOCK_INITIAL:
00BE 750B00 +1 338 MOV VAR_CLOCK_SECOND,#0x00
00C1 750C00 +1 339 MOV VAR_CLOCK_MINUTE,#0x00
00C4 750D00 +1 340 MOV VAR_CLOCK_HOUR,#0x00
00C7 22 +1 341 RET
+1 342
+1 343 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;
+1 344 ;Clock task process
00C8 +1 345 CLOCK_TASK_PROCESS:
+1 346
+1 347
+1 348 ;LJMP TUBE_PROCESS
00C8 0203DD +1 349 ljmp LCD_TASK_PROCESS
00CB +1 350 CLOCK_TASK_PROCESS_TUBE_PROCESS_RETURN:
+1 351
00CB 0200C8 +1 352 LJMP CLOCK_TASK_PROCESS
00CE 22 +1 353 RET
354
355
356 ;MCU
357 ;$include (..\MCU\MCU.inc)
+1 358 ;MCU part
00CF +1 359 MCU_INITIAL:
00CF 758E00 +1 360 MOV DEFINE_MCU_AUXR,#00000000B ;Enalbe external memory
00D2 22 +1 361 RET
362
363
364 ;OS
365 ;$include (..\OS\MultiTask.inc)
+1 366 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;
A51 MACRO ASSEMBLER MAIN 04/19/2009 02:07:50 PAGE 7
+1 367 ;;Multi Tast part
+1 368 ;; Task structure:
+1 369 ;; Task stack size ( 8Byte ): stack0~stack n
+1 370 ;; Register size ( 15Byte ): PCL,PCH,PSW,ACC,B,DPL,DPH,RO,R1,R2,R3,R4,R5,R6,R7
+1 371 ;; SP ( 1Byte ): SP
+1 372 ;;
+1 373 ;; Task full buffer size : (Register size + Task stack size) * DEFINE_TASK_MAX
+1 374 ;; Note: If function end by "_" means use in internal only
+1 375 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;
+1 376 ;Initial task all data
00D3 +1 377 TASK_INITIAL:
00D3 E4 +1 378 CLR A
00D4 F508 +1 379 MOV VAR_TASK_CURRENT_ID,A
00D6 22 +1 380 RET
+1 381
+1 382 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;
+1 383 ;Create a task and initial data,(i.e. PC=function start address,SP)
+1 384 ;Note: The task stack is very small, the sub function don't use too many nesting ( not out
of 3 max )
+1 385 ;Because call sub function need PUSH PC to stack and return need POP PC to stack but is aut
omatic by MCU
+1 386 ;Input : R0 - Task ID, DPTR - Task function entry address
+1 387 ;Output : Task buffer data
00D7 +1 388 TASK_CREATE_:
+1 389 ;if R0 > DEFINE_TASK_MAX then RET
00D7 C3 +1 390 CLR C
00D8 E8 +1 391 MOV A,R0
00D9 9404 +1 392 SUBB A,#DEFINE_TASK_MAX
+1 393
00DB 4003 +1 394 JC TASK_CREATE_START
00DD 020114 +1 395 LJMP TASK_CREATE_START_RETURN
+1 396
00E0 +1 397 TASK_CREATE_START:
+1 398
00E0 A981 +1 399 MOV R1,SP
+1 400
00E2 E8 +1 401 MOV A,R0
00E3 75F018 +1 402 MOV B,#DEFINE_TASK_BLOCK
00E6 A4 +1 403 MUL AB
00E7 341F +1 404 ADDC A,#DEFINE_SP_START_ADDRESS
+1 405
00E9 F581 +1 406 MOV SP,A
00EB 3418 +1 407 ADDC A,#DEFINE_TASK_BLOCK
00ED F8 +1 408 MOV R0,A
00EE E581 +1 409 MOV A,SP
00F0 340F +1 410 ADDC A,#DEFINE_TASK_REGISTER_SIZE
00F2 F6 +1 411 MOV @R0,A
+1 412
00F3 E4 +1 413 CLR A
+1 414
+1 415 ;Task Entry Function
00F4 C082 +1 416 PUSH DPL
00F6 C083 +1 417 PUSH DPH
+1 418
+1 419 ;PSW,A,B
00F8 C0E0 +1 420 PUSH ACC
00FA C0E0 +1 421 PUSH ACC
00FC C0E0 +1 422 PUSH ACC
+1 423
+1 424 ;Data pointer
00FE C0E0 +1 425 PUSH ACC
0100 C0E0 +1 426 PUSH ACC
+1 427
+1 428 ;R0~R7
A51 MACRO ASSEMBLER MAIN 04/19/2009 02:07:50 PAGE 8
0102 C0E0 +1 429 PUSH ACC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -