日志档案

发表于 2007-11-19 22:34:58

2

标签: 无标签

LCD1602常用驱动子程序(汇编语言)

最近找到了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,45H,6CH

                         ,65H,63H,74H,72H,6FH,6EH,00H
L2:          DB      7EH,6EH,61H,74H,69H,65H,6DH,40H,32H,31H,63H

                         ,6EH,2EH,63H,6FH,6DH,00H
               END

此程序已在仿真与EDN-51实验板上通过,只要把L1与L2的数据改动一下,就能在LCD上显示不同的字符。

点击下载

 

系统分类: 单片机   |   用户分类: 51单片机学习心得   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(962)    回复(1)  

投一票您将和博主都有获奖机会!

最新评论

  • 查理

    2007-11-22 10:31:33

    真好啊,能学习到好多东西