一、简介
12864是个128x64像素,支持4位/8位接口,支持串行并行的液晶显示模块。我的这个是ST7920的芯片。内置8192个16×16点阵汉字(2Mbits GDRAM),126个16*8点阵ASCII字符(16Kbits HCGROM),用的16位的国标编码,兼容ASCII,把源文件用GB2312编码另存,需显示的字符即为对应的字符地址。GBK,GB18030,是GB2312的扩充,后面的字符没有对应的点阵汉字,显示会出问题。但前面的是一致的,也可以用,最好还是用GB2312另存。还有64 个 16-bits 自造字 RAM (CGRAM)
15 个16-bits 图标 RAM(IRAM),也可以显示图片(64x256bits GDRAM )。
并行占用io有点多,用的串行,串行和并行的传送命令与数据是一致的。
二、接线方式
2 3 4 脚自定义
三、串行时序
先CS拉高
发送第一字节 依次发送5个1, RW(读/写 0写 1读) , RS(命令/数据 0命令 1 数据 ) ,0 一共8位 (0x1f << 3 ) | (cmd <<1)
发送第二字节 依次发送数据高四位 4个0 data&0xf0
发送第三字节 依次发送数据低四位 4个0 (data&0x0f)<<4
发送完成
CS拉低
四、初始化
初始化命令
初始化流程 8位模式
4位模式
五、显示
命令集
六 代码
示例代码如下 pin自定义 显示中文 代码另存为GB2312然后编译。
#define CS 4
#define SID 3
#define SCLK 2
void writebyte(unsigned char data)
{
unsigned int i;
for( i = 0; i < 8; i++) {
digitalWrite(SID, !!(data& (1<<(7-i))));
digitalWrite(SCLK,HIGH);
digitalWrite(SCLK,LOW);
}
}
void writecmd(unsigned char data) {
writebyte(( 0x1F << 3) );
writebyte(data&0xf0);
writebyte((data << 4)&0xf0);
}
void writedata(unsigned char data) {
writebyte(( 0x1F << 3) | (1 <<1) );
writebyte(data&0xf0);
writebyte((data << 4)&0xf0);
}
void lcdclear() {
writecmd(0x30);
writecmd(1);
delayMicroseconds(1600);
}
void lcdinit() {
digitalWrite(CS,HIGH);
digitalWrite(SCK,LOW);
delay(40);
writecmd(0x30);
delayMicroseconds(100);
writecmd(0x30);
delayMicroseconds(37);
writecmd(0x0c);
delayMicroseconds(100);
writecmd(0x01);
delay(10);
writecmd(0x06);
digitalWrite(CS,LOW);
}
void showstr(int y, int x, unsigned char *str)
{
unsigned char loc = ((y&1)<<4) | ((y&2)<<2)| 0x80 |(x&0xf);
writecmd(loc);
while(*str)
writedata(*str++);
}
void setup() {
pinMode(CS,OUTPUT);
pinMode(SCLK,OUTPUT);
pinMode(SID,OUTPUT);
lcdinit();
}
void loop() {
digitalWrite(CS,HIGH);
showstr(0,0,"你好");
showstr(1,1,"你好");
showstr(2,2,"abcd");
showstr(3,3,"abcd");
digitalWrite(CS,LOW);
}