ST7920是台湾矽创(SITRONIX)公司早期推出的适用汉字字符显示的LCD控制器,可以实现常规汉字、数字、英文显示,与MCU接口非常简单易用。现在有AIP31020(无锡中微)系列替代产品面市。
一、主要特点
1.1 工作电压范围宽,2.7V-5.5V;
1.2 支持8BIT,4BIT,串口通讯;
1.3 内置64x16位显示缓存(DDRAM);
1.4 内置64x256位图形显示缓存(GDRAM);
1.5 内置16Kbit 半宽字符存储器(HCGROM),支持126个8BIT宽度字符显示(16x8 dots);
1.6 自带32com/64segment驱动,支持4x2行全点阵汉字显示(16x16 dots);
1.7 上电自动复位/外部复位;
1.8 与ST7921搭配可扩展字符显示到16x2(或8x4,256x32点阵)行全点阵汉字显示;
1.9 内置RC振荡器,可通过外部电阻调节;
1.10 功耗低:正常工作450uA(VDD=5V),省电模式30uA(VDD=5V);
1.11 内置VLCD升压,可达到7.0V;
1.12 COB封装
二、选型参考
ST7920支持简体汉字、繁体汉字、简繁日文、简繁日韩文显示,应根据不同要求,选用不同字库IC,型号对照如下
三、VLCD设置
ST7920只能支持33com(含光标行)驱动,根据前面介绍的LCD特性,当驱动路数越高,VLCD电压尽量提高,以到达好的显示效果。在用ST7920设计LCD时,通常选用33duty,1/5或1/6Bias,Vlcd 6.5V;因为Vlcd超过了VCC电压,需要外部输入或者用内部升压方式才能满足Vlcd要求。
外部输入VLCD电路,R10可以调节,当VLCD大于VCC时,需从外部输入VLCD;
内部升压VLCD,适用于VDD=3.3V的场合,注意无论外部输入还是内部升压,VLCD不能超过7.0V。
四、指令简介
ST7920分为基本指令集和扩展指令集,通常我们用基本指令即可,需要特殊显示效果可用扩展指令。
五、应用原理图(仅参考)
图中是16032的原理图,实际ST7920最大可以扩展到256x32路输出。(ST7920+2个ST7921)
六、参考例程(通过51编译,读者需根据实际情况修改)
//G16032测试程序 //日期:2005-2-18 #include#include #include "16032.h" #include "16032_1.h" //#include "16032_2.h" #include "log.h" #define uchar unsigned char #define uint unsigned int //12864液晶操作口 sbit rs = P2^7; sbit rw = P2^6; sbit en = P2^5; #define Pdata P1 // 并行数据口DB0-DB7接入到口 //=================延时========================================= void delay(uint t) { uint i,j; for(i=0;i 2) { x= 0x88; y=(( yy-3 )<<4)+0x80; } else { x=0x80; y=((yy-1)<<4)+0x80; } writecommand(0x36); for (i=0;i<16;i++) { writecommand(y++);writecommand(x); for (j=0;j<16;j++) //一行宽度是16的点 writedata(0xff); } writecommand(0x30); }*/ //===========字符显示============================================ void display(uchar y, uchar x, uchar *p) { switch (y) { case 1:writecommand(0x7f+x); break; //液晶第一行 case 2:writecommand(0x8f+x); break; //0x90+(x-1) default:break; } while(*p) writedata(*p++); } //===========图片显示============================================ void dis_BMP(uchar *P) { unsigned char i,j,com; writecommand(0x01); delay(10); //清屏 writecommand(0x32); delay(10); //功能设置---8BIT控制界面,绘图显示ON writecommand(0x36); delay(10); //功能设置---8BIT控制界面,扩充指令集 //以上是显示图命令设置 com=0x80; for(i=0;i<32;i++) // ,32行,(双屏结构中上半屏) { writecommand(com); //垂直坐标 com=com+1; writecommand(0x80); //水平坐标 for(j=0;j<20;j++) { writedata(P[j+i*20]); //图形数据入口地址 } } } //===========图片显示============================================ void dis(uchar A,B) { unsigned char i,j,com; writecommand(0x01); delay(10); //清屏 writecommand(0x32); delay(10); //功能设置---8BIT控制界面,绘图显示ON writecommand(0x36); delay(10); //功能设置---8BIT控制界面,扩充指令集 //以上是显示图命令设置 com=0x80; for(i=0;i<32;i++) // ,32行,(双屏结构中上半屏) { writecommand(com); //垂直坐标 com=com+1; writecommand(0x80); //水平坐标 for(j=0;j<20;j++) { if(i%2==0)writedata(A); // else writedata(B); // } } } //============================================================== /* 主函数 */ //============================================================== void main(void) { lcdset(); delay(10); lcdset(); //调用两次可以解决上电后液晶不能自动复位问题 while(1) { dis_BMP(gImage_log); delay(65500);delay(655); writecommand(0x30); //基本指令集 writecommand(0x01); //清屏,DDRAM的地址归零 display(1,4,"欢迎光临"); display(2,1," 简单 高效 创新 "); delay(50000); dis_BMP(gImage_16032); delay(65500);delay(50000); dis_BMP(gImage_16032_1); delay(50000); dis(0X55,0XAA); //以下是行列测试 delay(50000); dis(0Xaa,0X55); delay(50000); dis(0X55,0X55); delay(50000); dis(0Xaa,0XAA); delay(50000); dis(0X00,0Xff); delay(50000); dis(0Xff,0X00); delay(50000); } }
完成编译后,就能看到如图显示(图片内容与例程不同)