带中文字库液晶显示模块12864/12232开发笔记
带中文字库液晶显示模块12864/12232开发整理
广东职业技术学院 欧浩源(ohy3686@foxmail.com)
一、概述
1. 液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16×16点阵)、128个字符(8×16点阵)及64×256点阵显示RAM(GDRAM)。
2. LCD类型:STN。
3. 接口方式:8位并口、4位并口、三线串口(CS、CLK、SID)。
4. 供电电压:分3.3V和5.0V两种。(供应商说不通用,诸位购买时需注意)。
5. 工作温度:0到60℃(常温),-20℃到75℃(宽温)。
二、引脚定义
三、串行通信时序
根据串行方式时序图,首先设计底层的字节发送驱动程序。
函数名:SendByte_LCD
参数:data—需要发送的字节。
void SendByte_LCD(unsigned char data){
unsigned char i;
CS = 1;
CLK = 0;
for(i=0; i<8; i++){
if(data & 0x80) {SID =1;} //高位字节先发送
else {SID =0;}
data << 1; //准备下一位数据
CLK = 1;
Delay(200); //发送一位数据
CLK = 0;
}
CS = 0;
}
四、串行数据传送规则
串行数据传送共分三个字节完成:
第一字节:串口控制格式。
1 1 1 1 1 A B C
A:数据传送的方向控制。
H—数据从LCD到MCU。
L—数据从MCU到LCD。
B:数据的类型选择。
H—是用户显示的数据。
L—是控制模块的指令。
C:固定为0.
第二字节:(并行)8位数据的高4位:D7 D6 D5 D4 0 0 0 0
第三字节:(并行)8位数据的低4位:D3 D2 D1 D0 0 0 0 0
根据串行数据的传送规则,发送数据和发送指令是不同的,因此,在实际应用中,可以设计两个发送子程序来完成相应的功能。
1. 发送指令子程序:SendCMD_LCD
void SendCMD_LCD(unsigned char dat){
SendByte_LCD( 0xf8 ); // 1 1 1 1 1 0 0 0
SendByte_LCD( dat & 0xf0 );
SendByte_LCD( (dat << 4 ) & 0xf0 );
}
2. 发送数据子程序:SendDAT_LCD
void SendDAT_LCD(unsigned char dat){
SendByte_LCD( 0xfa ); // 1 1 1 1 1 0 1 0
SendByte_LCD( dat & 0xf0 );
SendByte_LCD( (dat << 4 ) & 0xf0 );
}
五、显示坐标关系
六、显示模块子程序设计
1. 显示汉字子程序
void DisplayC_LCD ( unsigned char addr, //显示内容的起始地址
unsigned char *data, //显示内容的汉字指针
unsigned char num ) //显示的汉字数目
{
unsigned char n;
SendCMD_LCD( addr );
for ( n=0; n<num; n++){
SendDAT_LCD( data ); //一个汉字有两个字节的内码
data++;
SendDAT_LCD( data );
data++;
}
}
例如:要在第2行中间的位置显示:“中国广东”,即:
DisplayC_LCD ( 0x93, “中国广东”, 4 );
由于有些集成开发环境对中文支持不够,导致输入的字符串为乱码,可以通过相关软件先将要输入的汉字内码查出来,然后一个个输入。这种方法虽不便,但可靠。
2. 显示汉字子程序(内码输入方法)
void DisplayD_LCD ( unsigned char addr, //显示内容的起始地址
unsigned char data1, //汉字内码的第一字节
unsigned char data2 ) //汉字内码的第二字节
{
SendCMD_LCD( addr );
SendDAT_LCD( data1 );
SendDAT_LCD( data2 );
}
例如:要在第2行中间的位置显示:“广”(内码:B9H, E3H),即:
DisplayD_LCD ( 0x93, 0xB9, 0xE3 );
3. 显示字符和数字子程序
void DisplayN_LCD ( unsigned char addr, //显示内容的起始地址
unsigned char *data, //显示内容的字符指针
unsigned char num ) //显示的字符数目
{
unsigned char n;
SendCMD_LCD( addr );
for ( n=0; n<num; n++){
SendDAT_LCD( data ); //一个字符只有一个字节的内码
data++;
}
}
例如:要在第2行中间的位置显示:“12345678ABCD”,即:
DisplayN_LCD ( 0x93, “12345678ABCD”, 12 );
4. 数字转换字符程序
由于数字不能直接输入显示,为了方便使用,计算结果先通过该程序转换为字符显示。
void DisplayN2S_LCD (unsigned char num ) //显示的数字
{
SendCMD_LCD( addr );
switch ( num ){
case 0: SendDAT_LCD( ‘0’ ); break;
case 1: SendDAT_LCD( ‘0’ ); break;
……
case 14: SendDAT_LCD( ‘E’ ); break;
case 15: SendDAT_LCD( ‘F’ ); break;
default: SendDAT_LCD( ‘R’ ); break;
}
}
例如:要在第2行中间的位置显示数字5,即:
SendCMD_LCD( 0x93 );
DisplayN2S_LCD( 5 );
七. 初始化设置
30H:功能设置。基本指令集,一次送8位数据。
04H:设定进入点。显示字符,光标从左到右位移,DDRAM地址加1.
0CH:显示设定。整体显示,不显示游标。
01H:清零。将DDRAM填满20H清零,地址AC恢复到00H。
02H:设定DDRAM地址计数器AC到00H,并且光标移到开头原点位置,不改变DARAM的内容。
八. 12232与12864开发的差别
对于带中文字库的LCD液晶模块12232F的应用,方法和上述几乎一致,不同的是显示坐标有所差别,12232F的坐标关系如下。
好资料,学习了,谢谢分享。
谢谢小编的分享! 好资料
哇哦,太好的资料了
进来学习一下下了,