刚学的汇编,想用汇编写一个利用液晶显示光敏数值的程序,液晶显示部分的代码没什么问题正常显示,烧录到板子上显示的好像是一些随机的数,pcf8591的读取程序有点问题,应该是发送一个字节数据或者接受数据部分的问题,但是我又看不出来是哪里的问题,所以想问让各位大佬帮忙看一下,谢谢
CMD EQU 40H
DAT EQU 41H
SDA EQU P2.0
SCL EQU P2.1
ORG 0H
JMP START
ORG 23H
JMP SERVER
START: //初始化
MOV SCON,#50H
MOV TMOD,#20H
MOV TH1,#0FAH
MOV TL1,#0FAH
SETB TR1
SETB EA
SETB ES
MOV DPTR,#SHOW
MOV CMD,#38H
LCALL WRITE_CMD
MOV CMD,#0CH
LCALL WRITE_CMD
MOV CMD,#01H
LCALL WRITE_CMD
MOV CMD,#06H
LCALL WRITE_CMD
LOOP: //主函数
LCALL SHOW_1602
LCALL READ_ADD
JMP LOOP
SHOW_1602: //液晶显示
MOV CMD,#80H
LCALL WRITE_CMD
MOV A,R5
MOV B,#10
DIV AB
MOV R4,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV DAT,A
LCALL WRITE_DAT
MOV A,B
MOVC A,@A+DPTR
MOV DAT,A
LCALL WRITE_DAT
MOV A,R4
MOVC A,@A+DPTR
MOV DAT,A
LCALL WRITE_DAT
RET
READ_BUSY: //1602读取忙绿状态
MOV P0,#0FFH
CLR P1.0
SETB P1.1
SETB P2.5
MOV R2,P0
CLR P2.5
MOV A,#80H
ANL A,R2
JNZ READ_BUSY
RET
WRITE_CMD: //输入指令
LCALL READ_BUSY
CLR P1.0
CLR P1.1
MOV P0,CMD
SETB P2.5
CLR P2.5
RET
WRITE_DAT: //输入数据
LCALL READ_BUSY
SETB P1.0
CLR P1.1
MOV P0,DAT
SETB P2.5
CLR P2.5
RET
START1: //iic通讯起始信号
SETB SCL
SETB SDA
LCALL DELAY_5US
CLR SDA
LCALL DELAY_5US
RET
STOP: //停止信号
CLR SDA
SETB SCL
LCALL DELAY_5US
SETB SDA
LCALL DELAY_5US
RET
ACK: //应答信号
SETB SCL
LCALL DELAY_5US
CLR SCL
RET
WRITE_BYTE: //写入一个字节指令
MOV R6,#8
MOV A,R7
D4:
RLC A
MOV SDA,C
CLR SCL
LCALL DELAY_5US
SETB SCL
LCALL DELAY_5US
DJNZ R6,D4
CLR SCL
SETB SDA
RET
READ_BYTE: //读取一个字节数据
MOV R6,#8
D5:SETB SCL
LCALL DELAY_5US
MOV C,SDA
RLC A
CLR SCL
LCALL DELAY_5US
MOV R5,A
DJNZ R6,D5
CLR SCL
SETB SDA
RET
READ_ADD: //读取数据
LCALL START1
MOV R7,#90H+0
LCALL WRITE_BYTE
LCALL ACK
MOV R7,#0
LCALL WRITE_BYTE
LCALL ACK
LCALL START1
MOV R7,#90H+1
LCALL WRITE_BYTE
LCALL ACK
LCALL READ_BYTE
LCALL STOP
RET
SHOW:
DB 30H
DB 31H
DB 32H
DB 33H
DB 34H
DB 35H
DB 36H
DB 37H
DB 38H
DB 39H
DELAY_1MS:
MOV R0,#2
D1: MOV R1,#250
DJNZ R1,$
DJNZ R0,D1
RET
DELAY_5US:
NOP
NOP
NOP
RET
SERVER:
END
|