|
剛學(xué)的匯編,想用匯編寫一個(gè)利用液晶顯示光敏數(shù)值的程序,液晶顯示部分的代碼沒什么問題正常顯示,燒錄到板子上顯示的好像是一些隨機(jī)的數(shù),pcf8591的讀取程序有點(diǎn)問題,應(yīng)該是發(fā)送一個(gè)字節(jié)數(shù)據(jù)或者接受數(shù)據(jù)部分的問題,但是我又看不出來是哪里的問題,所以想問讓各位大佬幫忙看一下,謝謝
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: //主函數(shù)
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讀取忙綠狀態(tài)
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: //輸入數(shù)據(jù)
LCALL READ_BUSY
SETB P1.0
CLR P1.1
MOV P0,DAT
SETB P2.5
CLR P2.5
RET
START1: //iic通訊起始信號(hào)
SETB SCL
SETB SDA
LCALL DELAY_5US
CLR SDA
LCALL DELAY_5US
RET
STOP: //停止信號(hào)
CLR SDA
SETB SCL
LCALL DELAY_5US
SETB SDA
LCALL DELAY_5US
RET
ACK: //應(yīng)答信號(hào)
SETB SCL
LCALL DELAY_5US
CLR SCL
RET
WRITE_BYTE: //寫入一個(gè)字節(jié)指令
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: //讀取一個(gè)字節(jié)數(shù)據(jù)
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: //讀取數(shù)據(jù)
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
|
|