哪位大神帮忙看下下面程序为何无法通过keil编译

2019-07-16 19:11发布

    设计任务:
1.    屏幕保护的检查(P.从右至左流动)
2.    按下A键显示8个P.,然后开始运行
3.    时分秒、年月日之间用“-”分割,并闪烁
4.    运行时按下A进入调整时钟状态,再按一次恢复运行
5.    在运行状态下,按下BCD分别显示三种功能,可切换观看,按A键返回运行
6.    在各调整状态下,按B调秒(日),C调分(月),D调时(年),短时间按下只加一次,长时间按下不停歇的加数,调整完毕后按A键返回运行状态。
7.    定时功能:在运行时按下B显示定时,再按B进入调整状态,设置完成按A返回。
8.    当“时”小于10时,高位不显示,即高位“清零”。
9.    秒表功能:在运行时按下C键,进入秒表功能,奇数次C开启秒表,偶数次C关闭,按A键返回。
10.    在运行时按下D键显示日期,再按D键静茹调整状态,按A键返回。


 
ORG  OOOOH
START:    AJMP    MAIN
        ORG OOOBH
        AJMP     PITO

;==============/////主程序///=====================---=========


    ORG  0030H
MAIN:    MOV     SP,  #60H    ;设置堆栈起始地址
        MOV     R0, #30H
        MOV    R7,  #08H
WAIT:    MOV    @R0,    #0AH    ;缓存全置P.
    INC     R0
        DJNZ    R7,    WAIT   
;————————屏保程序————————————
      MOV    P2,   #0CH    ;显示P
        MOV     R4,    #80H   
WAITO:  MOV     A,     R4
        MOV    P0,    A
        RR    A        
        MOV    R4,    A
        MOV     R7,    #250    ;延时
WAIT1:  LCALL   DELY
        LCALL    KEY            
        JB    20H.O,    WAIT2    ;按下A键进入时钟运行
        DJNZ    R7,    WAIT1        
        AJMP    WAITO            
;————————————————————

WAIT2:    CLR     20H.0   
        MOV     30H,    #00H     ;缓存清零   
    MOV    31H,    #00H   
    MOV     32H,   #0BH
        MOV     33H,    #00H   
    MOV     34H,    #00H
        MOV     35H,    #0BH   
    MOV    36H.    #00H   
    MOV    37H.    #00H   
;————————————————————
        MOV    50H,    #06H     ;初始日期
        MOV    51H,    #00H
        MOV    52H,    #0BH
        MOV    53H,    #02H
       MOV    54H,    #0lH
        MOV    55H,    #OBH
        MOV    56H,    #09H
        MOV    57H,    #00H
——————————————————————
        MOV    38H,    #00H    ;初始定时
        MOV    39H,    #00H
        MOV    3AH,    #0BH
        MOV    3BH,    #00H
        MOV    3CH,     #00H
        MOV    3DH,     #0BH
        MOV    3EH,     #07H
        MOV    3FH,     #00H
;——————————————————————————
        MOV    58H,    #00H   ;缓存清零
        MOV    59H,    #00H
        MOV    5AH,    #0BH
        MOV    5BH,    #00H
        MOV    5CH,    #0BH
        MOV    5DH,    #0BH
        MOV    5EH,    #00H
        MOV    5FH,    #00H
;——————————————————————————
        MOV    TMOD,     #0lH    ;设置定时中断
        MOV    TLO,     #ODCH   
        MOV    THO,    #3FH   
        MOV    IE,    #82H   
        SETB TRO
        MOV    40H,    #10H    ;用6MHz,循环次数为8,用12MHz循环16次

;=============///闪烁程序////===========================================

WAIT3 : MOV     R7,    #50
WAIT4 : LCALL    DISP
        LCALL    DINGSHI     ;调用显示,键扫,定时子程序
        LCALL    KEY
        JB         20H. 0,    TOA          ;运行时闪烁,等待中断或功能键按下   
        JB         20H. 1,    TOB
        JB         20H. 2,    TOC
        JB         20H. 3,    TOD
        LCALL  DELY
        DJNZ     R7,             WAIT4
        MOV     32H,         #OCH         ;各级单位之间闪烁
        MOV     35H,    #OCH
        MOV     R7    #50
WAIT5 : LCALL    DISP
        LCALL    DINGSHI
        LCALL    KEY
        JB      20H.0,     TOA    ;运行时闪烁,等待中断或功能键按下
        JB      20H.1,     TOB
        JB      20H.2,     TOC
        JB      20H.3,     TOD
        LCALL  DELY
        DJNZ     R7,     WAIT5   
        MOV     32H,    #OBH
    MOV    35H,    #OBH   
    SJMP    WAIT3        
TOA:    JBC    0F0H,   WAIT6    ;确保A键按下显示时间时分秒
    JBC     0F1H,   WAIT6   
        JBC    0F2H,    WAIT6   ;判断清零并转移   
    LJMP    ANKEYO        
WAIT6:  CLR    0F4H
        CLR     0F3H
        CLR     0F5H
        LJMP    WAIT3
TOB:    CLR     0F0H    ;清除其他标志位
        CLR     0F1H
        JB      0F2H.        TOBl
        SETB    0F2H      ;作为标志位使用
        MOV    20H,     #00H
        AJMP    WAIT3
TOBl:    SETB    0F4H
    AJMP     ANKEY   ;跳到键功能子程序
TOC :    CLR    OFOH
        CLR     OF2H
       JB      OF1H,         TOCl           ;OF2,0F4-B键定时38H-3FH
        SETB    OFIH                          ;OF1,0F3-C键秒表58H-5FH  
        MOV     20H,            #OOH
        AJMP    WAIT3                         ;OFO,OF5-D键日期50H-57H
TOC1 :    SETB    OF3H
        LCALL     MIAOBIAO
        CLR    OF1H
        CLR     OF3H
        LJMP    WAIT3
TOD   :    CLR     OFIH
        CLR    OF2H
        JB      OFOH,        TOD1
    SETB    OFOH   
    MOV    20H    #OOH
        AJMP     WAIT3
TOD1  : SETB    OF5H   
    LJMP    ANKEY   

;=====///中断服务程序///========    -

    ORG    0300H
PITO:    PUSH    PSW   ;中断保护现场
        PUSH    ACC
        SETB    PSW.3
        MOV     TLO,     #ODCH  ;重置定时器数
        MOV     THO,    #0FH
        MOV     A,      40H
        DEC    A
    MOV     40H,    A   
    JNZ    RETO        
    MOV     40H,    #10H
        MOV     A,      37H   ;中断高位清零程序
    XRL    A    #OCH   
    JNZ    PITl        
PIT1:    MOV     RO      #31H  ;加1程序
        ACALL    DAAD1   
    MOV    A,    R2   
    XRL    A,    #60H   
    JNZ    RETO        ;满60清零,不满返回。
    ACALL    CLRO        
    MOV    RO,    #34H   
    ACALL    DAADl        
    MOV    A,    R2   
    XRL    A,    #60H   
    JNZ    RETO        
    ACALL    CLRO        
    MOV    RO    #37H   
    ACALL    DAADl        
    MOV    A,    R2   
    XRL    A,    #24H   
    JNZ    RETO        
    ACALL    CLRO        
        LCALL    DATE    ;满24小时则日加1
RETO :    MOV    A,    37H    ;中断高位清零程序
    JNZ    RETl        
    MOV    37H,    #OCH   
RETl:    POP    ACC        
    POP    PSW        
    RETl            
DAADl:    MOV    A    @RO    ;加1子程序
    DEC    RO        
    SWAP    A
        ORL    A,    @RO   
    ADD    A,    #OlH   
    DA    A        
        MOV     R2,     A
        ANL     A,      #OFH   
        MOV    @RO,    A   
        MOV    A,    R2   
       INC     RO
        ANL    A,    #OFOH   
        SWAP    A        
        MOV    @RO,    A   
    RET
CLRO :    CLR    A        ;高位清零
        MOV    @RO,    A   
        DEC    RO        
        MOV    @RO,    A   
        RET            
;=======///显示字程序///===================================

        ORG     0400H
DISP:    PUSH    ACC        
    PUSH    PSW        
    SETB    RS1        
    MOV    RO,    #50H   
    JB    OFOH,    LD2     ;判断显示哪种状态
    MOV    RO,    #58H   
    JB    OF1H,    LD2   
    MOV    RO,    #38H   
    JB    OF2H,    LD2   
    MOV    RO,    #30H   
LD2 :    MOV    R3,    #80H   
        MOV     A ,      R3
LD0 :    MOV     80H,    A     ;高128单元只能直接寻址
    MOV    A,    @RO   
    MOV    DPTR,    #TABLE   
    MOVC    A,    @A+DPTR   
    MOV    OAOH,    A    ;高128单元只能直接寻址
    ACALL    DL        
    INC    RO        
    MOV    A,    R3   
    JB    ACC.O,    LD1    ;是否显示到最高位
    RR    A        
    MOV    R3,    A   
    AJMP    LDO        
LDl:    POP    PSW        
    POP    ACC        
        RET
DL:    MOV    R2    #7DH    ;延时程序
LOOP:    NDP
        NDP            
    DJNZ    R2,    LOOP   
    RET            
TABLE:  DB  OCOH., OF9H,OA4H,OBOH,99H,92H,82H,OF8H, 80H,90H
        DB  OCH,0BFH,OFFH,OOH

;=============///键盘功能子程序///============


        ORG    0500H
ANKEYO :PUSH    IE    ;
       PUSH    TLO
        PUSH     THO
        MOV    IE,     #OOH
        MOV    20H,    #OOH
ANKEY : LCALL   DISP    ;判断要进入的键功能
        JNB     Pl.1,  TOKEYB
        JNB    Pl.2,  TOKEYC
        JNB    Pl.3,    TOKEYD
        LCALL    DISP   
        LCALL    KEY   
        JB    20H.0,    KEYA
        LJMP    ANKEY   
TOKEYB:    CLR    P1.1        ;跳到B键
    LJMP    KEYB        
TOKEYC:    CLR    Pl.2        
    LJMP    KEYC        
TOKEYD:    CLR    P1.3        
    LJMP    KEYD        
KEYA :    MOV    20H    #OOH    ;A键返回
    POP    THO        
    POP    TLO        
    POP    IE        
    MOV    IE,    #82H   
    LJMP    WAIT3
   
KEYB:     LCALL   DISP      ;是否跳到其他键
        JNB     P1.O,    KEYB2   
        JNB    Pl.2,    KEYC   
        JNB    PI.3,    GOKEYD   
        MOV    Pl,     #OFFH    ;恢复Pl口高电平   
        MOV     R7,     #60
PPPP1 :    LCALL   DISP
    DJNZ    R7,    PPPP1
    MOV    RO,    #51H    ;日期
    JB    OF5H,    LD3    ;判断显示哪种状态
    MOV    RO,    #39H    ;定时
    JB    OF4H,    LD3   
        MOV    RO,     #31H
LD3 :    LCALL    DAADl        ;根据不同的标志位
    MOV    A,    R2    ;加不同的值
    JB    OF5H,    LD4   
    XRL    A,    #60H   
    AJMP    LD5        
LD4:    XRL    A,    #31H   
    JNZ    KEYBl        
    MOV    51H,    #OOH   
    MOV    50H,    #OlH   
    AJMP    KEYBl        
LD5:    JNZ    KEYBl        
    LCALL    CLRO        
KEYB1 :    AJMP    KEYB        ;A不按下则不返回
GOKEYD: LJMP    KEYD            
KEYB2:  JB    OF4H,    KEYB3        
        JB    OF5H,    KEYB3        
        LJMP    ANKEY            
KEYB3 : LJMP    WAIT3        ;A按下则返回
   
KEYC :    LCALL   DISP
        JNB    Pl.O,    KEYC2   
        JNB     P1.1,   KEYB
        JNB    P1.3,   KEYD   
        JB    PI.2,    KEYC   
        MOV    Pl,    #OFFH   
        MOV    R7,    #60   
PPPP2:  LCALL    DISP        
        DJNZ    R7,    PPPP2   
        MOV    RO,    #54H    ;日期
        JB    OF5H,    LD6    ;判断显示哪种状态
        MOV    RO,    #3CH    ;定时
        JB    OF4H,    LD6   
        MOV    RO,    #34H   
LD6:    LCALL    DAADl        
        MOV    A,    R2   
        JB    OF5H,    LDD7
        XRL    A,    #60H
        AJMP    LD8   
LDD7 :  XRL    A,    #13H
        JNZ    KEYCl     
        MOV     54H,    #OOH
        MOV     53H,    #OlH
        AJMP    KEYCl
LD8 :    JNZ    KEYCl     :满60/12清零,不满返回
    LCALL    CLRO
KEYC1 : AJMP    KEYC
KEYC2:  JB    OF4H,    KEYC3
        JB    OF5H,    KEYC3
    LJMP    ANKEY
KEYC3:  LJMP    WAIT3

KEYO :    LCALL    DISP   
    MOV     A,       37H    ;按键高位清零程序
        XRL     A,       #OCH
        JNZ     PPPP4
        MOV    37H,      #00H
PPPP4 : JNB     P1.O,    KEY02
        JNB    P1.1,     GOKEYB
        JNB    P1.2,    KEYC
       JB    P1.3,    KEYO
        MOV    Pl,    #OFFH
        MOV     R7,    #60
PPPP3 : LCALL    DISP
        DJNZ    R7,    PPPP3
       MOV     RO,     #57H       ;日期
        JB    OF5H,    L09        ;判断显示哪种状态   
        MOV     RO,    #3FH       ;定时   
        JB    OF4H,    LD9
    MOV    RO,    #37H
LD9:    LCALL    DAAD1
        MOV    A,     R2
        JB    OF5H,    LDDO
        JB    OF4H,    LDD2
        XRL     A,    #24H
        AJMP     LOO1
LDDO :     XRL    A,     #99H
LDD2:     XRL    A,    #25H    ;关闭定时功能的关键
LDDl:    JNZ     KEYDl    ;满24 /99/25清零,不满返回。
        LCALL   CLRO
KEYD1 : AJMP    KEYD
GOKEYB: LJMP    KEYB
KEYD2 : JB      OF4H,   KEYD3   
    JB    OF5H,     KEYD3
KEYD3 :    LJMP    WAIT3   
============///按键判断子程序////==============
 
        ORG     0700H
KEY :    MOV     P1,     #OFFH
        MOV     A,      P1
        CPL    A   
    ANL    A,    #OFH   
    JZ     RETX          ;等零返回
        LCALL    DISP         ;延时12ms
    LCALL    DISP        
    MOV     A,    Pl
        CPL    A        
    ANL     A     #OFH   
        JZ      RETX         ;判断是否有按键
        MOV     20H,    A
LOOP1:    LCALL   DISP
        MOV     20H,     A    ;等待键松
    MOV    A,    Pl   
    CPL    A        
    ANL    A,    #OFH   
    JNZ    LOOPl        
RETX:    RET            

;==========///延时子程序///===============

DELY:   MOV    R6,    #03   ;延时3ms程序
LOOP3:MOV    R5,    #250
LOOP4 :    NOP            
    NOP            
    DJNZ    R5,    LOOP4   
    DJNZ    R6,    LOOP3   
    RET            

;===========///日期程序 ///================

        ORG    0800H   
DATE:    MOV    RO,    #51H
        LCALL   DAADl        ;加1子程序
        MOV     A,      R2
        XRL     A,      #31H
        JNZ     BACK        ;满30清零,不满返回。
        LCALL   DAADl
        MOV     A,      R2
        XRL    A,    #13H
        JNZ     BACK
        LCALL    CLRO   
        MOV     R0,     #57H
        LCALL   DAADl
        MOV     A,      R2
        XRL    A,    #99H
        JNZ     BACK
        LCALL   CLRO
BACK :     RET

;==============////秒表功能///============
   
     ORG   0900H
MIAOBIAO:CLR    20H.2      ;调显示和延时程序   
         LCALL    DISP        
         LCALL    DELY        
         LCALL    DELY        
         MOV    RO,    #59H   
         LCALL    DAADl        
         MOV    A,    R2   
         XRL    A,      #99H
         JNZ    RETM        ;满99清零,不满返回。
         LCALL    CLRO            
         MOV    RO,    #5CH        
         LCALL    DAADl            
         MOV    A,    R2        
         XRL    A,    #60H        
         JNZ    RETM            
         LCALL    CLRO            
         MOV    RO,    #5FH        
         LCALL    DAADl            
         MOV    A,         R2        
         XRL    A,    #60H        
         JNZ    RETM            
         LCALL    CLRO
RETM:    LCALL  KEY
         JB     20H.0,  TOBACK     ;A键若按下则返回
         JB     20H.2,  PAUSE
         LJMP   MIAOBIAO
PAUSE:   CLR    20H.2   MIAOBIAO
     JB     20H.0,  TOBACK
         AJMP   PAUSE         
TOBACK : MOV    20H,    #OOH
     RET        
;==============///定时功能///============

DINGSHI: LCALL  DISP          ;在子程序中慎用堆栈
         MOV    R2,     #08H
         MOV    RO,     #37H
         MOV    Rl,     #3FH
     MOV    A,    37H    ;
     XRL    A,    #OCH   
     JNZ    DING        
     MOV    R2,    #07H   
     MOV    R0,     #36H
         MOV    R1,     #3EH
DING:    MOV    A,    @RO   
    XRL    A,    @Rl   
    JNZ    RETD        
    DEC    RO        
    DEC    Rl        
    DJNZ    R2      DING
        CLR    P3.0        ;接其他口对程序有影响
    MOV    R3.    #100   
DINGl:    MOV    R4.    #200   
ING2 :     LCALL    DISP
    LCALL    DELY        
    LCALL    KEY        
    JB    20H.0,    RETD    ;按下A键返回
    DJNZ    R4.    DING2   
    DJNZ    R3.    DINGl   
RETD:    MOV    20H    #OOH   
    SETB    P3.0        
    RET            
;==========================================================
END
;============///程序结束///================================
        

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
jingjingmuhua
1楼-- · 2019-07-16 19:22
汇编啊不是很清楚哎
gamersny
2楼-- · 2019-07-16 20:16
错误提示是什么
东南之星
3楼-- · 2019-07-16 21:02
你可以尝试用C来编一下。
抓饭飘香
4楼-- · 2019-07-17 00:10
 精彩回答 2  元偷偷看……
1527820835
5楼-- · 2019-07-17 04:37
建议楼主用C语言写,汇编太老了
qwer2006
6楼-- · 2019-07-17 08:23
{:12:}

一周热门 更多>