单片机LCD12864显示系统课程设计
目录
一、概述 (2)
二、系统总体方案及硬件设计 (2)
系统框图 (3)
单片机最小系统 (4)
显示电路 (6)
按键控制电路 (6)
]
三、系统软件设计 (9)
软件设计概述 (9)
汉字显示 (10)
上下移屏 (10)
左右移屏 (11)
四、课程设计体会 (13)
五、参考文献 (13)
六、附录 (14)
…
总电路图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
总程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
%
一、概述
/
随着社会的发展,趣来趣多的地方需要应用显示功能,各种数字显示仪器中的显示、广告牌、数码产品等,传统的数码管显示已经远远不能满足各行各业的需求。基于单片机的LCD显示是一种用单片机来控制的一种显示系统,它不仅能显示种各数字、字母、还能显示各种字体的汉字以及一些简单的图象,使用起来极为方便,只要通过对单片机写入一定的程序来控制LCD 的显示即可完成,根据程序的不同而产生不同不效果以满足各种不同需求。
本文围绕设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机AT89S51,采用的液晶显示控制器的芯片是SED1520,主要实现由按键控制的中文显示、图片显示、滚屏以及左右移动功能。同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程,并详细阐述了程序的各个模块。本系统是以单片机的C语言来进行软件设计,指令的执行速度快,可读性强。为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。使硬件在软件的控制下协调运作。其次阐述了部分程序的流程图和实现过程。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。最后对我所开发的用单片机实现LCD液晶显示器控制原理的设计思想和软、硬件调试作了详细的论述。
二、系统总体方案及硬件设计
系统框图
本系统由电源部分、单片机最小系统部分、LCD12864显示电路部分、按键控制部分组成。其中,单片机最小系统部分包括晶振电路、复位电路。
单片机最小系统
`
、AT89S52单片机
89S51各引脚功能介绍:
1.VCC:
2.89S51 电源正端输入,接+5V。
3.VSS:
4.电源地端。
5.XTAL1:
6.单芯片系统时钟的反相放大器输入端。
7.`
8.XTAL2:
9.系统时钟的反相放大器输出端,一般在设计
上只要在 XTAL1 和 XTAL2 上接上一只石
英振荡晶体系统就可以动作了,此外可以在
两引脚与地之间加入一 20PF 的小电容,可
以使系统更稳定,避免噪声干扰而死机。
10.RESET:
11.89S51的重置引脚,高电平动作,当要对晶
A T89S51
片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,
使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
12.EA/Vpp:
13."EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电
平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。
14.ALE/PROG:
15.端口3的管脚设置:
16.?
17.:RXD,串行通信输入。
18.:TXD,串行通信输出。
19.:INT0,外部中断0输入。
20.:INT1,外部中断1输入。
21.:T0,计时计数器0输入。
22.:T1,计时计数器1输入。
23.:WR:外部数据存储器的写入信号。
24.:RD,外部数据存储器的读取信号。
、
复位电路
电路图如下:
上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
图单片机复位电路
、时钟电路
时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。本文用的是内部时钟方式。
)
电路图如下:
图晶振电路
显示电路
管脚名称及功能:
管脚号管脚名称电平】
管脚功能描述
1VSS0V电源地
2VCC~+5V/
电源正
3V0-对比度(亮度)调整
4RS(CS)H/L !
RS=“H”,表示DB7——DB0为显示数据
RS=“L”,表示DB7——DB0为显示指令数据
5R/W(SID)H/L
R/W=“H”,E=“H”,数据被读到DB7——DB0
R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR
6(
E(SCLK)
H/L使能信号
7DB0H/L三态数据线
8@
DB1
H/L三态数据线
9DB2H/L三态数据线
基本指令系统:
模块控制芯片提供两套控制命令,基本指令和扩充指令如下:指|
指令码
功能
令R
S
R
/
W
D
7
D
6
D
5
'
D
4
D
3
D
2
D
1
D
清除显示0
/
0000000
《
1
将DDRAM填满"20H",并且设定DDRAM的地址计
数器(AC)到"00H"
地址归位00000
,
001X设定DDRAM的地址计数器(AC)到"00H",并且
将游标移到开头原点位置;这个指令不改变DD
RAM 的内容
显示状态开/关0
\
00001D C
、
B
D=1: 整体显示 ONC=1: 游标ON B=1:游标位
置反白允许
进入点设定00000
\
01I
/
D
S
指定在数据的读取与写入时,设定游标的移动
方向及指定显示的移位
游标或显示移位控制0
|
0001S
/
C
R
/
L
X
!
X
设定游标的移动与显示的移位控制位;这个指
令不改变DDRAM 的内容
、按键控制电路
电路由三个独立按键开关组成,分别与单片机的I/O相连,控制调整电路的加、减以及确定。按键的开关状态通过一定的电路转换为高、
低电平状态。按键闭合过程在相应的I/O端口形成一个负脉冲。闭合和
释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电
平之间的一种不稳定状态,称为抖动。抖动持续时间的常长短与开关的
机械特性有关,一般在5-10ms之间。为了避免CPU多次处理按键的一次
闭合,应采用措施消除抖动。本文采用的是独立式按键,直接用I/O口
线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状
态不会产生互相影响。
口表示下移功能键,当开关闭合时,控制显示屏内容整体向下滚动。(
口表示上移功能键,当开关闭合时,控制显示屏内容整体向上滚动。
口表示右移功能键,当开关闭合时,控制显示屏内容整体向右移动。
口表示左移功能键,当开关闭合时,控制显示屏内容整体向左移动。
按键控制电路
三、软件部分
、软件系统概论
此设计是由单片机控制的LCD显示系统,外设四个按钮来控制显示的方式。对于按钮的工作方式可以是中断也可以是查询,在此设计中所
选用的顺序结构。用单片机的 P3口的低4来作为LCD的显示控制端,
即控制LCD使能端、读写控制揣、数据指令选择端及两个选屏端。对
于此设计课题,因为要求是用128×64的显示器来显示汉字,而汉字及
字符(如空格等)是需要显示代码的。所以,首先是通过一定的软件如
ZIMO等来获取你想要显示的汉字的编码代码。有了这款软件,就方便多
了,只在要软件中打入你想要显示的汉字或是字符,它就会自动生成代
码,使用起来非常方便,而不需要人工去编写相应的代码。
}
开始——显示图形——检测按键——显示相应内容。
、汉字显示
对于此设计课题,因为要求是用128×64的显示器来显示汉字,而汉字及字符(如空格等)是需要显示代码的。所以,首先是通过一定的软
件如ZIMO等来获取你想要显示的汉字的编码代码。有了这款软件,就方
便多了,只在要软件中打入你想要显示的汉字或是字符,它就会自动生
成代码,使用起来非常方便,而不需要人工去编写相应的代码。
由于此LCD的显示屏是被分为了两部分的,即左半屏和右半屏,分别由CS1和 CS2来控制,两个半屏的内存都分别由X和Y两个地址来确
定,X地址共64位,而Y地址两边各64位,一共128位,所以有的时
候就称其为12864显示器。X地址共有8个值,从0到7,即每个值有8
位,每显示一个字符要2个X值,而Y共128个值,分为两块即左右两
块,分别从0到63,即每个值一位。每显示一个汉字要16个Y值,每
显示一个字符要8个Y值。所以应该对两半屏分别编程取显示地址。同
时还得用一个显示子程序来显示显示地址中保存的显示代码(汉字代
码)。由此LCD的显示时序图可知,在显示过程中还需要一定的延时(不
同的型号,延时时间是不同的)并且在显示前需将一些特定的控制端置
相应的电平,比如说还所有输入之关需先把LCD总使能端打开,即置E
端为高电平,然后应再输入指令代码,对其进行相关的设置。所以还需
要一个适当的延时子程序以及输入数据前的准备程序。除了这些外,还
应写一个初始化程序,用来对中断等一些程序所需要的端口进行初始。
对于开中断,应打开总中断EA以及相应的低级中断EX0和 EX1。再者就
是两个中断程序,对于这两个中断程序比较简单,只需对要执行相关控
制(即常规显示和滚动显示)所需要的每件进行满足即可。最后就是主
函数,它的主要功能就是判断中断是否来临,来临了,然后判断是外部
中断0还是外部中断1,然后根据是0还是1来执行相应的程序,选择
相应的显示方式。当四行全显示完了后,中断失效,即不管你是否还按
键,都不再会对显示造成影响。显示出来的内容将一直保持。
、图片显示
显示图片和显示汉字类似,都是先通过字模软件先取模,然后再显示。
、上下移动
~
由此可见12864的显示起始行为0xc0,有规律的改变起始行的位置,
就可以改实现上下移的效果。代码如下
左右移动
在本设计中,通过循环改变汉字字符在单片机上显示的左右半屏以及在左右半屏上显示的列位,行位不变,达到了左右移屏的效果。for(i=0;i<64;i++) 片机原理及应用技术,徐州:中国矿业大学出版社,2003
[3] 郭天祥,51单片机C语言教程,电子工业出版社,2009
[4] 徐春辉,单片微机原理及应用,电子工业出版社,2013
-
~
六、附录
、附总电路图
、附总程序
取模头文件:
unsigned char code BMP[][64]={/*-- 调入了一幅图像:G:\Users\Administrator\Desktop\ --*/
!
/*-- 宽度x高度=128x64 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0 ,
0x00,0x30,0xC0,0x00,0xD8,0x30,0x20,0x48,0x18,0x22,0x04,0x1C,0x00,0x0E,0x2A,0x00 ,
0x14,0x24,0x02,0x1C,0x20,0x0C,0x38,0x60,0x08,0xE0,0x10,0x90,0xA0,0x00,0xC0,0x80 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
—
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xB0,0x20,0x68,0x90,0x22,0x1F,0x02,0x84,0x82 ,
0x63,0x30,0x90,0xD0,0x48,0x2C,0x2C,0x34,0x12,0x16,0x0A,0x1B,0x09,0x0B,0x0A,0x0B ,
0x09,0x0B,0x0A,0x1B,0x12,0x16,0x34,0x24,0x2C,0x48,0xD9,0xB0,0x20,0xC7,0x80,0x94 ,
0x01,0x0D,0x3C,0xC0,0x28,0x60,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
…
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0xC0,0x28,0x89,0x0A,0xD6,0x0C,0x03,0x00,0xE0,0x38,0x1C,0x42,0x73,0x85 ,
0x66,0xA1,0x41,0xA0,0x40,0x00,0x20,0x20,0xC0,0x20,0xA0,0x60,0x80,0x60,0x80,0x20 ,
0x20,0x60,0xE0,0xC0,0x40,0xC0,0xC0,0x80,0x80,0x00,0x00,0x01,0x01,0x02,0x04,0x1B ,
0x26,0xCC,0x38,0xE0,0x00,0x06,0x71,0x94,0x32,0x28,0x80,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
…
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0xCC,0x84,0x6D,0x41,0x4C,0x00,0x00,0x50,0xFF,0x01,0xD8,0x00,0x05,0x8A,0x35 ,
0x56,0x99,0x26,0x99,0x23,0x8C,0x10,0x02,0xAD,0x02,0xBD,0x02,0xAD,0x1A,0x35,0x4A ,
0xD0,0x00,0x01,0x07,0x2F,0x7D,0xDF,0xFE,0xEB,0xBF,0xFD,0xBE,0xF8,0xB0,0xE0,0x00 ,
0x00,0x01,0xDE,0x21,0x5E,0xD0,0x00,0x15,0x63,0xA5,0x1B,0xB0,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x08,0x40,0x4E,0xCB,0x98,0xA0,0x00,0x02,0x3F,0xC0,0x3B,0xC0,0x00,0x00,0x01 ,
0x06,0x7A,0xC4,0xAB,0x58,0xA3,0x5C,0xA2,0x68,0x83,0x00,0x39,0xC4,0x39,0xC3,0x18 ,
0xD5,0xB5,0xA4,0x00,0x00,0x2B,0xFB,0xDE,0xF7,0x2D,0xFF,0xFE,0xDB,0xF7,0xBD,0xEF ,
0x7C,0xD0,0x02,0xA1,0x5E,0x02,0xC0,0x41,0x85,0xC8,0x5D,0x04,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
】
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x04,0x2C,0x7D,0xFC,0xFC,0xFC,0xFC,0xBC,0xFC,0xFC,0x7F,0x3C,0x73,0xA4,0xD8 ,
0x20,0x60,0xC2,0x81,0x00,0x01,0x00,0x01,0x02,0x01,0x00,0x00,0x01,0x02,0x01,0x02 ,
0x00,0x01,0x01,0x01,0x00,0x00,0x03,0x01,0x03,0x01,0x81,0x02,0x61,0x91,0xD9,0xE1 ,
0xF1,0xFB,0xBF,0x1C,0x7C,0xB8,0xFC,0xFC,0xFC,0xFD,0x3C,0x0C,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,
0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x1F,0x3E,0x62,0x78,0xF8,0xFC,0xFA,0xBF,0xFF ,
0xFF,0x3F,0x0E,0x1E,0xFD,0xFD,0xFA,0xFA,0xF4,0xF4,0xF0,0xEC,0xE8,0xE8,0xF8,0xE0 ,
0xEC,0xF8,0xF0,0xF4,0xF4,0xF4,0x3A,0xFA,0xFD,0xFD,0xFE,0xFE,0xFF,0x8F,0x3F,0xFF ,
0xBF,0xFF,0xDE,0x7E,0x7E,0x18,0x0F,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
《
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x07,0x06 ,
0x0C,0x0D,0x1D,0x1B,0x1F,0x3F,0x3F,0x3F,0x73,0x6F,0x71,0x60,0x6F,0x7B,0x6F,0x7F ,
0x7E,0x7F,0x7F,0x6D,0x77,0x6E,0x30,0x3A,0x35,0x17,0x1F,0x0F,0x0F,0x07,0x07,0x07 ,
0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
.
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
unsigned char code yier[]={/*-- 文字: 1 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00 ,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00 };
:
unsigned char code erban[]={/*-- 文字: 2 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x84,0x84,0xFC,0x84,0x84,0x00,0xF8,0x00 ,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x10,0x30,0x1F,0x08,0x88,0x42,0x21,0x18 };
unsigned char code dian[]={/*-- 文字: 电 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00 ,
}
0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00 };
unsigned char code hua[]={/*-- 文字: 化 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x60,0xF8,0x07,0x00,0x00,0x00,0xFF,0x40,0x20,0x10,0x08,0x04,0x00,0x00 ,
0x01,0x00,0x00,0xFF,0x00,0x04,0x02,0x01,0x3F,0x40,0x40,0x40,0x40,0x40,0x78,0x00 };
unsigned char code ban[]={/*-- 文字: 班 --*/
—
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0xFF,0x00,0x84,0x84,0xFC,0x84,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x07,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
unsigned char code deng[]={/*-- 文字: 邓 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x12,0x22,0x42,0x82,0x62,0x1E,0x00,0x00,0xFE,0x02,0x22,0xDA,0x06,0x00,0x00 ,
0x20,0x10,0x08,0x06,0x01,0x06,0x18,0x00,0x00,0xFF,0x08,0x10,0x08,0x07,0x00,0x00 };
…
unsigned char code xiao[]={/*-- 文字: 邱 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFC,0x44,0x44,0x44,0xC2,0x42,0x40,0x00,0xFE,0x02,0x22,0xDA,0x06,0x00 ,
0x20,0x60,0x3F,0x20,0x20,0x10,0x1F,0x10,0x10,0x00,0xFF,0x08,0x10,0x08,0x07,0x00 };
unsigned char code mao[]={/*-- 文字: 尹 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
~
0x20,0x20,0x24,0x24,0x24,0xFC,0x24,0x24,0x24,0x24,0x24,0xFC,0x20,0x20,0x20,0x00 ,
0x00,0x80,0x41,0x21,0x19,0x07,0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00,0x00,0x00 };
unsigned char code dan[]={/*-- 文字: 单 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,0x48,0x4C,0x4A,0x49,0xF8,0x00,0x00,0x00 ,
0x10,0x10,0x13,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x00 };
;
unsigned char code pian[]={
/*-- 文字: 片 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xFE,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x00,0x00 ,
0x00,0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x00 };
unsigned char code ji[]={/*-- 文字: 机 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00 ,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00 };
unsigned char code ke[]={/*-- 文字: 课 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0xCC,0x00,0x00,0x00,0xFE,0x92,0x92,0xFE,0x92,0x92,0xFE,0x00,0x00,0x00 ,
0x00,0x00,0x3F,0x10,0x08,0x22,0x12,0x0A,0x06,0xFF,0x06,0x0A,0x12,0x22,0x20,0x00 };
#
unsigned char code se[]={/*-- 文字: 设 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00 ,
0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00 };
unsigned char code erling[]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0xE0,0x10,0x08,0x08,0x10 ,0xE0,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00 };
/
unsigned char code yiwu[]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0 x08,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00 };
主程序:
#include<>
#include<>
#include<>
#include""
"
#define uchar unsigned char
#define uint unsigned int
#define LCD_databus P0 //LCD12864的8位数据口
sbit RS=P2^2; //RS为0---命令;1----数据
sbit RW=P2^1; //RW为1---写;0---读
sbit EN=P2^0; //使能端
、
sbit CS1=P2^4; //片选1低电平有效,控制左半屏
sbit CS2=P2^3; //片选1低电平有效,控制右半屏
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3; //三个按键控制口
>
void display(int unm,int num);
void delay(uint i)
{
while(--i);
}
void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy
{
%
P0=0x00;
RS=0;
RW=1;
EN=1;
while(P0 & 0x80);
EN=0;
}
)
void write_LCD_command(uchar value) //写命令函数
{
Read_busy(); //对LCD的每次读写都要读忙 RS=0; //选择命令
RW=0; //读操作
LCD_databus=value;
EN=1; //EN由1----0锁存有效数据 _nop_();
@
_nop_();
EN=0;
}
void write_LCD_data(uchar value)//写数据函数
{
Read_busy();
RS=1; //选择数据
/
RW=0;
LCD_databus=value;
EN=1; //EN由1----0锁存有效数据
_nop_();
_nop_();
EN=0;
}
~
uchar Read_LCD(void) //读数据函数
{
uchar value;
Read_busy();
LCD_databus=0xFF; //先进行一次空读操作
RS=1;
RW=1;
EN=1;
¥
_nop_();
_nop_();
EN=0;
LCD_databus=0xFF; //读取真正的数据
RS=1;
RW=1;
EN=1;
【
value=LCD_databus;
_nop_();
_nop_();
EN=0;
return value;
}
\
void Set_page(uchar page) //设置“页”LCD12864共8页,一页是8行点阵点
{
page=0xb8|page; //页的首地址为0xB8
write_LCD_command(page);
}
void Set_line(uchar startline) //设置显示的起始行
{
。
startline=0xC0|startline; //起始行地址为0xC0
write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示}
void Set_column(uchar column) //设置显示的列
{
column=column &0x3f; //列的最大值为64
|
column= 0x40|column; //列的首地址为0x40
write_LCD_command(column); //规定显示的列的位置
}