最近找到了LCD1602的驱动程序,经本人整理把常用的驱动子程序现上传给大家,希望能对大家有用。此程序以EDN的51实验板为基础,数据口为P0,控制口为P1。
程序共有9段,START为主程序,INSE为中断服务子程序,INIT为LCD显示模式设置子程序,QLCD为清屏子程序,WIR为写指令子程序,WDR为写数据子程序,CKLCD为查LCD空闲子程序,STS00为延时子程序,PWDR为批量写数据子程序。
程序如下:
RS BIT P1.0
RW BIT P1.1
E BIT P1.2
ORG 0000H
AJMP START
ORG 000BH
AJMP INSE
ORG 0100H ;程序地址
START: MOV TMOD,#00H ;设置计时/计数模式
MOV TL0,#00H ;#00H-->计时0低位
MOV TH0,#00H ;#00H-->计时0高位
SETB EA ;开中断
SETB ET0 ;中断使能
SETB TR0 ;计时0开绐
MOV 50H,#32H ;#32H-->50H
MOV SP,#60H ;#60h-->SP 地址指针
ACALL INIT ;调 INIT 子程序 ( LCD 模式设置)
ACALL QLCD ;调清屏子程序
MOV A,#80H ;#80H-->A (设LCD地址第一行第一列)
ACALL WIR ;调写IR子程序
MOV DPTR,#L1 ;#L1-->DPTR
ACALL PWDR ;调批量写DR子程序
MOV A,#0C0H ;#0C0H-->A (设LCD地址第二行第一列)
ACALL WIR ;调写 IR 子程序
MOV DPTR,#L2 ;#L2-->DPTR
ACALL PWDR ;调批量写DR子程序
LOOP: AJMP LOOP ;转LOOP
INSE: MOV TL0,#00H ;#00H-->计时0低位
MOV TH0,#00H ;#00H-->计时0高位
DJNZ 50H,INSE0 ;50H-1 不等于0转INSE0
MOV 50H,#32H ;#32H-->50H
INSE0: RETI ;中断返回
INIT: MOV A,#38H ;#38H-->A (使用8Bits汇流排,显示2行5*7字符)
LCALL WIR ;调写IR子程序
MOV A,#0EH ;#0EH-->A (显示开,光标开,光标闪烁)
LCALL WIR ;调写IR子程序
MOV A,#06H ;#06H-->A (字符不动,光标自动右移一格)
LCALL WIR ;调写IR子程序
RET ;返回
CKLCD: PUSH Acc ;Acc进栈
CK00: CLR RS ;RS 清 0
SETB RW ;RW 置 1
CLR E ;E 清 0
SETB E ;E 置 1
MOV A,P0 ;P0-->A
CLR E ;E 清 0
JB Acc.7,CK00 ;Acc.7=1 转 CK00
POP Acc ;Acc 出栈
ACALL STS00 ;调延时子程序 STS00
RET ;返回
WIR: ACALL CKLCD ;调查空闲子程序
CLR E ;E 清 0
CLR RS ;RS 清 0
CLR RW ;RW 清 0
SETB E ;E 置 1
MOV P0,A ;A-->P0
CLR E ;E 清 0
RET ;返回
WDR: ACALL CKLCD ;调查空闲子程序
CLR E ;E 清 0
SETB RS ;RS 置 1
CLR RW ;RW 清 0
SETB E ;E 置 1
MOV P0,A ;A-->P0
CLR E ;E 清 0
RET ;返回
STS00: MOV 52H,#05H ;#05H-->52H
STS001: MOV 51H,#0F8H ;#0F8H-->51H
DJNZ 51H,$ ;51H-1不等于0转再-1
DJNZ 52H,STS001 ;51H-1不等于0转STS001
RET ;返回
QLCD: MOV A,#01H ;#01H-->A
ACALL WIR ;调写IR子程序
RET ;返回
PWDR: PUSH Acc ;Acc进栈
PWDR1: CLR A ;A 清 0
MOVC A,@A+DPTR ;A+DPTR-->A
JZ PEND ;A=0 转 PEND
ACALL WDR ;调写DR子程序
INC DPTR ;DPTR+1
AJMP PWDR1 ;转 PWDR1
PEND: POP Acc ;Acc 出栈
RET ;返回
L1: DB 20H,4EH,61H,74H,69H,65H,62H,20H
DB 45H,6CH,65H,63H,74H,72H,6FH,6EH,00H
L2: DB 7EH,6EH,61H,74H,69H,65H,6DH,40H
DB 32H,31H,63H ,6EH,2EH,63H,6FH,6DH,00H
END
此程序已在仿真与EDN-51实验板上通过,只要把L1与L2的数据改动一下,就能在LCD上显示不同的字符。
文章评论(0条评论)
登录后参与讨论