找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2172|回复: 8
收起左侧

单片机怎么读HD44780里面的固有字符,汇编语言,软件仿真

[复制链接]
ID:708783 发表于 2020-3-31 09:45 | 显示全部楼层 |阅读模式
本帖最后由 BSq 于 2020-4-1 12:32 编辑

最近在学习LCD模块,这个也是我用仿真软件edsim51做的仿真,这个是显示我写在CGRAM的字符,如果显示它的固有的符号(就是CGROM里面的字符怎么读出来)比如显示1,怎么改动?
源程序
; 初始化显示
; 详见指令集
CLR P1.3                  ; 清零寄存器选择RS1为数据,0为命令/状态)表示指令正在发送到模块
; 功能设置
CLR P1.7                 ; |
CLR P1.6                 ; |
SETB P1.5         ; |
CLR P1.4                 ; | 高半字节P1.4-P1.7DL=18位数据接口;DL=04位数据

SETB P1.2         ; |
CLR P1.2                 ; | 使能信号E的下降沿

CALL delay         ; 等待忙标志BF清零
        ; 首次发送的函数集-告诉模块进入4位模式
; 为什么函数集为高半字节发送两次?见HD447804位操作
SETB P1.2         ; |
CLR P1.2                 ; | 使能信号E的下降沿
        ; 第二次发送相同的函数集高半字节P1.4-P1.7

SETB P1.7         ; 低半字节(N=1,2行显示;N=01行显示)

SETB P1.2         ; |
CLR P1.2                 ; | 使能信号E的下降沿
        ; 发送低半字节函数集

CALL delay         ; 等待忙标志BF清零


; 设置输入方式(光标和显示模式)
; 设置为不移动的地址指针加1
CLR P1.7                 ; |
CLR P1.6                 ; |
CLR P1.5                 ; |
CLR P1.4                 ; | 高半字节

SETB P1.2         ; |
CLR P1.2                 ; | 使能信号E的下降沿

SETB P1.6         ; |
SETB P1.5         ; | 低半字节

SETB P1.2         ; |
CLR P1.2                 ; | 使能信号E的下降沿

CALL delay         ; 等待忙标志BF清零


; 设置显示开/关及光标闪烁
; 显示器打开,光标打开,闪烁关闭
CLR P1.7                 ; |
CLR P1.6                 ; |
CLR P1.5                 ; |
CLR P1.4                  ; | 高半字节

SETB P1.2         ; |
CLR P1.2                 ; | 使能信号E的下降沿

SETB P1.7         ; |
SETB P1.6         ; |
SETB P1.5         ; | 低半字节

SETB P1.2         ; |
CLR P1.2                 ; | 使能信号E的下降沿

CALL delay          ; 等待忙标志BF清零


; 将欧元符号放入RAM
MOV 30H, #110B ;   **
MOV 31H, #1001B ;  *  *
MOV 32H, #11110B ; ****
MOV 33H, #1000B ;  *
MOV 34H, #11110B ; ****
MOV 35H, #1001B ;  *  *
MOV 36H, #110B ;   **
MOV 37H, #0 ; | 数据结束(在本例中,0可用于指示数据结束,因为没有行本身包含0


; 设置CG RAM地址
; 设置为字符4,行0(地址100000 B=20H
CLR P1.7                 ; |
SETB P1.6         ; |
SETB P1.5         ; |
CLR P1.4                 ; | 高半字节

SETB P1.2          ; |
CLR P1.2                 ; | 使能信号E的下降沿

CLR P1.6                 ; |
CLR P1.5                 ; | 低半字节

SETB P1.2         ; |
CLR P1.2                 ; | 使能信号E的下降沿

CALL delay         ; 等待忙标志BF清零


; 将欧元符号发送到CGRAM
SETB P1.3 ; 置位寄存器选择RS-表示数据正在发送到模块
MOV R1, #30H ; 指向第一行,在8051 RAM位置30H
loop:
MOV A, @R1 ; R1指向单元中的数据传送至A
JZ endEuroEntry ; 如果A0,则已到达数据结尾-跳出循环
CALL sendCharacter ; 将当前行发送到LCD模块
INC R1 ; 指向下一行
JMP loop         ; 跳回loop

endEuroEntry:


; 设置DDRAM地址
; 设置为0
CLR P1.3                 ; 清零寄存器选择RS—表示指令正在发送到模块

SETB P1.7         ; |
CLR P1.6                 ; |
CLR P1.5                 ; |
CLR P1.4                  ; | 高半字节

SETB P1.2          ; |
CLR P1.2                 ; | 使能信号E的下降沿

CLR P1.7                 ; | 低半字节

SETB P1.2          ; |
CLR P1.2                 ; | 使能信号E的下降沿

CALL delay         ; 等待忙标志BF清零


; 显示欧元符号(通过发送4DDRAM
SETB P1.3 ; 置位寄存器选择RS-表示数据正在发送到模块
MOV A, #4 ; | 现在A中是4CGRAM中的数据
CALL sendCharacter ; | 将显示位置4(即:欧元符号)



JMP $          ; 程序结束-不执行任何操作



; 发送字符子程序

sendCharacter:
MOV C, ACC.7         ; |
MOV P1.7, C ; |
MOV C, ACC.6         ; |
MOV P1.6, C ; |
MOV C, ACC.5         ; |
MOV P1.5, C ; |
MOV C, ACC.4         ; |
MOV P1.4, C ; | 高半字节

SETB P1.2 ; |
CLR P1.2         ; | 使能信号E的下降沿

MOV C, ACC.3         ; |
MOV P1.7, C ; |
MOV C, ACC.2         ; |
MOV P1.6, C ; |
MOV C, ACC.1         ; |
MOV P1.5, C ; |
MOV C, ACC.0         ; |
MOV P1.4, C ; | 低半字节

SETB P1.2 ; |
CLR P1.2         ; | 使能信号E的下降沿

CALL delay ; 等待忙标志BF清零

delay:
MOV R0, #50
DJNZ R0, $
RET
(小白一个,大佬莫怪@-@,前几次没看到有奖励,这次设置一下,谢谢各位了)
回复

使用道具 举报

ID:584814 发表于 2020-3-31 16:41 | 显示全部楼层
非得汇编就只能问学校老师了,工作的一般都不用了,C的程序网上多些
回复

使用道具 举报

ID:708783 发表于 2020-3-31 22:46 | 显示全部楼层
man1234567 发表于 2020-3-31 16:41
非得汇编就问学校老师好了,C的程序网上多些

就是没有老师呀

怎么办呀
回复

使用道具 举报

ID:201555 发表于 2020-4-1 07:50 来自触屏版 | 显示全部楼层
11 mov 30h,#110B,mov 36h,#110Bе110B1
回复

使用道具 举报

ID:201555 发表于 2020-4-1 22:49 | 显示全部楼层
修改“mov 30,#110B…mov  36h,#110B”,将#110B,…换成“1”对应的段码。
回复

使用道具 举报

ID:708783 发表于 2020-4-2 19:06 | 显示全部楼层
www12www 发表于 2020-4-1 22:49
修改“mov 30,#110B…mov  36h,#110B”,将#110B,…换成“1”对应的段码。

固有字符
回复

使用道具 举报

ID:201555 发表于 2020-4-4 15:32 | 显示全部楼层
仿照显示欧元符号的方法,把显示部分改成一个汇编语言的函数,cgram与ddram的地址可以变化,想显示1的位置改变cgram与ddram的相应值,把1的显示码通过函数调用的方式(lcall 函数名)传过去就可以了。
回复

使用道具 举报

ID:727790 发表于 2020-4-12 20:58 | 显示全部楼层
怎么显示字符串
回复

使用道具 举报

ID:727790 发表于 2020-4-12 21:04 | 显示全部楼层
www12www 发表于 2020-4-1 22:49
修改“mov 30,#110B…mov  36h,#110B”,将#110B,…换成“1”对应的段码。

怎么显示字符串
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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