
带中文字库的128X64是一种具有4位/8 位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块。
其显示分辨率为128×64,内置8192个1616点汉字,和128个168点ASCII字符集,利用该模块灵活的接口方式和简单、方便的 *** 作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字,也可完成图形显示,低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
扩展资料:
用带中文字库的128X64显示模块时应注意以下几点:
1欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
2显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
3当字符编码为2字节时,应先写入高位字节,再写入低位字节。
4模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。
如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。
5“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。
参考资料:
0x38命令字代表:8位数据总线,2行57点阵显示
02H命令字代表:<1> 把光标撤回到显示器的左上方; <2> 把地址计数器(AC)的值设置为0; <3> 保持DDRAM的内容不变。
这里所谓的回车就是光标。
用单片机让LCD显示,一要保证电路正确,二是程序必须与电路相符,程序中的LCD的控制脚必须与实物相符。否则,液晶屏只亮并不显示字符。你主程序中的液晶屏初始化语句应放在第一行。你现在是放在最后了,假如前面语句显示了,可初始化后就全没了。
这个是1602的程序,每行16个显示单元,第一行地址从0x80~0x80+16,第二行0xc0~0xc0+16,一个字符占一个地址,其它的地址也是有存储单元的,只不过不能显示出来,你向1602发送一条移位指令就看出来了。也不是每个地址都有存储单元,具体不记得了,你试试就知道了。
/12864并行接口参考程序,控制器st7920/
#include <reg51h>
#include <intrinsh>
sbit RS = P3^0;
sbit RW = P3^3;
sbit E = P3^4;
sbit PSB = P3^1; //串并口选择
sbit RES = P3^5;
#define FIRST_ADDR 0 //定义字符/汉字显示起始位置
//延时子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++);
for(j=0;j<10;j++);
}
//测忙
void chk_busy()
{ RS=0;
RW=1;
E=1;
while((P1&0x80)==0x80);
E=0;
}
//读数据
unsigned char lcdrd()
{ unsigned char i;
P3=0xFB;
_nop_();
E=1;
delay(5);
i=P1;
_nop_();
E=0;
return i;
}
//写数据
void lcdwd(unsigned char dispdata)
{ chk_busy();
_nop_();
RS=1;
RW=0;
E=1;
P1=dispdata;
delay(5);
_nop_();
E=0;
_nop_();
P1=0xff;
}
//写指令代码
void lcdwc(unsigned char cmdcode)
{ chk_busy();
_nop_();
RS=0;
RW=0;
E=1;
P1=cmdcode;
delay(5);
_nop_();
E=0;
_nop_();
P1=0xff;
}
//初始化
void lcdreset()
{ delay(2000);
lcdwc(0x30); //选择基本指令集
lcdwc(0x30); //选择8bit数据流
delay(5);
lcdwc(0x0c); //开显示(无游标、不反白)
delay(5);
lcdwc(0x01); //清除显示,并且设定地址指针为00H
delay(5);
lcdwc(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void hzkdis(unsigned char code s)
{ while(s>0)
{ lcdwd(s);
s++;
delay(500);
}
}
void hzklib()
{ lcdwc(0x80+FIRST_ADDR);
hzkdis("少小离家老大回,");
lcdwc(0x90+FIRST_ADDR);
hzkdis("乡音无改鬓毛衰。");
lcdwc(0x88+FIRST_ADDR);
hzkdis("儿童相见不相识,");
lcdwc(0x98+FIRST_ADDR);
hzkdis("笑问客从何处来。");
}
//整屏显示
//当ii=0时显示上面128×32
//当ii=8时显示下面128×32
void lcdfill(unsigned char disdata)
{ unsigned char x,y,ii;
for(ii=0;ii<9;ii+=8)
for(y=0;y<0x20;y++)
for(x=0;x<8;x++)
{ lcdwc(0x36);
lcdwc(y+0x80); //行地址
lcdwc(x+0x80+ii); //列地址
lcdwc(0x30);
lcdwd(disdata);
lcdwd(disdata);
}
}
//当ii=0时显示上面128×32
//当ii=8时显示下面128×32
void lcdfill_upright(unsigned char disdata)
{ unsigned char x,y,ii;
unsigned char i,f,k;
for(ii=0;ii<9;ii+=8)
for(y=0;y<4;y++)
{ f=disdata;
for(i=0;i<8;i++)
{ if((f&1)==1)
k=0xff;
else
k=0;
for(x=0;x<8;x++)
{ lcdwc(0x36);
lcdwc(y8+i+0x80);
lcdwc(x+0x80+ii);
lcdwc(0x30);
lcdwd(k);
lcdwd(k);
}
f>>=1;
}
}
}
main()
{ unsigned char i;
i=0x55;
RES=0;
_nop_();
RES=1;
while(1)
{ PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
lcdwc(0x01);
delay(1000);
lcdfill(0xff);
delay(6000);
lcdfill(i); //显示竖条
delay(6000);
lcdfill_upright(i); //显示横条
delay(6000);
lcdfill(0);
lcdwc(0x01);
delay(1000);
hzklib();
delay(4000);
i=~i;
}
}
首先说几点:
1、关于点阵型LCD(如128×64),一般汉字显示出来所占点阵为1616点,考虑LCD driver的1页是8行,所以写一个汉字要拆成两页来写。16×16的汉字字模一般要拆分成上下两部分,都为16(列)×8(行/1页);
2、字模需要16×16个点,即162=32个byte,前16byte为上半个字,后16byte为下半个字;
lcd_cmd_wr(0xb8+2posx,0); 是定位偶数页地址,如第一个8行,上半个字
lcd_cmd_wr(0xb8+2posx+1,0); 就定位奇数页地址,如第二个8行,下半个字
lcd_cmd_wr(0x40+16posy,0); 其中posy应该是LCD的列地址(x、y坐标表示好象反了) 16是半个字的列宽度,可作为相邻两个字的列地址偏移量
for(i=0;i<16;i++) 中的i的取值是0~15(16个),汉字字模变量hanzi[i]可以逐一读取上半个汉字的16byte;
for(i=16;i<32;i++) 中i的取值是16~31(16个),汉字字模变量hanzi[i]可以逐一读取下半个汉字的16byte;
以上就是关于12864LCD 液晶显示的流程图全部的内容,包括:12864LCD 液晶显示的流程图、51单片机1602液晶实验时注释了命令0x38来设置全显示模式,发现原来在第二行显示的内容跑到了第、怎么用单片机让LCD显示呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)