修改了两天,还剩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
此帖出自
小平头技术问答
谢谢前辈,这个问题已解决,剩下最后两处错误需要怎么修改
剩的地方是程序有问题,不是普通错误。这要根据程序改。这就要看你程序的设计思想了。
TF0是位。不能和DJNZ用。
公司禁用QQ,所以我平时也不大玩Q了。有具体问题,可以在论坛留言
一周热门 更多>