⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 单片机学习的最好例子, 1.51多任务切换 2.红外解码 3.数码管扫描显示 4.1602LCD的现实,以及文字动画效果 5.系统构架,资源整合,菜单应用,按键板,其它更新中
💻 LST
📖 第 1 页 / 共 5 页
字号:
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 + -