|
发表于 2018-1-9 13:32:54
楼主|
代码:
RS EQU P2.0 ;引入p2.0位为命令数据引脚
RW EQU P2.1 ;引入读写选择引脚
E EQU P2.2 ;引入使能端
OPEN EQU P2.3 ;引入显屏的开关端
ORG 0000H
AJMP MAIN
ORG 0003H ;外部中断0入口
AJMP INTO
ORG 0030H
MAIN:
SETB EX0 ;允许中断0
SETB EA ;中断总开关
CLR IT0 ;外部中断0方式为低电平
ACALL KS ;开关机检查
ACALL INITIAL ;显屏模块初始化
ACALL DISPLAY2 ;调用液晶显示子程序
AJMP MAIN
KS: JB OPEN,KS_END ;open键按下走程序,没按下等待
AJMP KS
KS_END:
RET
INITIAL:
MOV R0,#33 ;最长字符串的长度
MOV A,#01H ;清屏
ACALL WR_CODE ;(指令写入显屏)
MOV A,#38H ;工作方式的设置(8位数据接口、两行显示、5X8点阵字符)
ACALL WR_CODE
MOV A,#0CH ;显示开关的设置(显示开、光标不显示、光标不闪烁)
ACALL WR_CODE
MOV A,#06H ;进入模式设置(写入新数据后光标左移、显示不移动)
ACALL WR_CODE
RET
DISPLAY2:
MOV A,#0C0H ;第二行第1个点
ACALL WR_CODE ;写指令
MOV DPTR, #JUZI ;定义第二行字符串首地址
ACALL PR_STR1 ;取数据
ACALL WR_DATA1 ;写P1口数据进入指令
MOV A,#82H ;第一行第2个点
ACALL WR_CODE ;写指令
MOV DPTR, #JUZI1 ;定义第一行字符串首地址
ACALL PR_STR1 ;取数据
ACALL WR_DATA1 ;写P1口数据进入指令
DISP1:
MOV A,#1CH ;字符左移命令
ACALL WR_CODE
ACALL DELAY1 ;延时移动
DJNZ R0,DISP1 ;第二行(最长行)是否移动结束?结束重新循环
RET
WR_CODE: ;RS=0 RW=0 写显屏指令
MOV P1,A
CLR RS
CLR RW
CLR E
LCALL DELAY
SETB E
RET
WR_DATA1: ;RS=1 RW=0 写数据到DDRAMZ指令
MOV P1, A
SETB RS ;写入数据
CLR RW
CLR E
LCALL DELAY ;判断液晶模块是否忙
SETB E
RET
PR_STR1: ;逐个读出字符串数据
CLR A
MOVC A, @A+DPTR
JZ END_PR1
ACALL WR_DATA1
INC DPTR
AJMP PR_STR1
END_PR1:
RET
INTO:
MOV A,#01H ;开关松开清屏
ACALL WR_CODE
RETI
DELAY:
MOV P1,#0FFH ;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,DELAY ;如果P1.7为高电平表示忙就循环等待
RET
DELAY1: MOV R7,#25 ;延时函数
DELAY2: MOV R6,#100
DELAY3: MOV R5,#50
DELAY4: DJNZ R5,DELAY4
DJNZ R6,DELAY3
DJNZ R7,DELAY2
RET
JUZI: ;第二行字符串
DB ' Hello everone! Welcome to Harbin',00H
JUZI1: ;第一行字符串
DB ' 3115000698 ',00H
END
|
|