时隔3个月没有更新《MCU之心路分享》了,不知道我是否有幸,让胖螃蟹小编对我拍拍砖呢?嘿嘿…….这3个月,一直都没有离开过EDN,一直都潜伏着,这3个月中,见证,陪伴,小小地参与了《与单片机牵手的那些年》一书一点一滴的成长,感觉自己是幸福的,也是幸运的!
2月,参与了简爱基金公益组织——“在爱中行走”寻梦海南,徒步环岛,来到了祖国最南端-----美丽的三亚,我们走过海口,文昌,万宁,琼海,陵水,五指山,三亚等等城市,在穷游的行走路上,我们一路商战,一路公益,一路成长着,忍受过饥饿,忍受过寒冷,………睡过公园,睡过操场,睡过图书馆,…..…..累似乎都不算什么了,最重要的是我们都当过屌丝,奇葩了呀!哈哈………在此,也借助强大的EDN,随便宣传下简爱基金,让更多大学生参与公益,去穷游,去体验生活与人生,让我们未来的路在爱中行走,在爱中醉爱电子吧!
3月,当然是好好过年,什么都不想啦,一年没有回家的孩子确实好好陪陪爸妈了!、、......打住,说多都是泪,还是进入正题吧!
———————————————————————————————————————
本小节目录:
8.1,12864液晶的简介
8.2,12864液晶连接单片机原理图
8.3,12864时序图的分析和程序编写
液晶是非常能给人视觉享受的东西啦!例如手机的液晶屏,液晶电视,………,浪漫点的还有液晶灯,迷人的液晶鞋,炫酷的液晶手表,,,,,,等等!但不管怎么说,还是学会使用最简单的液晶吧!
8.1.1)12864液晶的简介
常用的12864液晶模块有黄绿背光的、蓝色背光的,有带/不带字库的,其控制芯片主要有如KS0108、T6863、ST7920等,这里本人用的为ST7920为控制芯片的YB12864-ZB液晶屏。但不管用什么类型的12864,其使用操作都大同小异!当然,如果会使用1602了,12864的使用也变得事半功倍啦!
1)关于12864液晶的说明:
1,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM),显然比1602高级!
2,可以选择8位并行或者4位串行操作
3,可以显示128列× 64行内容,可实现文字与图形混合显示功能、可以自由的设置光标、显示移位功能、垂直画面旋转功能、反白显示功能、休眠模式等
图1 12864液晶实物图
2)12864液晶接口说明:
图2 12864液晶接口图
简介上图:
1,引脚3(VL):一般接一个103的电位器,用于调节液晶的显示亮度。
2,引脚15(PSB):高电平时选择并口,低电平时选择串口
3,引脚16(NC):空脚即不需要接任何管脚即可。
3)12864状态字说明
表8-1 状态字分布表
STA7 D7 |
STA6 D6 |
STA5 D5 |
STA4 D4 |
STA3 D3 |
STA2 D2 |
STA1 D1 |
STA0 D0 |
||
STA0~STA6 |
当前地址指针的数值 |
- |
|||||||
STA7 |
读/写操作使能 |
1:禁止 0:使能 |
|||||||
严格来说,对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0。也即一般程序中所谓的判断忙操作。
8.1.2)12864指令说明
表8-2基本指令表
指令名称 |
指令码 |
指令说明 |
|||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
||
清屏 |
L |
L |
L |
L |
L |
L |
L |
H |
清屏:1、数据指针清零 2、所有显示清零 |
归位 |
L |
L |
L |
L |
L |
L |
H |
* |
AC = 0,光标、画面回HOME位 |
输入方式 设置 |
L |
L |
L |
L |
L |
H |
ID |
S |
ID=1→AC自动增一; ID=0→AC减一 S=1→画面平移; S=0→画面不动 |
显示开 关控制 |
L |
L |
L |
L |
H |
D |
C |
B |
D=1→显示开;D=0→显示关 C=1→游标显示;C=0→游标不显示 B=1→游标反白;B=0→光标不反白 |
移位控制 |
L |
L |
L |
H |
SC |
RL |
* |
* |
SC=1→画面平移一个字符; SC=0→光标 R/L=1→右移;R/L=0→左移 |
功能设定 |
L |
L |
H |
DL |
* |
RE |
* |
* |
DL=0→8位数据接口; DL=1→4位数据接口 RE=1→扩充指令; RE=0→基本指令 |
设定 CGRAM 地址 |
L |
H |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
设定CGRAM地址到地址计数器(AC),AC范围为00H~3FH需确认扩充指令中SR=0 |
设定 DDRAM 地址 |
H |
L |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
设定DDRAM地址计数器(AC) 第一行AC范围:80H~8FH 第二行AC范围:90H~9FH |
表8-3扩充指令表
指令名称 |
指令码 |
指令说明 |
|||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
||
待命模式 |
L |
L |
L |
L |
L |
L |
L |
H |
进入待命模式后,其他指令都可以结束待命模式 |
卷动 RAM 地址选择 |
L |
L |
L |
L |
L |
L |
H |
SR |
SR=1→允许输入垂直卷动地址 SR=0→允许输入IRAM地址(扩充指令)及设定CGRAM地址 |
反白显示 |
L |
L |
L |
L |
L |
H |
L |
R0 |
R0=1→第二行反白;R0=0→第一行反白(与执行次数有关) |
睡眠模式 |
L |
L |
L |
L |
H |
SL |
L |
L |
D=1→脱离睡眠模式; D=0→进入睡眠模式 |
扩充功能 |
L |
L |
H |
DL |
* |
RE |
G |
* |
DL=1→8位数据接口; DL=0→4位数据接口 RE=1→扩充指令集; RE=0→基本指令集 G=1→绘图显示开; G=0→绘图显示关; |
设定 IRAM地址 卷动地址 |
L |
H |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
SR=1→A5~A0为垂直卷动地址 SR=0→A3~A0为IRAM地址 |
设定 绘图RAM 地址 |
H |
L |
L |
L |
A3 |
A2 |
A1 |
A0 |
垂直地址范围:AC6~AC0 水平地址范围:AC3~AC0 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
8.1.3) 12864显示坐标关系
1)汉字显示坐标
表8-4汉字显示坐标地址表
行名称 |
列地址 |
|||||||
第一行 |
80H |
81H |
82H |
83H |
84H |
85H |
86H |
87H |
第二行 |
90H |
91H |
92H |
93H |
94H |
95H |
96H |
97H |
第三行 |
88H |
89H |
8AH |
8BH |
8CH |
8DH |
8EH |
8FH |
第四行 |
98H |
99H |
9AH |
9BH |
9CH |
9DH |
9EH |
9FH |
2)绘图坐标分布图
图3 12864液晶绘图显示坐标
水平方向有128个点,垂直方向有64个点,在更改绘图RAM时,由扩充指令设置GDRAM地址,设置顺序为先垂直后水平地址(连续2个字节的数据来定义垂直和水平地址),最后是2个字节的数据给绘图RAM(先高8位,后低8位)。
最后总结一下12864液晶绘图的步骤,步骤如下:
1) 关闭图形显示,设置为扩充指令模式。
2) 写垂直地址,分上下半屏,地址范围为:0~31。
3) 写水平地址,两起始地址范围分别为:0x80~0x87(上半屏)、0x88~0x8F(下半屏)。
4) 写数据,一帧数据分两次写,先写高8位,后写低8位。
5) 开图形显示,并设置为基本指令模式。
在此说明一点,也是好多新人模糊的地方。ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,12864液晶的32-63行是从0-31行的第128列划分出来的。也就是说12864的实质是“256×32”,只是这样的屏“又长又窄”,不适用,所以将后半部分截下来,拼装到下面,因而有了上下两半屏之说。再通俗点说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推。
如果还不明白,暂时不需要深究,当会用的时候,自然而然就会明白了!
8.2)12864液晶连接单片机原理图
图4 麦光单片机开发板中液晶连接单片机图
有些初学者可能会问? 为什么电路图是这样连接的,读者可以对照上图2即知
接口说明:
1)液晶1、2为电源接口; 19、20为背光电源。
2) 液晶3端为液晶对比度调节端,其中连接一个10KΩ电位器来调节液晶对比度第一次使用时,在液晶上电状态下,调节至液晶上面一行显示出黑色小格为止。
3) 液晶4端为向液晶控制器写数据、命令选择端,接单片机的P3.5口。
4)液晶5端为读、写选择端,接单片机的P3.4口。
5)液晶6端为使能信号端,接单片机的P3.3口。
6)液晶15端为串(L)、并(H)口选择端,接单片机的P3.2口。
7)液晶16、18为空管脚口,在硬件上不做连接。
8)液晶7~14为8位数据端口,依次接单片机的P0口。
8.3,12864时序图的分析和程序编写
这里本人只介绍并行操作,串行操作基本留给感兴趣的读者去探索吧!
1) 并行写操作时序图
图5 12864写操作时序图
相信看懂1602的人都很容易知道时序图了,在此不多说
/*************************************************
函数功能: 写命令数据到LCD
入口参数: Cmd
出口参数: void
RS=L; RW=L, E=高脉冲,D0~D7=指令码
**************************************************/
void Write_LCD_Command(Uchar8 Cmd) // 写命令
{
LCD_Busy_Wait(); // 忙检测
LCD_Rs = 0;
LCD_Rw = 0;
LCD_En = 0;
P0 = Cmd;
Delay_1ms(5);
LCD_En = 1;
Delay_1ms(5);
LCD_En = 0;
}
/*************************************************
函数功能: 写数据
入口参数: Data
出口参数: void
RS = H, RW = L, E= 高脉冲, D0~D7= 数据。
*************************************************/
void Write_LCD_Data(Uchar8 Date) // 写数据
{
LCD_Busy_Wait(); // 忙检测
LCD_Rs = 1;
LCD_Rw = 0;
LCD_En = 0;
P0 = Date;
Delay_1ms(5);
LCD_En = 1;
Delay_1ms(5);
LCD_En = 0;
}
以上程序的说明基本跟1602液晶是一样的
/*******************************************************
函数功能:行列(位置)选择,设定显示位置
入口参数:X(行)、Y(列)
出口参数:无
******************************************************/
void lcd_pos(Uchar8 X, Uchar8 Y)
{
Uchar8 pos;
if(X ==1) {X = 0x80;} // 第一行
else if(X == 2) {X = 0x90;} // 第二行
else if(X == 3) {X = 0x88;} // 第三行
else if(X == 4) {X = 0x98;} // 第四行
pos = X+Y;
Write_LCD_Command(pos); // 显示地址
}
由于程序太长,为了更好编辑,本人已将剩下程序上传,需看可下载。
本人见过有些程序中没有忙检测也是可以的,但个人一直认为:加上忙检测LCD_Busy_Wait()是非常有必要的,为什么?1,对于电子学习的一种严谨,培养这种意识吧 2,为日后我们使用更大,更复杂液晶的时候避免出现不必要的麻烦呀!3,一颗不严谨,不靠谱的心,如何给女人安全感呀?嘿嘿………..
怎么说液晶也算是有点娇气的东东啦!并且很多液晶价格蛮贵的!还是建议看看佳佰科技有关于液晶使用注意事项吧:
1.处理
(1)要避免在处理机械振动和对模块施加外力,都可能使屏不显示或损坏。
(2)不能用手或坚硬工具或物体接触、按压、磨擦显示屏,否则屏上的偏光片被物体划坏。
(3)如果屏破裂液晶材料外漏,液晶可以通过空气被吸入,而且要避免液晶与皮肤接触,如果接,触应立即用酒精冲洗,然后再用水彻底冲洗。
(4)不能使用可溶有机体来清洗显示屏。因为这些可溶的溶剂对偏光片不利,清洗显示屏时,可
用棉花蘸少量石油苯轻轻擦拭或用透明胶带粘起脏物。
(5)要防止高压静电产生的放电,将损坏模块中的 CMOS 电路。
(6)不能把模块放在温度高的地方,尤其不能长时间放在湿度大的地方,最好把模块放在温度为
0℃-35℃,湿度低于 70%的环境中。
(7)模块不能贮存在太阳直射的地方。
2.操作
(1)当电源接通时,不能组装或拆卸模块。
(2)在电源电压的偏差、输入电压的偏差及环境温度等最坏条件下,也不能超过最大的额定值,
否则将损坏 LCD 模块。
说明:所用开发板为:麦光电子单片机开发板
提前告知:《MCU之心路分享》下章更新,最小系统的搭建(万能板焊接,面包板搭建,以及PCB版)
于2014年03月10日
用户1659913 2014-3-22 11:02
用户403664 2014-3-13 16:01