wl011.lst

来自「单片机开发资料 基于51单片机的单片机开发板 包括《实验例程」· LST 代码 · 共 209 行

LST
209
字号
A51 MACRO ASSEMBLER  WL011                                                                11/03/2004 11:13:41 PAGE     1


MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN wl011.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE wl011.asm SET(SMALL) DEBUG EP

LOC  OBJ            LINE     SOURCE

                       1     ;********************************************************************************
                       2     ;*                                                                              *
                       3     ;*    File       : wl011.asm                                                    *
                       4     ;*    Date       : 2004-11-5                                                    *
                       5     ;*    Version    : 1.0                                                          *
                       6     ;*                                                                              *
                       7     ;*****************************x**************************************************
                       8     ;*    Descriptoon:                                                              *
                       9     ;*                 秒表                                                         *
                      10     ;*                 AN1---控制按钮                                               *
                      11     ;*                       第一次按下时, 启动开始计时                             *
                      12     ;*                       第二次按下时, 停止                                     *
                      13     ;*                       第三次按下时, 归零                                     *
                      14     ;*                                                                              *
                      15     ;*    秒单位,寄存器与数码管对应关系:                                            *
                      16     ;*                                                                              *
                      17     ;* --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时(BCD码)值寄存器   *
                      18     ;*     十万位               P20        dis_buf[7]          sec_bcd[7]           *
                      19     ;*     万位                 P21        dis_buf[6]          sec_bcd[6]           *
                      20     ;*     千位                 P22        dis_buf[5]          sec_bcd[5]           *
                      21     ;*     百位                 P23        dis_buf[4]          sec_bcd[4]           *
                      22     ;*     十位                 P24        dis_buf[3]          sec_bcd[3]           *
                      23     ;*     个位(1.s)            P25        dis_buf[2]          sec_bcd[2]           *
                      24     ;*     十分位(0.1s)         P26        dis_buf[1]          sec_bcd[1]           *
                      25     ;*     百分位(0.01s)        P27        dis_buf[0]          sec_bcd[0]           *
                      26     ;*                                                                              *
                      27     ;********************************************************************************
                      28     
                      29     NAME    WL011
                      30     
                      31     
                      32     CODE_SEG        SEGMENT CODE
                      33     DATA_SEG        SEGMENT DATA 
                      34     STACK_SEG       SEGMENT IDATA
                      35     
----                  36             RSEG  DATA_SEG
0000                  37     KEY_S:          DS   1
0001                  38     KEY_V:          DS   1
0002                  39     DIS_DIGIT:      DS   1
0003                  40     DIS_INDEX:      DS   1
0004                  41     SEC_BCD:        DS   8          ; 秒计数值, BCD码
000C                  42     KEY_TIMES:      DS   1          ; AN1 按下次数  
000D                  43     DIS_BUF:        DS   8          ; 显示缓冲区
                      44     
----                  45             RSEG    STACK_SEG
0000                  46     STACK:          DS      20
                      47     
  00B2                48     AN1     BIT     P3.2
                      49     
                      50     ;===============================================================================
----                  51     CSEG    AT      0000H
0000 020000   F       52             LJMP    MAIN
                      53     
                      54     
----                  55     CSEG    AT      0000BH
000B 020000   F       56             LJMP    TIMER0
                      57             
                      58     
A51 MACRO ASSEMBLER  WL011                                                                11/03/2004 11:13:41 PAGE     2

----                  59     CSEG    AT      0001BH
001B 020000   F       60             LJMP    TIMER1
                      61     
                      62     ;===============================================================================
----                  63             RSEG    CODE_SEG
0000                  64     MAIN:
                      65             USING   0
0000 758100   F       66             MOV     SP,#(STACK-1)
                      67     
0003 7580FF           68             MOV     P0,#0FFH                ; 初始化端口
0006 75A0FF           69             MOV     P2,#0FFH
0009 758911           70             MOV     TMOD,#011H              ; 
000C 758DDC           71             MOV     TH1,#0DCH
000F E4               72             CLR     A
0010 F58B             73             MOV     TL1,A
                      74     
0012 758CFC           75             MOV     TH0,#0FCH
                      76     
0015 758A17           77             MOV     TL0,#017H
                      78     
0018 120000   F       79             LCALL   CLR_TIME                ; 清零计时值
                      80     
001B 75007F   F       81             MOV     DIS_DIGIT,#07FH         ; 上电时选通P27数码管
                      82     
001E E4               83             CLR     A
001F F500     F       84             MOV     DIS_INDEX,A
                      85     
0021 F500     F       86             MOV     KEY_TIMES,A
                      87     
0023 750001   F       88             MOV     KEY_V,#01H
                      89             
0026 75A88A           90             MOV     IE,#08AH                ; 使能timer0, timer1中断
                      91     
0029 D28C             92             SETB    TR0
002B C28E             93             CLR     TR1
                      94             
002D                  95     MAIN_LP:
002D 120000   F       96             LCALL   SCAN_KEY                ; 键扫描
0030 60FB             97             JZ      MAIN_LP                 ; 无键返回
                      98             
0032 7F0A             99             MOV     R7,#10                  ; 延时10ms
0034 120000   F      100             LCALL   DELAYMS                 ; 延时去抖动
0037 120000   F      101             LCALL   SCAN_KEY                ; 再次扫描
003A 60F1            102             JZ      MAIN_LP                 ; 无键返回
                     103             
003C 850000   F      104             MOV     KEY_V,KEY_S             ; 保存键值
003F 120000   F      105             LCALL   PROC_KEY                ; 键处理
0042 80E9            106             SJMP    MAIN_LP                 ; 调回主循环
                     107     ; END OF main
                     108     
                     109     ;===============================================================================
                     110     
0044                 111     CLR_TIME:
                     112             
0044 E4              113             CLR     A
0045 F500     F      114             MOV     SEC_BCD,A               ; 清零所有计时值
0047 F500     F      115             MOV     SEC_BCD+01H,A
0049 F500     F      116             MOV     SEC_BCD+02H,A
004B F500     F      117             MOV     SEC_BCD+03H,A
004D F500     F      118             MOV     SEC_BCD+04H,A
004F F500     F      119             MOV     SEC_BCD+05H,A
0051 F500     F      120             MOV     SEC_BCD+06H,A
0053 F500     F      121             MOV     SEC_BCD+07H,A
0055 020000   F      122             LJMP    UPDATE_DISBUF           ; 更新显示缓冲区
                     123             
                     124     ; END OF CLR_TIME
A51 MACRO ASSEMBLER  WL011                                                                11/03/2004 11:13:41 PAGE     3

                     125     
                     126     ;===============================================================================
0058                 127     SCAN_KEY:
0058 E4              128             CLR     A
0059 F500     F      129             MOV     KEY_S,A
005B A2B2            130             MOV     C,AN1                   ; 读按键状态
005D 33              131             RLC     A
005E 4200     F      132             ORL     KEY_S,A
0060 E500     F      133             MOV     A,KEY_S
0062 6500     F      134             XRL     A,KEY_V                 ; 
                     135             
0064 22              136             RET     
                     137     ; END OF scan_key
                     138     
                     139     ;===============================================================================
0065                 140     PROC_KEY:
0065 E500     F      141             MOV     A,KEY_V
0067 20E018          142             JB      ACC.0,END_PROC_KEY
                     143             
006A 0500     F      144             INC     KEY_TIMES
006C E500     F      145             MOV     A,KEY_TIMES
006E B40103          146             CJNE    A,#01H,PROC_KEY1
                     147             
0071 D28E            148             SETB    TR1                     ; KEY_TIMES = 1,第一次按下AN1, 启动开始计时 
0073 22              149             RET
                     150             
0074                 151     PROC_KEY1:
0074 E500     F      152             MOV     A,KEY_TIMES             
0076 B40203          153             CJNE    A,#02H,PROC_KEY2
                     154             
0079 C28E            155             CLR     TR1                     ; KEY_TIMES = 2, 第二次按下AN1, 停止计时
                     156             
007B 22              157             RET  
                     158                     
007C                 159     PROC_KEY2:
007C 120000   F      160             LCALL   CLR_TIME                ; 第三次按下AN1, 清零计时值
                     161             
007F E4              162             CLR     A
0080 F500     F      163             MOV     KEY_TIMES,A             ; 清零KEY_TIMES
                     164             
0082                 165     END_PROC_KEY:
0082 22              166             RET     
                     167             
                     168     ;===============================================================================
                     169     
0083                 170     TIMER0:
                     171     ; 定时器0中断服程序, 用于数码管的动态扫描
                     172     ; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
                     173     ; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
                     174     ;               选通P2.0口数码管
                     175     ; DIS_BUF   --- 显于缓冲区基地址                
                     176     
0083 C0E0            177             PUSH    ACC
0085 C0D0            178             PUSH    PSW
0087 C000            179             PUSH    AR0
                     180             
0089 758CFC          181             MOV     TH0,#0FCH
008C 758A17          182             MOV     TL0,#017H
                     183             
008F 75A0FF          184             MOV     P2,#0FFH                ; 先关闭所有数码管
                     185             
0092 7400     F      186             MOV     A,#DIS_BUF              ; 获得显示缓冲区基地址
0094 2500     F      187             ADD     A,DIS_INDEX             ; 获得偏移量
0096 F8              188             MOV     R0,A                    ; R0 = 基地址 + 偏移量
0097 E6              189             MOV     A,@R0                   ; 获得显示代码
0098 F580            190             MOV     P0,A                    ; 显示代码传送到P0口
A51 MACRO ASSEMBLER  WL011                                                                11/03/2004 11:13:41 PAGE     4

                     191             
009A 8500A0   F      192             MOV     P2,DIS_DIGIT            ; 
                     193     
009D E500     F      194             MOV     A,DIS_DIGIT             ; 位选通值右移(P20<-P27), 下次中断时选通下一位数码

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?