📄 1602lcdtestprocedure.asm
字号:
/*
2008年12月20日
1602LCD 测试程序
参考:伟纳电子 1602LCD 技术文档
接口说明:
8051与1602接口可以采用总线模式。
MCU 读/写信号通过与非门接 1602的使能信号端E; RS接P1.3;RW接P1.4。
MCU P0接1602数据口,同时接上拉电阻。
// 1602读操作逻辑:WR=1,E=1;写操作逻辑:WR=0,E为高脉冲(~下降沿~)
子程序说明:
BF 检测忙标志BF
WI 写IR。入口参数:R1
WD 写DR。入口参数:R2
DELAY 延时65ms
INI 指令初始化模块
WDD 写显示字符的字符码到DDRAM
START 显示主程序
*/
//-------------------------------------------------------------------------------
//-----------------------------------------------------------
//0 显示主程序
//-----------------------------------------------------------
RS EQU P1.3
RW EQU P1.4
ORG 0000H
/*
测试主程序1:显示一个字符'A'
测试对象:INI BF WI WD
START:
LCALL INI
LCALL BF
MOV R1, #80H // 第一行首字字母
LCALL WI
LCALL BF
MOV R2,#41H // 字符'A'
LCALL WD
SJMP $
*/
// 测试主程序2:显示两行字符
// 测试对象:WDD
START:
LCALL INI
LCALL WDD
SJMP $
//-----------------------------------------------------------
//1 忙检测子程序
//-----------------------------------------------------------
/*
为什么这个BF不行,它会使程序挂起~!
BF:
CLR A
MOVX A, @R0
JB ACC.7, BF
RET
*/
// SB,又怀疑是不是软件问题~! 打住!先看看1602使用说明...
// 1602读操作逻辑:RS=0,RW=1,E高电平
BF:
clr rs
setb rw // 如果写成 CLR RW,也会挂起哦~
CLR A
MOVX A, @R0
JB ACC.7, BF
RET
//不测试BusyFlag,这个程序实际上是个延时程序。
//BF:
//lcall delay // 如果把这句注释起来,即BF直接返回,只能显示一行字符~~~
//RET
//-----------------------------------------------------------
//2 写数据到指令寄存器IR
//入口参数:R1 暂存指令码
//-----------------------------------------------------------
WI:
CLR RS
CLR RW
MOV A, R1
MOVX @R0, A
RET
//-----------------------------------------------------------
//3 写数据到数据寄存器DR
//入口参数:R2 暂存字符码或字符字模数据
//-----------------------------------------------------------
WD:
SETB RS
CLR RW
MOV A, R2
MOVX @R0, A
RET
//-----------------------------------------------------------
//4 延时65ms
//-----------------------------------------------------------
DELAY:
MOV R7, #0FH
LOOP0:MOV R6, #0FFH
DJNZ R6, $
DJNZ R7, LOOP0
RET
//-----------------------------------------------------------
//5 指令初始化模块
// 初始化对象和内容:
// ______________RS_RW_D7_D6_D5_D4_D3_D2_D1_D0_________________
// |清屏 |0 0 0 0 0 0 0 0 0 1
// |功能设置 |0 0 0 0 0 0 1 DL N F
// |显示开关控制 |0 0 0 0 1 D C B * *
// |输入方式 |0 0 0 0 0 0 0 1 I/D S
// |_____________|____________________________
// 我只知道初始化有以上4部分,内容可根据需要设定。
//-----------------------------------------------------------
INI:
MOV R3, #03h // 不知道为什么要3次
MOV R1, #38H // FUNCTION SET
LCALL WI
MOV R1, #01H // DISPLAY CLEAR
LCALL BF
LCALL WI
MOV R1, #06H // INPUT MODE SET
LCALL BF
LCALL WI
MOV R1, #0CH // DISPLAY ON/OFF SET
LCALL BF
LCALL WI
/* 上面的过程只进行一次也可以~
MOV R1, #38H // FUNCTION SET
LCALL BF
LCALL WI
MOV R1, #01H // DISPLAY CLEAR
LCALL BF
LCALL WI
MOV R1, #06H // INPUT MODE SET
LCALL BF
LCALL WI
MOV R1, #0CH // DISPLAY ON/OFF SET
LCALL BF
LCALL WI
*/
RET
//-----------------------------------------------------------
//6 写显示字符的字符码到DDRAM
// 伟纳电子 1602LCD 技术文档里的那个程序~不明白什么意思,我自己写了个WDD
//-----------------------------------------------------------
WDD:
MOV DPTR, #0300h
MOV R4, #16
MOV R1, #80H // 第一行
LCALL BF
LCALL WI
LOOP1:CLR A
MOVC A, @A+DPTR
INC DPTR
MOV R2, A
LCALL BF
LCALL WD
DJNZ R4, LOOP1
MOV R4, #16
MOV R1, #0C0H // 第二行
LCALL BF
LCALL WI
LOOP2:CLR A
MOVC A, @A+DPTR
INC DPTR
MOV R2, A
LCALL BF
LCALL WD
DJNZ R4, LOOP2
RET
//-----------------------------------------------------------
//9 显示字符的字符码表
//-----------------------------------------------------------
ORG 0300H
DB "0123456789ABCDEF"
DB " PZ:HELLO,1602! "
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -