标题: 单片机汇编利用pcf8591读取光敏数据,显示不正确 [打印本页]

作者: 心灵的尘埃    时间: 2019-8-2 22:15
标题: 单片机汇编利用pcf8591读取光敏数据,显示不正确
刚学的汇编,想用汇编写一个利用液晶显示光敏数值的程序,液晶显示部分的代码没什么问题正常显示,烧录到板子上显示的好像是一些随机的数,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


作者: csmyldl    时间: 2019-8-3 10:06
建议用PROTEUS画出图来,用KEIL+PROTEUS仿真调试检查,学会了仿真调试,什么问题能能解决了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1