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

📄 wl010.lst

📁 周立功的51单片机试验例程,我当年就是靠这个学会单片机的
💻 LST
📖 第 1 页 / 共 2 页
字号:
A51 MACRO ASSEMBLER  WL010                                                                02/10/2004 20:14:08 PAGE     1


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

LOC  OBJ            LINE     SOURCE

                       1     ; /*******************************************************************************
                       2     ; *                                                                              *
                       3     ; *    File       : wl010.asm                                                    *
                       4     ; *    Date       : 2004-1-5                                                     *
                       5     ; *    Version    : 1.0                                                          *
                       6     ; *                                                                              *
                       7     ; *    Author     : Freeman          freeman@willar.com                          *
                       8     ; *    Company    : Willar           www.willar.com                              *
                       9     ; *                                                                              *
                      10     ; ********************************************************************************
                      11     ; *    Description:                                                              *
                      12     ; *                 简易电子时钟                                                 *
                      13     ; *                 AN1---时调整                                                 *
                      14     ; *                 AN2---分调整                                                 *
                      15     ; *                                                                              *
                      16     ; *                                                                              *
                      17     ; *******************************************************************************/
                      18     CODE_SEG        SEGMENT CODE 
                      19     DATA_SEG        SEGMENT DATA 
                      20     STACK_SEG       SEGMENT IDATA
                      21     
                      22     
  00B2                23     AN1     BIT     P3.2
  00B3                24     AN2     BIT     P3.3
                      25     
----                  26             RSEG  DATA_SEG
0000                  27     KEY_S:          DS      1
0001                  28     KEY_V:          DS      1
0002                  29     DIS_DIGIT:      DS      1
0003                  30     SEC:            DS      1
0004                  31     DIS_INDEX:      DS      1
0005                  32     HOUR:           DS      1
0006                  33     MIN:            DS      1
0007                  34     SEC100:         DS      1
0008                  35     DIS_BUF:        DS      8
                      36             
  0008                37     BUF_HOUR_H      EQU     DIS_BUF         ; 小时十位
  0009                38     BUF_HOUR_L      EQU     DIS_BUF+1       ; 小时个位
  000B                39     BUF_MIN_H       EQU     DIS_BUF+3       ; 分十位
  000C                40     BUF_MIN_L       EQU     DIS_BUF+4       ; 分个位
  000E                41     BUF_SEC_H       EQU     DIS_BUF+6       ; 秒十位
  000F                42     BUF_SEC_L       EQU     DIS_BUF+7       ; 秒个位
                      43     
----                  44             RSEG    STACK_SEG
0000                  45     STACK:  DS      20      
                      46             
                      47     
                      48     ;===============================================================================
                      49     
----                  50     CSEG    AT      0000H
0000 020000   F       51             JMP     MAIN
                      52             
----                  53     CSEG    AT      0000BH
000B 020000   F       54             LJMP    TIMER0  
                      55     
----                  56     CSEG    AT      0001BH
001B 020000   F       57             LJMP    TIMER1
                      58     
A51 MACRO ASSEMBLER  WL010                                                                02/10/2004 20:14:08 PAGE     2

                      59     ;===============================================================================
                      60     
                      61     
----                  62             RSEG  CODE_SEG
0000                  63     MAIN:
                      64             USING   0
                      65             
0000 758100   F       66             MOV     SP, #(STACK-1)          ;
                      67             
                      68             
0003 7580FF           69             MOV     P0,#0FFH
0006 75A0FF           70             MOV     P2,#0FFH
0009 758911           71             MOV     TMOD,#011H              ; 定时器0, 1工作模式1, 16位定时方式
000C 758CFC           72             MOV     TH0,#0FCH
000F 758A17           73             MOV     TL0,#017H
0012 758DDC           74             MOV     TH1,#0DCH
0015 E4               75             CLR     A
0016 F58B             76             MOV     TL1,A
                      77             
0018 75000C   F       78             MOV     HOUR,#12                ; 
001B E4               79             CLR     A                       ; 
001C F500     F       80             MOV     MIN,A
001E F500     F       81             MOV     SEC,A
0020 F500     F       82             MOV     SEC100,A
                      83             
0022 E500     F       84             MOV     A,HOUR
0024 75F00A           85             MOV     B,#10
0027 84               86             DIV     AB
0028 900000   F       87             MOV     DPTR,#DIS_CODE
002B 93               88             MOVC    A,@A+DPTR
002C F500     F       89             MOV     BUF_HOUR_H,A            ; 时十位
002E E500     F       90             MOV     A,HOUR
0030 75F00A           91             MOV     B,#10
0033 84               92             DIV     AB
0034 E5F0             93             MOV     A,B
0036 93               94             MOVC    A,@A+DPTR
0037 F500     F       95             MOV     BUF_HOUR_L,A            ; 时个位
0039 E500     F       96             MOV     A,MIN
003B 75F00A           97             MOV     B,#10
003E 84               98             DIV     AB
003F 93               99             MOVC    A,@A+DPTR
0040 F500     F      100             MOV     BUF_MIN_H,A             ; 分十位
0042 E500     F      101             MOV     A,MIN
0044 75F00A          102             MOV     B,#10
0047 84              103             DIV     AB
0048 E5F0            104             MOV     A,B
004A 93              105             MOVC    A,@A+DPTR
004B F500     F      106             MOV     BUF_MIN_L,A             ; 分个位
004D E500     F      107             MOV     A,SEC
004F 75F00A          108             MOV     B,#10
0052 84              109             DIV     AB
0053 93              110             MOVC    A,@A+DPTR
0054 F500     F      111             MOV     BUF_SEC_H,A             ; 秒十位
0056 E500     F      112             MOV     A,SEC
0058 75F00A          113             MOV     B,#10
005B 84              114             DIV     AB
005C E5F0            115             MOV     A,B
005E 93              116             MOVC    A,@A+DPTR
005F F500     F      117             MOV     BUF_SEC_L,A             ; 秒个位
                     118             
0061 7500BF   F      119             MOV     BUF_HOUR_H+02H,#0BFH
0064 7500BF   F      120             MOV     BUF_HOUR_H+05H,#0BFH
                     121             
0067 7500FE   F      122             MOV     DIS_DIGIT,#0FEH
006A E4              123             CLR     A
006B F500     F      124             MOV     DIS_INDEX,A
A51 MACRO ASSEMBLER  WL010                                                                02/10/2004 20:14:08 PAGE     3

                     125             
006D 75A88A          126             MOV     IE,#08AH                ; 使能timer0,1 中断
                     127             
0070 D28C            128             SETB    TR0
0072 D28E            129             SETB    TR1
                     130             
0074 750003   F      131             MOV     KEY_V,#03H
                     132             
0077                 133     MAIN_LP:
0077 120000   F      134             LCALL   SCAN_KEY                ; 键扫描
007A 60FB            135             JZ      MAIN_LP                 ; 无键返回
                     136             
007C 7F0A            137             MOV     R7,#10                  ; 延时10ms
007E 120000   F      138             LCALL   DELAYMS                 ; 延时去抖动
0081 120000   F      139             LCALL   SCAN_KEY                ; 再次扫描
0084 60F1            140             JZ      MAIN_LP                 ; 无键返回
                     141             
0086 850000   F      142             MOV     KEY_V,KEY_S             ; 保存键值
0089 120000   F      143             LCALL   PROC_KEY                ; 键处理
008C 80E9            144             SJMP    MAIN_LP                 ; 调回主循环
                     145     
                     146     
                     147     ;===============================================================================
008E                 148     SCAN_KEY:
                     149     ; 扫键扫描子程序
                     150     ; 保存按键状态到key_s
                     151     ; 返回: A --- 按键是否按下(BOOL)
                     152     
008E E4              153             CLR     A
                     154             
008F A2B2            155             MOV     C,AN1                   ; 读按键AN1
0091 92E0            156             MOV     ACC.0,C
0093 A2B3            157             MOV     C,AN2                   ; 读按键AN2
0095 92E1            158             MOV     ACC.1,C
                     159             
0097 F500     F      160             MOV     KEY_S,A                 ;  保存按键状态到key_s
0099 6500     F      161             XRL     A,KEY_V
009B 22              162             RET     
                     163     
                     164     ;===============================================================================
009C                 165     PROC_KEY:
                     166     ; 键处理子程序
                     167     ; 传入参数: KEY_V --- 按键值
                     168     ; 返回值: 无
                     169     
009C C2AF            170             CLR     EA
                     171             
009E E500     F      172             MOV     A,KEY_V
00A0 30E005          173             JNB     ACC.0,PROC_AN1
00A3 30E107          174             JNB     ACC.1,PROC_AN2
00A6 8028            175             SJMP    END_PROC_KEY
                     176             
00A8                 177     PROC_AN1:                               ; 按键AN1处理
00A8 120000   F      178             LCALL   INC_HOUR                ; 小时加1
00AB 8023            179             SJMP    END_PROC_KEY
                     180     
00AD                 181     PROC_AN2:                               ; 按键AN2处理
00AD 0500     F      182             INC     MIN                     ; 分钟加1
                     183             
00AF E500     F      184             MOV     A,MIN                   ; 
00B1 D3              185             SETB    C
00B2 943B            186             SUBB    A,#59   
00B4 4003            187             JC      AN2_UPDATE_MIN          ; 如果分钟等于60,则分清0,小时加1
                     188             
00B6 E4              189             CLR     A                       ; 
00B7 F500     F      190             MOV     MIN,A
A51 MACRO ASSEMBLER  WL010                                                                02/10/2004 20:14:08 PAGE     4

                     191     
00B9                 192     AN2_UPDATE_MIN:                         ; 更新分显示缓冲区
00B9 E500     F      193             MOV     A,MIN
00BB 75F00A          194             MOV     B,#10
00BE 84              195             DIV     AB                      ; A = MIN / 10  
00BF 900000   F      196             MOV     DPTR,#DIS_CODE
00C2 93              197             MOVC    A,@A+DPTR
00C3 F500     F      198             MOV     BUF_MIN_H,A             ; 更新分十位
                     199             
00C5 E500     F      200             MOV     A,MIN
00C7 75F00A          201             MOV     B,#10
00CA 84              202             DIV     AB
00CB E5F0            203             MOV     A,B                     ; A = MIN % 10
00CD 93              204             MOVC    A,@A+DPTR
00CE F500     F      205             MOV     BUF_MIN_L,A             ; 更新分个位    
                     206             
00D0                 207     END_PROC_KEY:
00D0 D2AF            208             SETB    EA
00D2 22              209             RET     
                     210     
                     211     ;===============================================================================
                     212     
                     213             USING   0
00D3                 214     TIMER0:
                     215     ; 定时器0中断服程序, 用于数码管的动态扫描
                     216     ; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
                     217     ; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
                     218     ;               选通P2.0口数码管
                     219     ; DIS_BUF   --- 显于缓冲区基地址                
                     220     
00D3 C0E0            221             PUSH    ACC
00D5 C0D0            222             PUSH    PSW
00D7 C000            223             PUSH    AR0
                     224             
00D9 758CFC          225             MOV     TH0,#0FCH
00DC 758A17          226             MOV     TL0,#017H
                     227             
00DF 75A0FF          228             MOV     P2,#0FFH                ; 先关闭所有数码管
                     229             
00E2 7400     F      230             MOV     A,#DIS_BUF              ; 获得显示缓冲区基地址
00E4 2500     F      231             ADD     A,DIS_INDEX             ; 获得偏移量
00E6 F8              232             MOV     R0,A                    ; R0 = 基地址 + 偏移量
00E7 E6              233             MOV     A,@R0                   ; 获得显示代码
00E8 F580            234             MOV     P0,A                    ; 显示代码传送到P0口
                     235             
00EA 8500A0   F      236             MOV     P2,DIS_DIGIT
                     237     
00ED E500     F      238             MOV     A,DIS_DIGIT             ; 位选通值左移, 下次中断时选通下一位数码管
00EF 23              239             RL      A
00F0 F500     F      240             MOV     DIS_DIGIT,A
                     241             
00F2 0500     F      242             INC     DIS_INDEX               ; DIS_INDEX加1, 下次中断时显示下一位
00F4 530007   F      243             ANL     DIS_INDEX,#0x07         ; 当DIS_INDEX等于8(0000 1000)时, 清0
                     244     
00F7 D000            245             POP     AR0
00F9 D0D0            246             POP     PSW
00FB D0E0            247             POP     ACC

⌨️ 快捷键说明

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