wl012.lst

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

LST
308
字号
A51 MACRO ASSEMBLER  WL012                                                                11/03/2004 11:15:09 PAGE     1


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

LOC  OBJ            LINE     SOURCE

                       1     ;********************************************************************************
                       2     ;*                                                                              *
                       3     ;*    File       : wl012.asm                                                    *
                       4     ;*    Date       : 2004-11-5                                                    *
                       5     ;*    Version    : 1.0                                                          *
                       6     ;*                                                                              *
                       7     ;********************************************************************************
                       8     ;*    Descriptoon:                                                              *
                       9     ;*                 计数器实验                                                   *
                      10     ;*                 定时器1工作于16位计数模式,记录外部脉冲的个数;              *
                      11     ;*                 定时器0工作于定时模式,用于进行动态扫描显示                  *
                      12     ;*                                                                              *
                      13     ;*                 此程序可用按键AN4来演示,但是由于按键有抖动现象,所以每按一次*
                      14     ;*                 有可能产生多次计数脉冲                                       *
                      15     ;*                                                                              *
                      16     ;********************************************************************************
                      17     ;*    计数值单位,寄存器与数码管对应关系:                                        *
                      18     ;*                                                                              *
                      19     ;* --- 单位 ---------- 数码管端口 ---- 缓冲区 ---------                         *
                      20     ;*      X                 P20        DIS_BUF+7                                  *
                      21     ;*      X                 P21        DIS_BUF+6                                  *
                      22     ;*      X                 P22        DIS_BUF+5                                  *
                      23     ;*     万位               P23        DIS_BUF+4                                  *
                      24     ;*     千位               P24        DIS_BUF+3                                  *
                      25     ;*     百位               P25        DIS_BUF+2                                  *
                      26     ;*     十位               P26        DIS_BUF+1                                  *
                      27     ;*     个位               P27        DIS_BUF+0                                  *
                      28     ;*                                                                              *
                      29     ;********************************************************************************
                      30     
                      31     NAME    WL012
                      32     
                      33     CODE_SEG        SEGMENT CODE  
                      34     DATA_SEG        SEGMENT DATA 
                      35     STACK_SEG       SEGMENT IDATA        
                      36     
----                  37             RSEG    DATA_SEG
0000                  38     DIS_DIGIT:      DS      1
0001                  39     DIS_INDEX:      DS      1
0002                  40     DIS_BUF:        DS      8
000A                  41     TMP:            DS      1
                      42     
----                  43             RSEG    STACK_SEG
0000                  44     STACK:          DS      20      
                      45     
                      46     ;===============================================================================
----                  47     CSEG    AT      00000H
0000 020000   F       48             LJMP    MAIN
                      49             
----                  50     CSEG    AT      0000BH
000B 020000   F       51             LJMP    TIMER0
                      52     
                      53     ;===============================================================================
----                  54             RSEG    CODE_SEG
0000                  55     MAIN:
0000 758100   F       56             MOV     SP,#(STACK-1);
                      57     
0003 7580FF           58             MOV     P0,#0FFH
A51 MACRO ASSEMBLER  WL012                                                                11/03/2004 11:15:09 PAGE     2

0006 75A0FF           59             MOV     P2,#0FFH
0009 758951           60             MOV     TMOD,#051H              ; 定时器0工作模式1, 16位定时方式
                      61                                                             ; 定时器1工作模式1, 16位计数方式
000C E4               62             CLR     A
000D F58D             63             MOV     TH1,A
000F F58B             64             MOV     TL1,A
0011 758CFC           65             MOV     TH0,#0FCH
0014 758A17           66             MOV     TL0,#017H
                      67      
                      68             ; 初始化显示缓冲区
0017 7500FF   F       69             MOV     DIS_BUF+07H,#0FFH       ; 最数小于65536, 所以前三个数码不显示
001A 7500FF   F       70             MOV     DIS_BUF+06H,#0FFH
001D 7500FF   F       71             MOV     DIS_BUF+05H,#0FFH
                      72     
0020 7500C0   F       73             MOV     DIS_BUF+04H,#0C0H       ; 0xc0是'0'的显示代码
0023 7500C0   F       74             MOV     DIS_BUF+03H,#0C0H
0026 7500C0   F       75             MOV     DIS_BUF+02H,#0C0H
0029 7500C0   F       76             MOV     DIS_BUF+01H,#0C0H
002C 7500C0   F       77             MOV     DIS_BUF,#0C0H
                      78     
002F 75007F   F       79             MOV     DIS_DIGIT,#07FH         ; 初始显示P27口数码管
                      80     
0032 F500     F       81             MOV     DIS_INDEX,A
                      82     
0034 75A882           83             MOV     IE,#082H                ; 使能TIMER0中断
                      84     
0037 D28C             85             SETB    TR0
0039 D28E             86             SETB    TR1
                      87     
003B 80FE             88             SJMP    $
                      89             
                      90     ; END OF MAIN
                      91     
                      92     ;===============================================================================
                      93             USING   1
003D                  94     TIMER0:
                      95     ; 定时器0中断服程序, 用于数码管的动态扫描
                      96     ; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
                      97     ; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
                      98     ;               选通P2.0口数码管
                      99     ; DIS_BUF   --- 显于缓冲区基地址                
                     100     
003D C0E0            101             PUSH    ACC
003F C0D0            102             PUSH    PSW
0041 C082            103             PUSH    DPL
0043 C083            104             PUSH    DPH
0045 75D008          105             MOV     PSW, #08H               ; WORK 1
                     106             
                     107             USING   1
                     108             
0048 758CFC          109             MOV     TH0,#0FCH
004B 758A17          110             MOV     TL0,#017H
                     111             
004E 75A0FF          112             MOV     P2,#0FFH                ; 先关闭所有数码管
                     113             
0051 7400     F      114             MOV     A,#DIS_BUF              ; 获得显示缓冲区基地址
0053 2500     F      115             ADD     A,DIS_INDEX             ; 获得偏移量
0055 F8              116             MOV     R0,A                    ; R0 = 基地址 + 偏移量
0056 E6              117             MOV     A,@R0                   ; 获得显示代码
0057 F580            118             MOV     P0,A                    ; 显示代码传送到P0口
                     119             
0059 8500A0   F      120             MOV     P2,DIS_DIGIT            ; 
                     121     
005C E500     F      122             MOV     A,DIS_DIGIT             ; 位选通值右移, 下次中断时选通下一位数码管
005E 03              123             RR      A
005F F500     F      124             MOV     DIS_DIGIT,A
A51 MACRO ASSEMBLER  WL012                                                                11/03/2004 11:15:09 PAGE     3

                     125             
0061 0500     F      126             INC     DIS_INDEX               ; DIS_INDEX加1, 下次中断时显示下一位
0063 530007   F      127             ANL     DIS_INDEX,#0x07         ; 当DIS_INDEX等于8(0000 1000)时, 清0
                     128             
0066 E500     F      129             MOV     A,DIS_INDEX
0068 7003            130             JNZ     END_TIMER0
                     131             
006A 120000   F      132             LCALL   UPDATE_DISBUF
                     133             
006D                 134     END_TIMER0:
006D D083            135             POP     DPH
006F D082            136             POP     DPL
0071 D0D0            137             POP     PSW
0073 D0E0            138             POP     ACC
                     139             
0075 32              140             RETI
                     141     

⌨️ 快捷键说明

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