LCD12864的串口驱动(asm/c51)
串行数据传送共分三个字节完成:
第一字节:串口控制—格式 11111ABC
A 为数据传送方向控制:H 表示数据从LCD 到MCU,L 表示数据从MCU 到LCD
B 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令
C 固定为0
第二字节:(并行)8 位数据的高4 位—格式 DDDD0000
第三字节:(并行)8 位数据的低4 位—格式 0000DDDD
串行接口时序参数:(测试条件:T=25℃ VDD=4.5V)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2. 串口程序
PSB 接低时,串口模式被选择。在该模式下,只用两根线(SID 与 SCLK)来完
成数据传输。当同时使用多颗 ST7920 时,CS 线被配合使用,CS 是高有效。
ST7920 的他不时钟SCLK 有独立的操作时序,当多个连续的指令需要被送
入时,指令执行时间需要被考虑。必须等待上一个指令执行完毕才送入下一个指
令,因为 ST7920 内部没有传送/接收缓冲区。
一个完整的串行传输周期由一下部分组成:
首先送入启动字节,送入 5 个连续的“1”用来启动一个周期,此时传输计
数被重置,并且串行传输被同步。紧接的两个位指定传输方向(RW,确定读还
是写)和传输性质(RS,确定是命令寄存器还是数据寄存器),最后的第八位是
一个“0”。
送完启动字节之后,可以送入指令或是显示数据(或是字型代码)。指令或
者代码是以字节为单位的,每个字节的内容(指令或数据)在被送入时分为两个
字节来处理:高四位放在第一个字节的高四位,低四位放在第二个字节的高四位。
无关位都补“0”。请参照第四章串行通讯时序图。;//////////////////////////////////////////
;AT89S52串口驱动LCD12864
;LCD与AT89S52之间的接口:
;CS-P2.4,SID-P2.5,CLK-P2.6
;PSB-P2.1,LRET-P2.3。
;//////////////////////////////////////////
CS EQU P2.4
SID EQU P2.5
CLK EQU P2.6
PSB EQU P2.1
LRET EQU P2.3
COM DA
DAT DA
ADDR DA
ORG 0000H
SJMP START
ORG 0030H
;主程序
START:CLR PSB
SETB LRET
MOV SP,50H
CLR A
LCALL DEL40
LCALL INIR
MOV ADDR,#80H;显示第一页内容
MOV DPTR,#DISA1
LCALL LINE
MOV ADDR,#90H
MOV DPTR,#DISA2
LCALL LINE
MOV ADDR,#88H
MOV DPTR,#DISA3
LCALL LINE
MOV ADDR,#98H
MOV DPTR,#DISA4
LCALL LINE
LCALL DEL2S
MOV ADDR,#80H;显示第二页内容
MOV DPTR,#DISA5
LCALL LINE
MOV ADDR,#90H
MOV DPTR,#DISA6
LCALL LINE
MOV ADDR,#88H
MOV DPTR,#DISA7
LCALL LINE
MOV ADDR,#98H
MOV DPTR,#DISA8
LCALL LINE
LCALL DEL2S
MOV ADDR,#80H;显示第三页内容
MOV DPTR,#DISB1
LCALL LINE
MOV ADDR,#90H
MOV DPTR,#DISB2
LCALL LINE
MOV ADDR,#88H
MOV DPTR,#DISB3
LCALL LINE
MOV ADDR,#98H
MOV DPTR,#DISB4
LCALL LINE
LCALL DEL2S
MOV ADDR,#80H;显示第四页内容
MOV DPTR,#DISB5
LCALL LINE
MOV ADDR,#90H
MOV DPTR,#DISB6
LCALL LINE
MOV ADDR,#88H
MOV DPTR,#DISB7
LCALL LINE
MOV ADDR,#98H
MOV DPTR,#DISB8
LCALL LINE
LCALL DEL2S
LJMP START
;函数TSWC 指令的同步位元字串写入
TSWC: SETB CS
SETB SID
MOV R0,#05H
D1:SETB CLK
CLR CLK
DJNZ R0,D1
CLR SID
MOV R0,#03H
D2:SETB CLK
CLR CLK
DJNZ R0,D2
RET
;函数HDB4 写入数据的高4位
HDB4: SETB CS
MOV R1,#04H
D3:RLC A
MOV SID,C
SETB CLK
CLR CLK
DJNZ R1,D3
RET
;函数ZEN4 写入数据的低4位
ZEN4: CLR SID
MOV R1,#04H
D4:SETB CLK
CLR CLK
DJNZ R1,D4
RET
;函数WCOM 指令写入程序
WCOM: LCALL TSWC
MOV A,COM
LCALL HDB4
LCALL ZEN4
LCALL HDB4
LCALL ZEN4
CLR CS
LCALL DEL2M
RET
;函数INIR 初始化LCD12864
INIR: MOV COM,#00110000B;设置基本指令
LCALL WCOM
MOV COM,#00110000B;设置8-BIT
LCALL WCOM
MOV COM,#00001100B;显示开,关光标,光反白
LCALL WCOM
MOV COM,#00000001B;清屏,AC=0
LCALL WCOM
MOV COM,#00000110B;进入点设定
LCALL WCOM
RET
;函数TSWD 显示数据的同步位元字串写入
TSWD: SETB CS
SETB SID
MOV R3,#05H
E2:SETB CLK
CLR CLK
DJNZ R3,E2
CLR SID
SETB CLK
CLR CLK
SETB SID
SETB CLK
CLR CLK
CLR SID
SETB CLK
CLR CLK
RET
;函数WDAT 显示数据写入程序
WDAT: LCALL TSWD
MOV A,DAT
LCALL HDB4
LCALL ZEN4
LCALL HDB4
LCALL ZEN4
CLR CS
LCALL DEL2M
RET
;函数LINE 写入一行显示数据程序
LINE:MOV A,ADDR
MOV COM,A
LCALL WCOM
MOV R2,#10H
E1:CLR A
MOVC A,@A+DPTR
MOV DAT,A
LCALL WDAT
INC DPTR
DJNZ R2,E1
RET
;函数DEL40 40MS延时
DEL40:MOV R0,#40
DE1:MOV R1,#250
DE2:NOP
NOP
DJNZ R1,DE2
DJNZ R0,DE1
RET
;函数DEL2M 2MS延时
DEL2M:MOV R0,#2
DE3:MOV R1,#250
DJNZ R1,$
DJNZ R0,DE3
RET
;函数DEL2S 2S延时
DEL2S:MOV R5,#50
DE4:LCALL DEL40
DJNZ R5,DE4
RET
;显示内容区
DISA1:DB "青岛佰谦工贸公司"
DISA2:DB "WWW.Baidu.COM.cn"
DISA3:DB " 13210813637 "
DISA4:DB "128*64全点阵显示"
DISA5:DB "图形以及字符显示"
DISA6:DB "2009年 7月 29 日"
DISA7:DB "设计者:赵玉庆 "
DISA8:DB "AT89C52 与ST7920"
LCD12864串口驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)