微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 汇编程序编译出现3处错误,恳请各位前辈帮忙

汇编程序编译出现3处错误,恳请各位前辈帮忙

时间:10-02 整理:3721RD 点击:
修改了两天,还剩3处错误,大神快来救场

         ORG     0000H
         AJMP    MAIN
         ORG     000BH              ;定时器T0中断
         AJMP    TIMER0
         ORG     001BH              ;定时器T1中断
         AJMP    CONTER1
         ORG     0100H
         AJMP    DIS
         MOV     SCON,#00H          ;串行口工作方式0
MAIN:    CLR     06H                ;清定时时间到标志位
         CLR     P1.6               ;产生清0用负脉冲
         NOP
         SETB    P1.6
         MOV     TMOD,#59H   
         MOV     TH0,#3CH           ;T/C0外部启动定时,T/C1计数
         MOV     TL0,#0B0H      
         MOV     TH1,#00H           ;T/C1方式1由00H开始计数
         MOV     TL1,#00H
         MOV     R7,#0AH            ;计数10个100ms
         SETB    TR0                ;T/C0启动
         SETB    TR1                ;T/C1启动
         SETB    PT0                ;定时器0为高中断优先级
         SETB    ET0                ;开T/C0中断
         SETB    ET1                ;开T/C1中断
         SETB    EA                 ;CPU开中断
         NOP;
         CLR     P1.5
HE:      JNB     06H,HE
         CLR     P1.6               ;产生时1s时间到
         NOP                        ;产生负脉冲,封锁G2      
         SETB    P1.6
         CLR     TR0                ;关闭定时器
         CLR     TR1                ;关闭定时器
         LCALL   DATAP              ;调数据处理子程序
         LCALL   DIS                ;调显示子程序
         LCALL   SAVE               ;调存储子程序  
         LCALL   BAOJING            ;调报警子程序
         SJMP    MAIN
TIMER0:  MOV     TH0,3CH            ;T/C0中断服务程序
         MOV     TL0,# 0B0H
         DJNZ    R7,RE
         MOV     R7,0AH
         SETB    06H                ;1s定时时间到
RE:      RETI                       ;T/C0中断返回
CONTER1: RETI                       ;T/C1中断返回
DATAP:   MOV     R2,TH1             ;脉冲数
         MOV     R3,TL1
         MOV     R6,#00H
         MOV     R7,#60H
         AJMP    MULD
         LCALL   DIS
         MOV     R2,TH1
         MOV     R3,TL1
         MOV     R6,#00H
         MOV     R7,#33H
         AJMP    MULD
         LCALL   DIS1
         MOV     R1,#3CH
         SUBB    R1,R5                                                                                SADS.ASM(59): error A40: INVALID REGISTER   
         CJNE    R1,#00H,BAOJING
         RET
                 
BAOJING: MOV     TMOD,#01H             ;置T0为方式1外部计数
         MOV     TH0,#3CH              ;置寄存器初值
         MOV     TL0,#0B0H
         CLR     TF0                   ;定时器溢出清0
         SETB    TR0                   ;启动T0

MULD:    MOV     A,R3              ;计算R3乘R7
         MOV     B,R7
         MUL     AB
         MOV     R4,B              ;暂存部分积
         MOV     R5,A
         MOV     A,R3              ;计算R3乘R6
         MOV     B,R6
         MUL     AB
         ADD     A,R4              ;累加部分积
         MOV     R4,A
         CLR     A
         ADDC    A,B
         MOV     R3,A
         MOV     A,R2              ;计算R2乘R7
         MOV     B,R7
         MUL     AB
         ADD     A,R4              ;累加部分积
         MOV     R4,A
         MOV     A,R3
         ADDC    A,B
         MOV     R3,A
         CLR     A
         RLC     A
         XCH     A,R2              ;计算R2乘R6
         MOV     B,R6
         MUL     AB
         ADD     A,R3              ;累加部分积
         MOV     R3,A
         MOV     A,R2
         ADDC    A,B
         MOV     R2,A
         RET
DATAP1:   MOV     R4,TH1
         MOV     R5,TL1
         MOV     R7,#0FH
         LCALL   D457
D457:    CLR     C
         MOV     A,R4
         SUBB    A,R7
         JC      DV50
         SETB    OV                  ;商溢出
         RET  
DV50:    MOV     R0,#8               ;求平均值
DV51:    MOV     A,R5
         RLC     A
         MOV     R5,A
         MOV     A,R4
         RLC     A
         MOV     R4,A
         MOV     F0,C
         CLR     C
         SUBB    A,R7
         ANL     C,F0
         JC      DV52
         MOV     R4,A
DV52:    CPL     C
         MOV     A,R6
         RLC     A
         MOV     R6,A
         DJNZ    R0,DV51
         MOV     A,R4
         ADD     A,R4
         JC      DV53
         SUBB    A,R7
         JC      DV54
DV53:    INC     R6
DV54:    CLR     OV
         RET
DIS:     MOV     R3,#00H             ;字型码初始地址
LOOP:    MOV     R4,#0E8H            ;循环显示某个字符
DELAY:   ACALL   DISPLAY             ;显示
         DJNZ    R4,DELAY            ;延时时间未到继续
         INC     R3                  ;显示下个字符
         CJNE    R3,#0AH,LOOP        ;未显示到"9"继续  
         AJMP    DIS                 ;返回主程序   
DISPLAY: CLR     P2.0
         CLR     P2.1                ;选中第一位
         ACALL   DISP                ;显示
         ACALL   DELAY1              ;延时10ms
         SETB    P2.1                ;选中第二位
         ACALL   DISP   
         ACALL   DELAY1
         SETB    P2.0                ;选中第三位
         CLR     P2.1
         ACALL   DISP
         ACALL   DELAY1
         SETB    P2.0                ;选中第四位
         SETB    P2.1
         ACALL   DISP
         ACALL   DELAY1
         LCALL   EEPW
         LCALL   EEPR
         RET
DISP:    MOV     A,R3
         MOV     DPTR,#TABLE
         MOVC    A,@A+DPTR          ;查表  
         MOV     SBUF,A             ;送发送缓冲器
WAIT:    JNB     TI,WAIT            ;等待串行中断
         CLR     TI                 ;清中断标志
         RET
DELAY1:  MOV     R6,#10H            ;延时子程序
LOOP1:   MOV     R7,#38H
LOOP2:   DJNZ    R7,LOOP2
         DJNZ    R6,LOOP1
         RET
TABLE:   DB      0C0H,0F9H,0A4H,0B0H,99H
         DB      92H,82H,0F8H,80H,90H

KEY:     MOV     R0,#0FH
KEY1:    MOV     P1,R0                           
         MOV     A,P1                  ;输入键盘信息
         ANL     A,R0
         CLR     C
         SUBB    A,R0
         JZ      KEY1                  ;有键按下?
         ACALL   DELAY1                ;有,去抖动
         MOV     A,P1                  ;读键信息
         JNB     ACC.0,DIS             ;为0键按下,转DIS程序
         JNB     ACC.1,DIS1            ;为1键按下,转DIS 1程序
         SJMP    KEY

DIS1:    MOV     R3,#00H             ;字型码初始地址
LOOP3:   MOV     R4,#0E8H            ;循环显示某个字符
DELAY2:  ACALL   DISPLAY1            ;显示
         DJNZ    R4,DELAY2            ;延时时间未到继续
         INC     R3                  ;显示下个字符
         CJNE    R3,#0AH,LOOP1        ;未显示到"9"继续  
         AJMP    DIS1                ;返回主程序   
DISPLAY1:CLR     P2.2                ;选中第一位
         ACALL   DISP                ;显示
         ACALL   DELAY3              ;延时10ms
         SETB    P2.3                ;选中第二位
         ACALL   DISP   
         ACALL   DELAY3
         SETB    P2.4                ;选中第三位
         ACALL   DISP
         ACALL   DELAY3
         SETB    P2.5                ;选中第四位
         ACALL   DISP
         ACALL   DELAY3
         SETB    P2.6                ;选中第五位
         ACALL   DISP
         ACALL   DELAY3
         SETB    P2.7                ;选中第六位
         ACALL   DISP
         ACALL   DELAY3
         LCALL   EEPW
         LCALL   EEPR
         RET
DISP1:   MOV     A,R3
         MOV     DPTR,#TABLE
         MOVC    A,@A+DPTR           ;查表  
         MOV     SBUF,A              ;送发送缓冲器
WAIT1:   JNB     TI,WAIT1             ;等待串行中断
         CLR     TI                  ;清中断标志
         RET
DELAY3:  MOV     R6,#10H     
LOOP4:   MOV     R7,#38H
LOOP5:   DJNZ    R7,LOOP5
         DJNZ    R6,LOOP4
         RET

         SCL BIT P3.4                 ;定义24C16的串行时钟线
         SDA BIT P3.5                 ;定义24C16的串行数据线


SAVE:    LCALL   STAR                 ;调用
         MOV     R2,#08H              ;一个数据有8位
         MOV     DPTR,#0600H          ;定义源数据的位置
LOOP6:   MOV     A,#00H                           
         MOVC    A,@A+DPTR
         LCALL   SDATA
         LCALL   ACK
         JC      LOOP6
         INC     DPTR
         DJNZ    R2,LOOP6

         LCALL   STOP                 ;调用停止子程序

STAR:    SETB    SDA
         SETB    SCL
         NOP
         NOP
         NOP
         NOP
         CLR     SDA
         NOP
         NOP
         NOP
         NOP
         CLR     SCL
         RET

SDATA:   MOV     R0,#08H

LOOP7:   RLC     A
         MOV     SDA,C
         NOP
         NOP
         SETB    SCL
         NOP
         NOP
         NOP
         NOP
         CLR     SCL
         DJNZ    R0,LOOP7
         RET

ACK:     SETB    SDA
         NOP
         NOP
         SETB    SCL
         NOP
         NOP
         NOP
         NOP
         MOV     C,SDA
         CLR     SCL
         RET
STOP:    CLR     SDA
         NOP
         NOP
         NOP
         NOP
         SETB    SCL
         NOP
         NOP
         NOP
         NOP
         SETB    SDA
         NOP
         NOP
         NOP
         NOP
         RET
         ORG     0600H
         DB      0A0H,10H,01H,02H,03H,04H,05H,06H

                                       ;写串行E2PROM子程序EEPW

EEPW:    MOV     P1,#0FFH
         CLR     P1.0                  ;发开始信号
         MOV     A,R3                  ;送器件地址
         ACALL   SUBS
         MOV     A,R4                  ;送片内字节地址
         ACALL   SUBS
AGAIN:   MOV     A,@R1
         ACALL   SUBS                  ;调发送单字节子程序
         INC     R1
         DJNZ    R7,AGAIN              ;连续写n个字节
         CLR     P1.0                  ;SDA置0, 准备送停止信号
         ACALL   DELAY                 ;延时以满足传输速率要求
         SETB    P1.1                  ;发停止信号
         ACALL   DELAY
         SETB    P1.0
         RET
SUBS:    MOV     R0,#08H               ;发送单字节子程序
LOOP8:    CLR     P1.1
         RLC     A
         MOV     P1.0,C
         NOP
         SETB    P1.1
         ACALL   DELAY
         DJNZ    R0,LOOP8               ;循环8次送8个bit
         CLR     P1.1
         ACALL   DELAY
         SETB    P1.1
REP:     MOV     C,P1.0
         JC      REP                   ;判应答到否,未到则等待
         CLR     P1.1
         RET
DELAY4:   NOP
         NOP
         RET                           ;读串行E2PROM子程序EEPR

EEPR:    MOV     P1,#0FFH
         CLR     P1.0                  ;发开始信号
         MOV     A,R3                  ;送器件地址
         ACALL   SUBS                  ;调发送单字节子程序
         MOV     A,R4                  ;送片内字节地址
         ACALL   SUBS
         MOV     P1,#0FFH
         CLR     P1.0                  ;再发开始信号
         MOV     A,R3
         SETB    ACC.0                 ;发读命令
         ACALL   SUBS
MORE:    ACALL   SUBS
         MOV     @R1,A
         INC     R1
         DJNZ    R7,MORE
         CLR     P1.0
         ACALL   DELAY
         SETB    P1.1
         ACALL   DELAY
         SETB    P1.0                  ;送停止信号
         RET
SUBR:    MOV     R0,#08H               ;接受单字节子程序
LOOP9:   SETB    P1.1
         ACALL   DELAY
         MOV     C,P1.0
         RLC     A
         CLR     P1.1
         ACALL   DELAY        
         DJNZ    R0,LOOP9
         CJNE    R7,#01H,LW
         SETB    P1.0                  ;若是最后一个字节置A=1
         AJMP    SETOK
LW:      CLR     P1.0                  ;否则置A=0
SETOK:   ACALL   DELAY
         SETB    P1.1
         ACALL   DELAY
         CLR     P1.1
         ACALL   DELAY
         SETB    P1.0                  ;应答毕,SDA置1
         RET

LP1:     MOV     TF0,#0AH                                                                      SADS.ASM(385): error A48: DATA-ADDRESS EXPECTED
LP2:     JNB     TF0,LP2  
         MOV     TH0,#3CH              ;重置计数初值
         MOV     TL0,#0B0H
         CLR     TF0
         DJNZ    TF0,LP2                                                                              SADS.ASM(390): error A48: DATA-ADDRESS EXPECTED
         CPL     P1.0                  ;输出取反
         AJMP    LP1                   ;重复循环
         END


Build target 'Target 1'
assembling SADS.ASM...
SADS.ASM(59): error A40: INVALID REGISTER
SADS.ASM(385): error A48: DATA-ADDRESS EXPECTED
SADS.ASM(390): error A48: DATA-ADDRESS EXPECTED
Target not created

奖励1积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top