正在做课程设计,发一篇LCD 12232-9 的说明

点阵液晶使用说明:转载自《笨笨工作室》 bbmcu.com

目  录
一、 汉字显示原理
(一)、汉字编码原理
(二)、汉字显示原理
(三)、ASCII码的显示原理
二、 LCD12232-9概述
(一)、主要技术参数和性能:
(二)、外形尺寸图
(三).模块主要硬件构成说明
(四)、模块的外部接口
(五)、指令说明
(六).时序图
(七)、软件初始化:
(八)、厂商资料中LCD的连接方式及程序
三、 LCD12232-9与89S52接口方案
(一)、串行连接方案:
(二)、并行连接之一  间接控制方式
(三)、并行连接之二  直接访问方式
四、 附录
(一)、ASCII码表
(二)、汉字码址表

一、汉字显示技术
(一)、汉字编码原理
国家标准信息交换用汉字字符集GB 2312-80共收录了汉字、图形符号等共7445个,其中汉字6763个,按照汉字使用的频度分为两级,其中一级汉字3755个,二级汉字3008个。汉字、图形符号根据其位置将其分为94个“区”,每个区包含94个汉字字符,每个汉字字符又称为“位”。其中“区”的序号由01区至94区,“位”的序号也由01位至94位。若以横向表示“位”号,纵向表示“区” 号,则“区”和“位”构成一个二维坐标。给定一个“区”值和“位”值就可以确定一个惟一的汉字或图形符号。即4位阿拉伯数字就可以唯一地确定一个汉字或符号。如“北”字的区位码是“1717”,而京字的区位码是“3009”。前两位是“区”号,后两位是“位”号。其中1至15区是各种图形符号、制表符和一些主要国家的语言字母,16区至87区是汉字,其中16区至55区是一级汉字,56至87区是二级汉字。
    UCDOS软件中的文件HZK16和文件ASC16分别为16×16的国际汉字点阵文件和8×16的ASCII码点阵文件,HZK16中按汉字区位码从小到大依次存放国标区位码表中的所有汉字,每个汉字占用32字节,每个区为94个汉字。而asc16文件中按ASCII码从小到大依次存有8×16的 ASCII码点阵,每个ASCII码占用16字节。

(二)、汉字显示原理
PC的文本文件中,汉字是用机内码的形式存储的,每个汉字占2字节,其中第一个字节为机内码的区码,汉字机内码的区码范围是从0A1H(十六进制)开始,对应区位码中区码的第一区;而机内码的第二个字节为机内码的位码,范围也是从0A1H(十六进制)开始,对应某区中的第一个位码。就是说将汉字机内码减去0A0AH就得到该汉字的区位码。例如汉字“北”的机内码是十六进制的“B1B1”,其中前两位“B1”表示机内码的区码,后两位“B1”表示机内码的位码。所以“北”的区位码为0B1B1H-0A0A0H=1111H,将区码和位码分别转换为十进制,得汉字“北”的区位码为“1717”。即“北”的点阵位于第17区的第17个字的位置,在文件HZK16中的位置为第32×[(17-1)×94+(17-1)]= 48640D以后的32个字节为“北”的显示点阵。用RF-1800编程器读入二进制文件hzk16j.bin后利用其编辑功能中的缓冲区编辑查找到 BE00 H (48640D是十进制,将其转变为十六进制后得BE00 H)开始的32个字节:04 80 04 80 04 88 04 98 04 A0 7C C0 04 80 04 80 04 80 04 80 04 80 04 80 1C 82 E4 82 44 7E 00 00(以上全为下十六进制),将其写在16×16点阵方格纸上,即得图2。由此可以理解其相互逻辑关系。
 
  在单片机系统中,连续取32个字节送到LCD的相应位置,就能正确显示汉字后的图形符号。从HS-12232-1使用的SED1520的控制原理得知,字模送显示前要旋转90°,例如“逢”的区位码是3778,在HZK16中的位置为第32*[(37-1)*94+(78-1)]=110752D以后的 32个字节:04 44 FF FE 05 40 41 F8 33 10 14 E0 01 18 F6 46 1B F8 10 40 13 F8 10 40 17 FC 10 40 28 46 47 FC , 旋转90°后上16个字节:82 8A 92 B2 02 A7 92 5E 2A AF 2A 5A 4A 83 82 00,下16个字节;00 80 40 3F 04 90 95 95 95 FF 95 95 95 D0 40 00。

(三)、 ASCII码的显示原理
ASCII码的显示与汉字的显示基本原理相同,在ASC16文件中不存在机内码的问题,其显示点阵直接按 ASCII码从小到大依次排列,不过每个ASCII码在文本文件中只占1个字节并且小于80 H, 每个ASCII码为8×16点阵,即在ASCII16文件中,每个ASCII码的点阵也只占16个字节  

二、HS12232-9概述
液晶显示器(LCD)具有显示信息丰富、功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。液晶显示器 LCD(Liquid Crystal Display)是一种极低功耗的显示器,由于它的高清晰度、大信息量等特点使它越来越广泛地应用于小型仪器的显示中,液晶是一种介于液体和固体之间的热力学的中间稳定相物质态。其显示原理较复杂,简言之,它是利用液晶特殊的折射性进行显示的。由于液晶工作时需要加一种固定的交流电压,因而驱动其工作的过程较麻烦,为了简化对于 LCD 器件的操作,现在已经配置了专门的驱动器和控制器,在进行信息显示时,由单片机对控制器进行操作,使控制器给驱动器提供扫描时序信号和准备显示的内容,然后驱动器驱动液晶器件进行显示。此外,现在有一些专用单片机本身增加了直接驱动 LCD 的功能,此时可不用驱动器。 把 LCD 与驱动器组装在一起的部件英文名称为“LCD Module”,简称“LCM”。LCM 一般分为 3 类,即段码型液晶模块、点阵字符液晶模块、点阵图形液晶模块。段码型液晶模块是由数显液晶显示器件和集成电路组装成的部件,也称为笔段型液晶模块。其段码显示形式与 LED 显示器类似,是应用最简单的一类。点阵字符液晶模块是由点阵字符液晶显示器件和专用的驱动器、控制器、结构件等装配成的模块,可以显示数字和英文字符。这种模块本身具有字符发生器,显示容量要大于段码型液晶模块。段码型液晶模块和点阵字符液晶模块只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;点阵图形液晶模块特点是点阵像素是连续排列的。因此,不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动、动画、分区开窗口、反转、闪烁等功能,用途十分广泛。是功能较全面的一种模块。但控制复杂,价格也高于前两类模块。
HS12232-9内置ST7920A驱动控制器,点阵为 122×32点,每行7个半汉字,共2行。内部字型ROM 包括8192个16×16点阵的中文字型和126个16×8点阵的字母符号字型,另外还提供一个64×256点的绘图区域(GDRAM)及240点的 ICON RAM,可以和文字画面混合显示。内含的CGRAM有4组可编程的1616点阵的造字功能。与单片机的接口有8位并行、4位并行、2/3线串行。它采用低功率电源消耗,电压范围2.7~5.5V,功能齐全,汉字、点阵图形、ASCII码、曲线同屏显示;上下左右移动当前显示屏幕、清屏、光标显示、闪烁、睡眠、唤醒、关闭显示功能齐备,适合许多场合应用。它内置8192个16*16点汉字库和128个16*8点ASCII字符集图形点阵液晶显示器,它主要由行驱动器/ 列驱动器及128×32全点阵液晶显示器组成。可完成图形显示,也可以显示7.5×2个(16×16点阵)汉字.与外部CPU接口采用并行或串行方式控制。
本文介绍点阵式液晶显示器HS12232-9和它与单片机的接口及编程的方法,同时给出显示器常用的字符显示和汉字显示程序。

(一)、主要技术参数和性能:
1.电源:VDD:+3.0∽+5.5V。(电源低于4.0伏LED背光需另外供电)
2.显示内容:122(列)×32(行)点。
3.全屏幕点阵。
4.2M ROM(CGROM)总共提供8192个汉字(16×16点阵)。
5.16K ROM(HCGROM)总共提供128个字符(16×8点阵)。
6.2MHZ频率。
7.工作温度: 0℃ ∽ +55℃ ,存储温度: -20℃ ∽ +60℃ 

(二)、外形尺寸图
 
                                              图  1

(三).模块主要硬件构成说明
控制器接口信号说明:

● 忙标志:BF
    BF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据.
    利用STATUS RD 指令,可以将BF读到DB7总线,从而检验模块之工作状态.
●  字型产生ROM(CGROM)
    字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。
    DFF 的状态是指令DISPLAY ON/OFF和RST信号控制的。
●   显示数据RAM(DDRAM)
模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示(本模块只用到其中的16*2个),当写入显示数据 RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是瘦长的英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在00~0F的编码中将选择CGRAM的字定义字型,10~7F的编码中将选择瘦长英数字的字型,至于 A0以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码(A140~D75F)。  
●  字型产生RAM(CGRAM)
    字型产生RAM提供图像定义(造字)功能, 可以提供四组16×16点的自定义图像空间,使用者可以将内部字型没有提供的图像字型自行定义到CGRAM中,便可和CGROM中的定义一般的通过DDRAM显示在荧屏中。
●  地址计数器AC
地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6~DB0中。
●  游标/闪烁控制电路
    此模块提供硬体游标及闪烁控制电路,由地址计数器的值来指定DDRAM中的游标或闪烁位置。
  
(四)、模块的外部接口
外部接口信号如下表2、3所示(并行接口):

(五)、指令说明
  模块控制芯片提供两套控制命令,基本指令和扩充指令如下:
指令表1:(RE=0:基本指令)


备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。


(六).时序图
并口读写时序图:(上为写,下为读)

                          
串口读写时序:
     
     
   
  (七)、软件初始化
LCD的初始化过程:
数据格式:RS  RW  (D7  D6  D5  D4  D3  D2  D1 D0)
 
(八)、厂商资料中LCD的连接方式及汇编程序                    
12232F与单片机8031的一种接口如图5.所示
 
;This program is for 12232-9
; RS--------P3.3
; R/W-------P3.1
; E---------P3.0
; DB0~7-----P1

DI  EQU P3.3
RW     EQU P3.1
E  EQU P3.0

 ORG 0000H
 AJMP START
 ORG 0003H
 LCALL  PAUSE
START:
 MOV  IE,#81H         ;EXT. INT0 PERMIT
 MOV  IP,#01H         ;INT0 IS FIRST INT. LEVEL
 MOV  TCON,#00H        ;TIMER/COUNTER CONTROLER INIT.
 mov  SP, #67h
 LCALL DELAY
 LCALL DELAY
 LCALL SETUP
 LCALL DEF_CHAR
 MOV  A,#80H
 LCALL WRITE_COM
 MOV  R3,#8
TEST11: 
MOV  DPTR,#CGRAM1 ;CGRAM TEST
 LCALL WRITE_CGRAM
 DJNZ R3,TEST11
 MOV  A,#90H
 LCALL WRITE_COM
 MOV  R3,#8
TEST12: 
MOV  DPTR,#CGRAM1
 LCALL WRITE_CGRAM
 DJNZ  R3,TEST12
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 MOV  A,#80H
 LCALL WRITE_COM
 MOV  R3,#8
TEST21: 
MOV  DPTR,#CGRAM2
 LCALL WRITE_CGRAM
 DJNZ R3,TEST21
 MOV  A,#90H
 LCALL WRITE_COM
 MOV  R3,#8
TEST22: 
MOV  DPTR,#CGRAM2
 LCALL WRITE_CGRAM
 DJNZ  R3,TEST22
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 MOV  A,#80H
 LCALL WRITE_COM 
 MOV  R3,#8
TEST31: 
MOV  DPTR,#CGRAM3
 LCALL WRITE_CGRAM
 DJNZ R3,TEST31
 MOV  A,#90H
 LCALL WRITE_COM
 MOV  R3,#8
TEST32: 
MOV  DPTR,#CGRAM3
 LCALL WRITE_CGRAM
 DJNZ  R3,TEST32
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 MOV  A,#80H
 LCALL WRITE_COM 
 MOV  R3,#8
TEST41: 
MOV  DPTR,#CGRAM4
 LCALL WRITE_CGRAM
 DJNZ R3,TEST41
 MOV  A,#90H
 LCALL WRITE_COM
 MOV  R3,#8
TEST42: 
MOV  DPTR,#CGRAM4
 LCALL WRITE_CGRAM
 DJNZ  R3,TEST42
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 
 MOV  A#80H  ;WORD TEST
 LCALL WRITE_COM
 MOV  DPTR,#CHINESE
 LCALL WRITE_HZ
 MOV  A,#90H
 LCALL WRITE_COM
 MOV DPTR,#TABLE1
 LCALL WRITE_ASCII
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 MOV  A#80H
 LCALL WRITE_COM
 MOV  DPTR,#table1
 LCALL WRITE_ascii
 MOV  A,#90H
 LCALL WRITE_COM
 MOV DPTR,#chinese
 LCALL WRITE_hz
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
AAA: LJMP START

SETUP:
 LCALL DELAY
 LCALL DELAY
 LCALL DELAY
 MOV  A,#01H  ;CLEAR DISPLAY
 LCALL WRITE_COM
 MOV  A,#00110000B ;FUNCTION SETTING
 LCALL WRITE_COM
 MOV  A,#00000010B ;DDRAM SET TO '00H'
 LCALL WRITE_COM
 MOV  A,#00000100B ;
 LCALL WRITE_COM
 MOV  A,#00001100B ;DISPLAY ON
 LCALL WRITE_COM
 MOV  A,#00000001B ;CLEARING SCREEN
 LCALL WRITE_COM
 MOV  A,#10000000B ;SET DDRAM ADDRESS
 LCALL WRITE_COM
 RET

WRITE_COM:    ;WRIT///cv
;WRITE COMMANDS TO ST7920
 LCALL DELAY1  ;INSTEAD OF CHECKING BF STATE
 CLR  RS
 CLR  RS
 CLR  RW
 CLR  RW
 MOV  P1,A
 MOV  P1,A
 SETB E
 SETB E
 NOP
 NOP
 CLR  E
 CLR  E
 ;LCALL DELAY1
 RET
WRITE_DAT:   ;WRITE DISPLAY DATAS TO ST79220
 LCALL DELAY1
 SETB RS
 SETB RS
 CLR  RW
 CLR  RW
 MOV  P1,A
 MOV  P1,A
 SETB E
 SETB E
 NOP
 NOP
 CLR  E
 CLR  E
 RET
 
DELAY1:
 MOV  R7,#010H
D11: MOV  R6,#010H
 DJNZ R6,$
 DJNZ R7,D11
 RET

DELAY:
 MOV  R1,#00H
D2: MOV  R2,#00H
 DJNZ R2,$
 DJNZ R1,D2
 RET
 
DEF_CHAR:   ;WRITE TO CGRAM
 MOV  A,#01000000B ;SET CGRAM ADDRESS
 LCALL WRITE_COM 
 MOV  R3,#8
DEF1: 
MOV  A,#000H
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 MOV  A,#0FFH
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 DJNZ R3,DEF1
 MOV  R3,#8
DEF2: 
MOV  A,#0AAH
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 MOV  A,#0AAH
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 DJNZ R3,DEF2
 MOV  R3,#8
DEF3: 
MOV  A,#055H
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 MOV  A,#0AAH
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 DJNZ R3,DEF3
 mov  R3,#8
DEF4: 
MOV  A,#0FFH
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 LCALL WRITE_DAT
 DJNZ R3,DEF4
 RET
WRITE_ASCII:
  MOV  R4,#16
DDDD: CLR  A
  MOVC A,@A+DPTR
  LCALL WRITE_DAT
  INC  DPTR
  DJNZ R4,DDDD
  RET
WRITE_HZ:  ;WRITE 8 CHINESE TO LCD
  MOV  R4,#8
DD: CLR  A
  MOVC A,@A+DPTR
  INC  DPTR
  LCALL WRITE_DAT
  CLR  A
  MOVC A,@A+DPTR
  INC DPTR
  LCALL WRITE_DAT
  DJNZ R4,DD
  RET
 
WRITE_CGRAM:  ;CGRAM TESTING
  CLR  A
  MOVC A,@A+DPTR
  LCALL WRITE_DAT
  INC  DPTR
  CLR  A
  MOVC A,@A+DPTR
  LCALL WRITE_DAT
  RET
PAUSE: SETB P3.2  ;PAUSE KEY PROCESS
  SETB P3.2
  LCALL DELAY1
  MOV C,P3.2
  MOV C,P3.2
  JNC PAUSE  ;CHECK KEY WAS PRESSED
PAUSE1: MOV C,P3.2
  MOV C,P3.2
  LCALL DELAY1
  JC PAUSE1  ;CHECK KEY OPEN AFTER PRESSED
PAUSE2: SETB P3.2
 SETB P3.2
 LCALL DELAY1
 MOV C,P3.2
 MOV C,P3.2
 JNC PAUSE2  ;CHECK KEY WAS PRESSED AGAIN
 RETI
 
TABLE1: 
;“这里是16*8点阵的字符代码”
CGRAM1: DB 000H,000H       ;这里是自造字符地址表
CGRAM2: DB 000H,002H
CGRAM3: DB 000H,004H
CGRAM4: DB 000H,006H
CHINESE:
;“这里是16*16点阵的汉字代码表”
END

以下为串口写指令和数据的子程序:
WRITE_COM:   
 LCALL DELAY1  ;INSTEAD OF CHECKING BF STATE
  SETB  CS
  PUSH  ACC
  MOV  R0,#8
  MOV  A,#11111000B
COMM1: 
CLR  C
  RLC  A
  MOV  SID,C
  CLR  CLK
  SETB CLK
  DJNZ R0,COMM1
  POP  ACC
  MOV  R5,A
  ANL  A,#0F0H
  MOV  R0,#8
COMM2: CLR  C
  RLC  A
  MOV  SID,C
  CLR  CLK
  SETB CLK
  DJNZ R0,COMM2
  MOV  A,R5
  SWAP A
  ANL  A,#0F0H
  MOV  R0,#8
COMM3: CLR  C
  RLC  A
  MOV  SID,C
  CLR  CLK
  SETB CLK
  DJNZ R0,COMM3
  CLR  CS
 RET
WRITE_DAT:  
  LCALL DELAY1
  SETB CS
  PUSH  ACC
  MOV  R0,#8
  MOV  A,#11111010B
DATA1: CLR  C
  RLC  A
  MOV  SID,C
  CLR  CLK
  SETB CLK
  DJNZ R0,DATA1
  POP  ACC
  MOV  R5,A
  ANL  A,#0F0H
  MOV  R0,#8
DATA2: CLR  C
  RLC  A
  MOV  SID,C
  CLR  CLK
  SETB CLK
  DJNZ R0,DATA2
  MOV  A,R5
  SWAP A
  ANL  A,#0F0H
  MOV  R0,#8
DATA3: CLR  C
  RLC  A
  MOV  SID,C
  CLR  CLK
  SETB CLK
  DJNZ R0,DATA3
  CLR  CS
 RET
 

三、LCD12232-9与89S52接口方案
(一)、串行连接方案:
HS12232-9与单片机的串行接口时序如图3所示,即 24个时钟脉冲传送一个字节。单片机首先发送数据传输起始位5个“1”,HS12232-9收到连续的5个“1”,内部传输被重置,同时串行传输被同步,紧接着RW位用于决定数据的传输方向(读还是写),RS用来选择是内部数据寄存器还是指令寄存器,第8位固定为“0”。收到起始位、RW、RS、“0”组成的第一个字节后,一个字节的数据或指令被分成两个字节来串行传送或接收。数据或指令的高4位被放在第二个字节串行数据的高4位,低4位补4个“0”,数据或指令的低4位被放在第三个字节串行数据的高4位,低4位补4个“0”,这样完成一个字节或数据的传送。HS12232-9内部没有发送/接收缓冲区,传送节奏要注意,否则要丢指令或数据。



    89s52单片机与HS12232-9接口电路如图4所示,只占用P2_5(对应于CS)、P2_6(对应于SID)、P2_7(对应于SCLK)三根I/O口, CS引脚是片选,高电平片选使SID和CLK的信号有效,SID引脚作数据线,SCLK引脚作时钟线。单片机通过SID数据线在SCLK同步时钟线配合下完成数据(指令)传输的任务。此方案接口电路十分简单,仅需三个I/O口可以让CPU的接口资源得到充分的利用;不足是串行传送固有的速度不如并行传送的问题,但如果显示数据不是特别多,刷新速度要求不是特别快时仍是个不错的选择,适用于接口交资源紧张,且对显示速度要求不高的场合。

显示程序如下:
 
/*12232f pins define*/
sbit CS=P3^5;
sbit SID=P3^6;
sbit SCLK=P3^7;
/*-------------------------------------------------------------------------------------延时程序*/
void delay_1ms(uint x)
{
uint j;
uchar  i;
for(j=0;j
{
for(i=0;i<110;i++);
}
}
/*-------------------------------------------------------------------------------------延时程序*/

/*-----------------------------------------------------------------------发送子程序*/
void send_chuan(uchar sdata)   /*LCD用串行发送程序*/
{uchar i;
for(i=0;i<8;i++)
{
SID=(bit)(sdata&0x80);
SCLK=0;
SCLK=1;
sdata=sdata<<1;
}
}
void send_standard(uchar command_data)/*标准发送预处理及发送程序*/
{
uchar i_data;

i_data=command_data;
i_data&=0xf0;
send_chuan(i_data);

i_data=command_data;
i_data<<=4;
i_data&=0xf0;
send_chuan(i_data);
CS=0;
}

void send_command(uchar use_data) /*指令发送*/
{
uchar i_data;
i_data=0xf8;
delay_1ms(10);
CS=1;
SCLK=0;
send_chuan(i_data);
send_standard(use_data);
}

void send_data(uchar use_data) /*数据发送*/
{
uchar i_data;
i_data=0xfa;
delay_1ms(10);
CS=1;
SCLK=0;
send_chuan(i_data);
send_standard(use_data);
}
/*----------------------------------------------------------------------发送子程序*/
(二)、并行接口之一  间接控制方式间接控制方式是将P0_0~P0_7接DB0~DB7用于传送显示数据或指令代码,P2_5接E下跳沿时将P0口的数据打入LCD的寄存器, P2_6接R/W,P2_7接RS它们有四种功能选择参见表()单片机通过软件控制这些接口的电平变化符合LCD读写所需的时序,它的特点是较之串行速度有很大的提高,软件实现起来很方便,适用接口资源不紧张且对显示速度有一定要求的场合。

送指令和送数据的子程序如下:

/*---------------------------------------------------------
---------------------------------------------------------------
----------------指令发送子程序*/
void sendIN(uchar i_data)
{P2=0x20;
 P0= i_data;
 P2_5=!P2_5;
 delay_1ms(1);
 return;
}
/*---------------------------------------------------------
---------------------------------------------------------------
----------------指令发送子程序*/
/*---------------------------------------------------------
---------------------------------------------------------------
----------------数据发送子程序*/

void sendDA(uchar i_data)
{P2=0xa0;
 P0= i_data;
 P2_5=!P2_5;
delay_1ms(1);
 return;
}
/*---------------------------------------------------------
---------------------------------------------------------------
----------------数据发送子程序*/



(三)、并行接口之二  直接访问方式
直接访问方式就是将液晶模块作为存储器或I/O设备对待,直接挂在单片机总线上,单片机以访问存储器或I/O设备的方式操作液晶显示模块。
单片机与外扩的这些资源之间的数据交流是通过外部总线来实现的。外部总线可分为数据总线、地址总线、控制总线3类,都是拄在单片机的I/O口上的, 52系列单片机上,P0通常作为数据/低估地址总线复用, P2作为高位地址总线.因此相对来说,P2口的用法较为复杂.下面详细说明单片机P2口的总线I/O线复用技术。我们把P2_7接LCD的R/W, P2_6接RS,单片机上的RD和WR与非后接LCD的使能端E,也就是说,液晶在这里仍相当外部数据存储器P2_7和P2_6正好作为地址选通线分别控制LCD的读/写和指令/数据。




上图是访问外部数据存储器(此处是LCD)的时序图,其中上是读周期时序,下是写周期时序。由序图可知,无论外部数据存储器的容量多大,在执行Movx类指令读/写外部存储器时,P2口都会出现“地址A15-A8”。具体地说,若执行“movx @DPTR,A”或“movx A,@DPTR”指令。P2口引脚会在指令执行期间出现DPH值;若执行“momx @Ri,A”或 “Movx A,@Ri”指令,P2门引脚上则会出现专用寄存器(口内锁存器)P2的值。那么,当外接数据存储器容量在256字节以下时,虽然只有通过P0口进出的8 位地址对寻址有实际意义,但是P2口引脚上仍会出现DPH或P2寄存器的值。若执行“movx @Ri,A”或“movx A,@Ri”指令,因为出现的仍旧是专用寄存器(口内锁存器)P2的值,与执行指
令前无异,可以不必考虑;若执行“movx @DPTR,A”或“movx A,@DPTR”指令,且数据指针高8位寄存器DPH的值与专用寄存器P2的值不一致,就会在执行“movx A,@DPTR”或“movx @DPTR,A”指令的瞬时改变P2口的状态。以输出数据为例:当写数据到LCD时,第一个机器周期P2和P0输出地址,之后一个机器周期,DPH在P2 上得以保持,而P0口呈现待输出数据,这时WR适时地产生一个下跳变,LCD正是利用这个时序,顺利的将数据按P2_6、P2_7确定的地址读入寄存器。


发送子程序如下:
/*-------------------------------------------------------------------------------------延时程序*/
void delay_1ms(uint x)
{
uint j;
uchar  i;
for(j=0;j
{
for(i=0;i<110;i++);
}
}
/*-------------------------------------------------------------------------------------延时程序*/
/*---------------------------------------------------------
---------------------------------------------------------------
----------------指令发送子程序*/

void sendIN(uchar a)
{add_IN=a;
 delay_1ms(1);
 return;
}
/*---------------------------------------------------------
---------------------------------------------------------------
----------------指令发送子程序*/
/*---------------------------------------------------------
---------------------------------------------------------------
----------------数据发送子程序*/

void sendDA(uchar a)
{add_DA=a;
delay_1ms(1);
 return;
}
/*---------------------------------------------------------
---------------------------------------------------------------
----------------数据发送子程序*/
这个实例中,我们把LCD作为一个外部存储器,送指令或数据时只需分别对应预先确定的地址就行,
直接总线的映射地址确定


五、 附录
(一)、ASCII码表


(二)、附录2:汉字码址表






 

发表于 2006-06-28 13:29

评论

# 回复: 正在做课程设计,发一篇LCD 12232-9 的说明 2006-09-04 09:20:00 yaoshaowei

很有用,希望多发相关的资料,谢谢了

# 回复: 正在做课程设计,发一篇LCD 12232-9 的说明 2007-10-26 11:00:00 金色的田野

内容很实用,但看不见图

# 回复: 正在做课程设计,发一篇LCD 12232-9 的说明 2008-12-23 16:01:00 lin

可以给个用C语言编程的程序不?显示LED内的图片左右移动~~~假设
//初始化
void initializeLCD(void)
{
l_w_code(0x3f); //开显示设置
l_w_code(0xc0); //设置显示起始行为第一行
l_w_code(0xb8); //页面地址设置
l_w_code(0x40); //列地址设为0
r_w_code(0x3f);
r_w_code(0xc0);
r_w_code(0xb8);
r_w_code(0x40);
}

发表评论

标题:  
署名:  
链接:
内容:
验证码: