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

📄 wl011.lst

📁 数码管显示秒表(AT89S52),供单片机学习者参考。
💻 LST
字号:
A51 MACRO ASSEMBLER  WL011                                                                02/04/2005 14:40:41 PAGE     1


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

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

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

0096 F8              191             MOV     R0,A                    ; R0 = 基地址 + 偏移量
0097 E6              192             MOV     A,@R0                   ; 获得显示代码
0098 F580            193             MOV     P0,A                    ; 显示代码传送到P0口
                     194             
009A 8500A0   F      195             MOV     P2,DIS_DIGIT            ; 
                     196     
009D E500     F      197             MOV     A,DIS_DIGIT             ; 位选通值右移(P20<-P27), 下次中断时选通下一位数码

⌨️ 快捷键说明

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