原创 LCD1602的驱动程序

2007-11-27 16:46 5859 10 10 分类: MCU/ 嵌入式

  最近找到了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上显示不同的字符。


rar


 

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条