找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1680|回复: 1
打印 上一主题 下一主题
收起左侧

单片机汇编利用pcf8591读取光敏数据,显示不正确

[复制链接]
跳转到指定楼层
楼主
ID:481844 发表于 2019-8-2 22:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚学的汇编,想用汇编写一个利用液晶显示光敏数值的程序,液晶显示部分的代码没什么问题正常显示,烧录到板子上显示的好像是一些随机的数,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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2019-8-3 10:06 | 只看该作者
建议用PROTEUS画出图来,用KEIL+PROTEUS仿真调试检查,学会了仿真调试,什么问题能能解决了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表