主题:[原创]我的第一个程序,错在哪儿啊?求高手给指点迷津
我想用AT89S52和24LC256做的可学习型的控制器,24LC256接在P1口,P0.P2口下拉10K排阻,并且P0.0~P2.7到V+接16个按钮,P1.0,P1.1到V+上拉10K,到地接自锁开关K1,P1.1接K2.P1.2接SDA,1.3接SCL,P1.4接RW
工作过程如下:K1闭合(P1.1为高),程序间隔250毫秒不断读P0~P2口,将其值写入24LC256(学习过程).当读到P1.1 为低时停止学习,K2闭合,程序间隔250毫秒按学习的顺序读24LC256的值,对应的放到P0~P2口,一直读到最后P2.7为高的值后,反回循环.
我刚学汇编,编到读的过程就用KEIL编译试一下 ,可是到有???号的那行就不行了,我实在找不到毛病了,求高帮忙看下,求求求
ORG 0000H
MOV P0,#00H
MOV P1,#0FFH
MOV P2,#00H
SDA BIT P1.2
SCL BIT P1.3
RW BIT P1.4
MOV R1,#0000H
START: JB P1.1,START1;去写
START1: MOV R5,P0;读P0写到256
ACALL EEPW
MOV R5,#00H
MOV R5,P2 ;读P2写到256
ACALL EEPW
MOV R5,#00H
ACALL DELAY250 ;延时250ms
JNB P1.1,START
RET
DELAY250:MOV R2,#25
D1: MOV R4,#20
D2: MOV R6,#248
DJNZ R6,$
DJNZ R4,D2
DJNZ R2,D1
RET
;写串行E2PROM子程序EEPW
; R3=10100000(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数8
EEPW: MOV R7,#08H
MOV R3,#0B0H
MOV P1,#0FFH
ACALL DELAY
CLR P1.2;发开始信号
ACALL DELAY
MOV A,R3 ;送器件地址??????
ACALL SUBS
AGAIN: JNC R1
MOV A,R1
ACALL SUBS ;调发送单字节子程序INC R1
DJNZ R7,AGAIN;连续写n个字节
MOV A,R5 ;送片P0.P2
ACALL SUBS
CLR SDA ;SDA置0, 准备送停止信号
ACALL DELAY ;延时以满足传输速率要求
SETB SCL ;发停止信号
ACALL DELAY
SETB SDA
RET
SUBS: MOV R0,#08H ;发送单字节子程序
LOOP: CLR SCL
RLC A
MOV SDA,C
NOP
NOP
NOP
NOP
SETB SCL
ACALL DELAY
DJNZ R0,LOOP ;循环8次送8个bit
CLR SCL
ACALL DELAY
SETB SDA
REP: MOV C,SDA
JC REP ;判应答到否,未到则等待
CLR SCL
RET
DELAY:NOP
NOP
NOP
NOP
RET
GND
工作过程如下:K1闭合(P1.1为高),程序间隔250毫秒不断读P0~P2口,将其值写入24LC256(学习过程).当读到P1.1 为低时停止学习,K2闭合,程序间隔250毫秒按学习的顺序读24LC256的值,对应的放到P0~P2口,一直读到最后P2.7为高的值后,反回循环.
我刚学汇编,编到读的过程就用KEIL编译试一下 ,可是到有???号的那行就不行了,我实在找不到毛病了,求高帮忙看下,求求求
ORG 0000H
MOV P0,#00H
MOV P1,#0FFH
MOV P2,#00H
SDA BIT P1.2
SCL BIT P1.3
RW BIT P1.4
MOV R1,#0000H
START: JB P1.1,START1;去写
START1: MOV R5,P0;读P0写到256
ACALL EEPW
MOV R5,#00H
MOV R5,P2 ;读P2写到256
ACALL EEPW
MOV R5,#00H
ACALL DELAY250 ;延时250ms
JNB P1.1,START
RET
DELAY250:MOV R2,#25
D1: MOV R4,#20
D2: MOV R6,#248
DJNZ R6,$
DJNZ R4,D2
DJNZ R2,D1
RET
;写串行E2PROM子程序EEPW
; R3=10100000(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数8
EEPW: MOV R7,#08H
MOV R3,#0B0H
MOV P1,#0FFH
ACALL DELAY
CLR P1.2;发开始信号
ACALL DELAY
MOV A,R3 ;送器件地址??????
ACALL SUBS
AGAIN: JNC R1
MOV A,R1
ACALL SUBS ;调发送单字节子程序INC R1
DJNZ R7,AGAIN;连续写n个字节
MOV A,R5 ;送片P0.P2
ACALL SUBS
CLR SDA ;SDA置0, 准备送停止信号
ACALL DELAY ;延时以满足传输速率要求
SETB SCL ;发停止信号
ACALL DELAY
SETB SDA
RET
SUBS: MOV R0,#08H ;发送单字节子程序
LOOP: CLR SCL
RLC A
MOV SDA,C
NOP
NOP
NOP
NOP
SETB SCL
ACALL DELAY
DJNZ R0,LOOP ;循环8次送8个bit
CLR SCL
ACALL DELAY
SETB SDA
REP: MOV C,SDA
JC REP ;判应答到否,未到则等待
CLR SCL
RET
DELAY:NOP
NOP
NOP
NOP
RET
GND