找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 707|回复: 2
收起左侧

请问为什么转换结果看不到啊,还有LCD上显示字符之后就消失了,只剩下数字

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
ID:1068447 发表于 2023-3-26 19:24 | 显示全部楼层 |阅读模式
仿真:
0.png
代码:
RS BIT P2.0
RW BIT P2.1
LCDE BIT P2.2

NUM EQU 30H        ;存放AD输出
TEMP EQU 20H        ;存放转换后的数字
        
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP ITX0
ORG 0100H
MAIN:
        SETB IT0        ;INT0为边沿出发触发
        SETB EA                ;开系统中断
        SETB EX0        ;开INT0中断
        MOV DPTR,#7FF8H        ;送入口地址并指向IN0
        MOVX @DPTR,A        ;启动A/D转换,A的值没有意义
HERE:
        LCALL CONVERT
        AJMP HERE        ;等待中断

//中断程序
ITX0:
        CLR EX0
        PUSH PSW        ;保护现场
        MOVX A,@DPTR        ;读取转换后的数字量
        MOV R1,A
        MOV 30H,R1
;        MOV DPTR,#7FF8H        ;重新赋值
;LOOP:
;        MOVX @DPTR,A        ;启动AD转换
;        POP PSW
        RETI        ;中断返回

//数据转换
CONVERT:
        MOV A,NUM
        MOV B,#51        ;AD转换结果转换成BCD码
        DIV AB
        MOV 22H,B        ;小数位
        ADD A,#25
        MOV B,#10
        DIV AB
        MOV 20H,A
        MOV 21H,B
        LCALL SHOW_CHAR
        LCALL SHOW_NUM
        JMP $
//显示字符串"Temp"
SHOW_CHAR:
        MOV R3,#4        ;字符串长度
        MOV DPTR,#TAB
        CLR A
        LCALL INIT_LCDE
        MOV R0,#80H        ;定位到LCDE的第一行开头
        LCALL WRITE_CODE
        LCALL DELAY
L1:
        MOVC A,@A+DPTR
        MOV R1,A
        LCALL WRITE_DATA
        LCALL DELAY
        INC DPTR
        CLR A
        DJNZ R3,L1
        RET
//将转换后的数据在LCD上显示出来
SHOW_NUM:
        MOV R3,#3
        MOV DPTR,#NUMB        ;获取转换后的数据的首地址
        CLR A
        LCALL INIT_LCDE
        MOV R0,#85H        ;定位到字符串后面
        LCALL WRITE_CODE
        LCALL DELAY
L2:        
        MOV R1,#20H
        MOV A,@R1
        MOVC A,@A+DPTR
        MOV R1,A
        LCALL WRITE_DATA
        LCALL DELAY
        INC R1
        CLR A
        DJNZ R3,L2
;RECOVER:
;        SETB EX0        ;显示完毕再次允许中断
        RET
        

//双重延迟函数
DELAY:
        MOV R6,#8
W2:        MOV R7,#248
W1:        DJNZ R7,W1
        DJNZ R6,W2
        RET
        
//指令函数,在调用之前,先将指令码放在R0中
WRITE_CODE:
        CLR LCDE        ;清除使能信号
        CLR RS
        CLR RW        ;RS=0,RW=0,写指令
        MOV P0,R0        ;送指令
        LCALL DELAY
        SETB LCDE        ;设置使能信号
        LCALL DELAY
        CLR LCDE
        RET

//数据函数,调用之前,先将数据放在R1中
WRITE_DATA:
        CLR LCDE        ;清除使能信号
        SETB RS
        CLR RW        ;RS=1,RW=0
        MOV P0,R1        ;送数据
        LCALL DELAY
        SETB LCDE        ;设置使能信号
        LCALL DELAY
        CLR LCDE
        RET

//初始化函数
INIT_LCDE:
        CLR LCDE
        MOV R0,#0
        MOV R0,#38H        ;设置16×2显示,5×7点阵,8位数据接口
        LCALL WRITE_CODE
        MOV R0,#0
        MOV R0,#0EH        ;设置开显示,不显示光标
        LCALL WRITE_CODE
        MOV R0,#0
        MOV R0,#06H        ;设置写一个字符后地址指针加一
        LCALL WRITE_CODE
        MOV R0,#0
        MOV R0,#01H        ;显示清零,数据指针清零
        LCALL WRITE_CODE
        RET

NUMB:        DB 30H,31H,31H,33H,34H,35H,36H,38H,39H        ;0123456789
TAB:        DB "Temp"

END

回复

使用道具 举报

ID:1068447 发表于 2023-3-26 19:28 | 显示全部楼层
仿真是这样的 屏幕截图 2023-03-26 192752.png

回复

使用道具 举报

ID:384109 发表于 2023-3-27 08:13 | 显示全部楼层
LCD的初始化在主程序里做一次就可以了,不用每次写入显示数据时都做
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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