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

2007-11-19 22:34 4249 6 11 分类: 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,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上显示不同的字符。


点击下载


 

文章评论5条评论)

登录后参与讨论

用户43679 2010-10-7 00:43

XIEXIE  !~

用户17091 2009-6-9 15:02

对初学者有很大的帮助,多多发扬贡献精神

用户36743 2009-6-6 17:14

很好,但是能给点汉字显示的就好了。

用户869399 2009-4-17 13:23

谢谢!

用户394551 2007-11-22 10:31

真好啊,能学习到好多东西
相关推荐阅读
用户1341432 2007-12-13 21:39
80C51 汇编指令集
经本人整理,此指令集含80C51的汇编指令与内部储存单元分配表,常用控制寄存器的使用说明。...
用户1341432 2007-12-07 16:04
能显示并读写EDN-51实验板24C04的应用程序(汇编语言)
经几天的努力,终于搞出来了。这个程序在仿真软件与EDN-51实验板上均已通过。24C0 共有512个储存单元,所以它的地址为0000H--01FFH。此程序把#00H写入0000H地址,每写一个地址加...
用户1341432 2007-12-03 21:13
欢迎加入网友自己组建的电子论坛网站
欢迎加入网友自己组建的电子论坛网站。本网站由电子爱好者自己组建,内设单片机 Proteus 仿真版块、Keil 软件应用版块、嵌入式系统应用版块、单片机编程版块、工控技术交流版块、Protel 软件应...
用户1341432 2007-11-27 19:53
能显示并读写EDN-51实验板24C02的应用程序(汇编语言)
经几天的努力,终于搞出来了。这个程序在仿真软件与EDN-51实验板上均已通过。24C0 2共有256个储存单元,所以它的地址为00H--FFH。此程序把#00H写入00H地址,每写一个加一,直写到FF...
用户1341432 2007-11-11 23:13
4位八段数码管的十进制加计数仿真(汇编语言)改进版
本人按照EDN-51实验板的线路,做了个4位八段数码管的十进制加计数仿真实验,程序采用汇编语言编写。此程序在仿真软件上与EDN-51实验板上均通过。仿真图中的数码管位驱动采用74HC04,如按EDN-...
我要评论
5
6
关闭 站长推荐上一条 /2 下一条