【若能解决,私下给与一定酬谢】里程表汇编程序编译出现3处错误,恳请各位前辈帮忙

2019-03-24 18:05发布

修改了两天,还剩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

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
dg378804
2019-03-25 23:15
ltbytyn 发表于 2015-3-23 13:32
MOV     R1,#3CH
SUBB    R1,R5           //错误,应该为   SUBB  A,Rn  
--------------------------
看你程序意思,应该改为
MOV     A,#3CH
SUBB    A,R5
MOV     R1,A

谢谢前辈,这个问题已解决,剩下最后两处错误需要怎么修改

一周热门 更多>