找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机1602汇编,调试乱码或者不显示

[复制链接]
ID:73992 发表于 2022-2-16 09:03 | 显示全部楼层 |阅读模式
程序目的是在 lcd1602 第一行最后一格显示字符  “A”
硬件p0口作为8位数据线
我调试了好几天了,要么满屏幕跑A,要么乱码,要么就不显示,
程序如下,请老师指导一下
EN                BIT                P2.7                         ;      程序主要目的是在lcd1602        在第一行最后一格显示A
RW                BIT                P2.5
RS                BIT                P2.6       
SJMP        MAIN
WRCMD:                                                        ;写指令程序,用R3寄存器中转指令值
                CLR                EN
                CLR                RS
                CLR                RW
                MOV                P0,R3                        ;将R3的值赋给P0口
                lcall        DE5MS
                SETB        EN                                ;使能
                NOP
                NOP
                NOP
                CLR                EN
                LCALL        DE5MS
                RET
WRDAT:                                                        ;写数据程序,用R4寄存器中转数据值
                CLR                EN
                SETB        RS
                CLR                RW
                MOV                P0,R4                        ;将R4的值赋给P0口
                lcall        DE5MS
                SETB        EN                                ;使能
                NOP
                NOP
                NOP
                CLR                EN
                LCALL        DE5MS
                RET
INIT:
                MOV                R3,#0X38                ;初始化程序       
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X38
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X38                       
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X38
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X08                       
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X01
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X06                       
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X0C
                LCALL        WRCMD
                LCALL        DE5MS
                RET
MAIN:                                                                ;主程序开始的地方
                                LCALL        INIT                ;调用初始化程序
                D1:               
                                LCALL        DE5MS
                                MOV                r3,#0X80        ;将lcd1602第一行07位地址0x80用r3寄存器转给p0口
                                LCALL        WRCMD
                                LCALL        DE5MS
                                MOV                r4,#0X41        ;将lcd1602第一行07位地址,要显示数据用r4寄存器转给p0口
                                LCALL        WRDAT
                                LCALL        DE5MS
                                SJMP  d1
DE5MS:        MOV                51H,#20                                ;延时程序
D2:                MOV                52H,#123
                DJNZ        52H,$
                DJNZ        51H,D2
                RET
END       

回复

使用道具 举报

ID:73992 发表于 2022-2-16 16:28 | 显示全部楼层
已经解决,是第一行地址没有加80h造成的
回复

使用道具 举报

ID:73992 发表于 2022-2-16 22:16 | 显示全部楼层
//修改后显示成功的程序如下
                                                        //本程序主要目的是在lcd1602        在第一行  第二行各显示一个字符//

EN                BIT                P2.7                         
RW                BIT                P2.5
RS                BIT                P2.6
                SJMP        MAIN
WRCMD:       
                lcall        DE5MS                ;这里要加延时,不然不显示
                CLR                EN
                CLR                RS
                CLR                RW
                MOV                P0,R3                ;将寄存器R3的值赋给P0口
                SETB        EN                        ;使能
                CLR                EN
                RET
WRDAT:                                               
                lcall        DE5MS                ; 这里要加延时,不然不显示
                CLR                EN
                SETB        RS
                CLR                RW
                MOV                P0,R4                ;将寄存器R4的值赋给P0口
                SETB        EN                        ;使能
                CLR                EN
                RET
INIT:
                MOV                R3,#0X38                ;初始化程序                   0x38要写两次以上,不然第二行不显示
                LCALL        WRCMD
                MOV                R3,#0X38                ;初始化程序       
                LCALL        WRCMD
                MOV                R3,#0X0c                       
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X06
                LCALL        WRCMD
                LCALL        DE5MS
                MOV                R3,#0X01                       
                LCALL        WRCMD
                LCALL        DE5MS
                RET
MAIN:                                                                ;主程序开始的地方
                                LCALL        INIT                ;调用初始化程序
                D1:               
                                MOV                R3,#0x80        ;将lcd1602第一行要显示的地址用r3寄存器转给p0口,第一行地址 80H+00H=80H起
                                LCALL        WRCMD
                                MOV                r4,#0x42        ;第一行显示字符数据        “B”
                                LCALL        WRDAT
                                MOV                R3,#0xc0        ;将lcd1602第二行位地址用r3寄存器转给p0口,第二行地址 80H+40H=C0H起
                                LCALL        WRCMD
                                MOV                r4,#0x41        ;第二行显示字符数据         "A"
                                LCALL        WRDAT
                                SJMP          $
DE5MS:        MOV                51H,#20                                ;延时程序
D2:                MOV                52H,#123
                DJNZ        52H,$
                DJNZ        51H,D2
                RET
END       
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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