珍藏的12864 使用经典资料Word文档格式.docx
《珍藏的12864 使用经典资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《珍藏的12864 使用经典资料Word文档格式.docx(44页珍藏版)》请在冰点文库上搜索。
6.sbit
PSB
=P2^1;
//串并方式选择引脚,0为串行模式,1为8/4位数据口模式
7.sbit
RST
=P2^3;
//复位引脚
8.
9.//********************************************************
10.//延时函数
11.//********************************************************
12.voiddelay(unsignedintk)
13.{
14.
unsignedinti;
15.
unsignedcharj;
16.
for(i=0;
i<
k;
i++)
17.
{
18.
for(j=0;
j<
10;
j++);
19.
}
20.}
21.//********************************************************
22.//延时1ms函数
23.//********************************************************
24.voiddelay_ms(unsignedintk)//延时0.994us,晶振12M
25.{
26.
unsignedintx,y;
27.
for(x=k;
x>
0;
x--)
28.
for(y=121;
y>
y--);
29.}
30.//********************************************************
31.//写命令函数
32.//********************************************************
33.voidLcdWcom(unsignedcharWCom)
34.{
35.
delay
(1);
36.
RS=0;
//指明操作对象为指令寄存器
37.
RW=0;
//指明为写操作
38.
E=1;
39.
lcd_data=WCom;
//将命令写入总线
40.
E=0;
41.}
42.//********************************************************
43.//写数据函数
44.//********************************************************
45.voidLcdWdata(unsignedcharWData)
46.{
47.
48.
RS=1;
//指明操作对象为数据寄存器
49.
50.
51.
lcd_data=WData;
//将数据写入总线
52.
53.}
二、初始化操作
初始化操作如下:
芯片上电;
延时40ms以上;
复位操作:
RST出现一个上升沿(RST=1;
RST=0;
RST=1;
);
功能设定;
延时100us以上;
6>
再次进行功能设定;
7>
延时37us;
8>
显示开关控制;
9>
10>
清除显示;
11>
延时10ms以上;
12>
进入点设置;
13>
初始化结束;
这里我遇到了一个小问题,我的液晶按照这个顺序进行初始化结果不正确,无法显示,最后我把调整了一下就可以了,调整后的顺序为:
清除显示进入点设置显示开关控制,不知道是什么原因,知道的告诉我一声…
54.//********************************************************
55.//显示初始化函数
56.//********************************************************
57.voidDisplay_Init(void)
58.{
59.
delay_ms(45);
//延时45ms
60.
PSB=1;
//8位并行口
61.
//复位操作
62.
63.
64.
65.
//功能设定
66.
LcdWcom(0x30);
//设置为8位并行口,基本指令集
67.
delay(10);
68.
//再次设置为8位并行口,基本指令集
69.
delay(5);
70.//
//显示开关控制
71.//
LcdWcom(0x0c);
//游标显示关,正常显示,整体显示开
72.//
delay(10);
73.
//清除显示
74.
LcdWcom(0x01);
75.
delay_ms(12);
//延时12ms
76.
//进入点设置
77.
LcdWcom(0x06);
//设置为游标右移,DDRAM位地址加1,画面不移动
78.
79.
LcdWcom(0x0C);
//开显示
80.}
三、显示基本的字符和汉字
1、要想显示汉字或字符,首先要确定显示的位置,看看芯片说明书上关于屏幕地址的分配:
由于此液晶为128*64,即是横向128个点,竖向64个点,由于该液晶控制器支持的字符为8*16,汉字为16*16,因此只能显示四行,如果是汉字,为每行显示8个,如果是字符,每行显示16个。
由上图设置DDRAM地址的指令可知,最高位为1,余下7位为地址值,因此就对应了为什么起始地址为80H的原因(即对应的写地址指令为10000000);
因此如果你要设定显示的地址为第一行的第一个位置,只需要调用写指令函数,写入0x80即可。
存在的问题:
参考网上的程序及在试验过程中发现,实际能显示出来的地址分布式这样的
0x800x810x820x830x840x850x860x87
//第一行汉字位置
0x900x910x920x930x940x950x960x97
//第二行汉字位置
0x880x890x8a0x8b0x8c0x8d0x8e0x8f
//第三行汉字位置
0x980x990x9a0x9b0x9c0x9d0x9e0x9f
//第四行汉字位置
百思不得其解,尤其让人受不了的是居然是第一行和第三行地址接续,而不是第二行,有明白的高手给讲解一下…
设定DDRAM地址参考程序:
81.//********************************************************
82.//设置光标函数
83.//参数说明:
x为行号,y为列号
84.//********************************************************
85.voidSet_Cursor(unsignedcharx,unsignedchary)
86.{
87.
unsignedchari;
88.
switch(x)//确定行号
89.
{
90.
case0x00:
i=0x80;
break;
//第一行
91.
case0x01:
i=0x90;
//第二行
92.
case0x02:
i=0x88;
//第三行
93.
case0x03:
i=0x98;
//第四行
94.
default:
95.
96.
i=y+i;
//确定列号
97.
LcdWcom(i);
//写地址
98.}
复制代码
2、显示字符
由数据手册可查看可以显示的字符及其显示码:
因此,当你设置好所要显示的光标位置后,即可调用写数据函数,写入对应相应字符的显示码,比如要显示!
就应该写入0x21。
99.//********************************************************
100.//显示字符函数
101.//********************************************************
102.voidDisplay_Char(unsignedcharAlphabet)
103.{
104.
105.
LcdWdata(Alphabet);
//写入需要显示字符的显示码
106.}
显示!
实例:
107./**********************显示单个字符*************************/
108.Set_Cursor(0,0);
//光标地址设定
109.Display_Char(0x21);
//显示字符!
扩展程序:
在指定位置显示字符串
110.//********************************************************
111.//指定位置显示字符串函数
112.//参数说明:
113.//********************************************************
114.voidDisplay_String(unsignedcharx,unsignedchary,unsignedchar*Alphabet)
115.{
116.unsignedchari=0;
117.Set_Cursor(x,y);
//设置显示的起始地址
118.while(Alphabet[i]!
='
\0'
)
119.{
120.
LcdWdata(Alphabet[i]);
//写入需要显示字符的显示码
121.
i++;
122.}
123.}
显示字符串实例:
124./***********************显示字符串*************************/
125.Display_String(1,0,"
WWW.CEPARK.COM"
);
//显示字符串
3、显示汉字
因为一个汉字占用两个字节的大小,因此要想显示一个汉字,需要进行两个数据写入操作。
所支持的8192个16*16的汉字详见数据手册附录中的ST7920GB中文字型码表。
126.//********************************************************
127.//指定位置显示汉字函数
128.//参数说明:
129.//********************************************************
130.voidDisplay_HZ(unsignedcharx,unsignedchary,unsignedchar*HZ)
131.{
132.
Set_Cursor(x,y);
//设置显示的起始地址
133.
LcdWdata(HZ[0]);
//写入需要显示汉字的高八位数据
134.
LcdWdata(HZ[1]);
//写入需要显示字符的低八位数据
135.}
显示汉字实例:
136./************************显示汉字*************************/
137.Display_HZ(0,1,"
电"
//显示电
138.Display_HZ(0,2,"
子"
//显示子
139.Display_HZ(0,3,"
园"
//显示园
140.//********************************************************
141.//指定位置显示一行汉字函数,可自动换行
142.//参数说明:
143.//********************************************************
144.voidDisplay_HZ_Line(unsignedcharx,unsignedchary,unsignedchar*HZ)
145.{
146.
unsignedchari=0;
147.
148.
while(HZ[i]!
149.
150.
LcdWdata(HZ[i++]);
//写入需要显示汉字的高八位数据
151.
//写入需要显示字符的低八位数据
152.
if((y+i)%16==0)
//如果满一行
153.
{
154.
x++;
155.
if(x==4)
//如果满一屏
156.
x=0;
157.
Set_Cursor(x,0);
//重新设置显示的起始地址
158.
159.
}
160.}
显示一行汉字实例:
161./************************显示一行汉字*********************/
162.Display_HZ_Line(2,0,"
欢迎转载,转载请注明出处,谢谢!
"
//显示一行汉字
再来一个整体的现实效果
163.//**************************************************************************
164.//说明:
程序主函数
165.//**************************************************************************
166.voidmain(void)
167.{
168./***********************液晶初始化***************************/
169.Display_Init();
170./**********************显示单个字符*************************/
171.Set_Cursor(0,0);
//光标地址设定
172.Display_Char(0x21);
//显示字符!
173./***********************显示字符串*************************/
174.Display_String(1,0,"
175./************************显示汉字*************************/
176.Display_HZ(0,1,"
//显示电
177.Display_HZ(0,2,"
//显示子
178.Display_HZ(0,3,"
//显示园
179./************************显示一行汉字*********************/
180.Display_HZ_Line(2,0,"
181.while
(1);
182.}
四、关于CGRAM的使用:
可以参考这个网站的程序:
http:
//bbs.友好站点,请勿转贴.com/ShowTopic.aspx?
id=81220ST7920自行产生RAM提供使用者图像定义(造字)功能,可以提供四组16*16点的自定义图像空间,使用者可以将内部自行没有提供的图像自行定义到CGRAM中,便可以通过DDRAM显示在液晶屏上。
注意:
网上介绍说ST7920芯片同屏幕不能显示4个以上自定义汉字(用CGRAM)。
显示CGRAM字型:
将16位元资料写入DDRAM中,一共有0000H,0002H,0004H,0006H四种编码。
操作步骤:
设置为扩充指令集;
设置SR=O,允许设定CGRAM地址;
设置为基本指令集;
循环执行以下操作写入16个字节数据(设定CGRAM的存储地址;
写入自定义数据);
设置DDRAM地址
写入显示CGRAM显示码
CGRAM参考程序:
183.//********************************************************
184.//设置CGRAM字库
185.//ST7920CGRAM(用户自定义图标)空间分布
186.//空间1地址:
40H~4FH共16个地址,一个地址对应两个字节数据;
对应调用码:
0000H
187.//空间2地址:
50H~5FH共16个地址,一个地址对应两个字节数据;
0002H
188.//空间3地址:
60H~6FH共16个地址,一个地址对应两个字节数据;
0004H
189.//空间4地址:
70H~7FH共16个地址,一个地址对应两个字节数据;
0006H
190.//参数说明:
num为空间编号,CGRAM_ZIKU为地址指针
191.//********************************************************
192.voidSET_CGRAM(unsignedcharnum,unsignedchar*CGRAM_ZIKU)
193.{
194.unsignedchari,add;
195.LcdWcom(0x34);
//再次设置为8位并行口,扩展指令集
196.LcdWcom(0x02);
//SR=0,允许设置CGRAM地址
197.LcdWcom(0x30);
//恢复设置为8位并行口,基本指令集
198.add=(num<
<
4)|0x40;
//计算CGRAM的首地址
199.for(i=0;
16;
200.{
201.
LcdWcom(add+i);
//设置CGRAM的首地址
202.
LcdWdata(CGRAM_ZIKU[i*2]);
//写入高8位数据
203.
LcdWdata(CGRAM_ZIKU[i*2+1]);
//写入低8位数据
204.}
205.}
206.//********************************************************
207.//指定位置显示CGRAM自造字函数
208.//参数说明:
x为行号,y为列号,num为编号
209.//********************************************************
210.voidDisplay_CGRAM(unsignedcharx,unsignedchary,unsignedcharnum)
211.{
212.Set_Cursor(x,y);
213.LcdWdata(0x00);
214.LcdWdata(num*2);
215.}
216.复制代码
217.显示CGRAM自定义字库实例:
218./**********************************