虫子 12864 芯时代将崛起,码时代让位
LCD12864简介
变态的LCD12864液晶屏,背面3个COB牛屎堆,一个主控芯片ST7920,另外两个移位芯片ST7921
主控芯片ST7920的功能是
1.与我们的单片机并行通讯
2.字库ROM,CGROM,DDRAM
3.行扫描COM0-COM31
4.列扫描SEG0-SEG63
5.串行方式发送数据到两片ST7921驱动芯片
驱动芯片ST7921的功能是
1.接收来自ST7920的串行信号,转化成并口驱动电压
2.根据信号要求,两片芯片分别驱动SEG64-SEG159,SEG160-SEG255
原理图
LCD12864时序图
并行
写指令函数LCD12864_Write_Cmd
void LCD12864_Write_Cmd(u8 add)//写命令,因为操作的是地址
{
LCD12864_RS = 0;
LCD12864_RW = 1;
LCD12864_E = 0;
LCD12864_RW = 0;
LCD12864_Delay(3);
LCD12864_E = 1;
LCD12864_DB = add;
LCD12864_E = 0;
}
写数据函数LCD12864_Write_Data
void LCD12864_Write_Data(u8 Dat)//写数据
{
LCD12864_RS = 1;
LCD12864_RW = 1;
LCD12864_E = 0;
LCD12864_RW = 0;
LCD12864_Delay(3);
LCD12864_E = 1;
LCD12864_DB = Dat;
LCD12864_E = 0;
}
==这些写指令写数据函数和1602一样的因为他们的时序图是一样的,因此程序也是一样的==
12864 字符型 LCD 的写操作过程(W R/W 接地 为低电平):
- 写命令过程:RS 低 电平,然后命令加载到 D0- -D7, E 脚产生 下降沿 ,命令即被12864 接收并执行。
- 写内容过程:RS 高 电平,然后数据加载到 D0- -D7, E 脚产生 下降沿 ,数据即被 12864接收并显示 。
串行(我们没用到,想用的自己分析这个时序图就行了)
==LCD12864的命令,CGRAM,DDRAM,DDROM,GDRAM==
1.基本命令,地址范围是0x00–0x3f。用来操作液晶的硬件配置等基本功能
2.扩充指令,地址范围是0x00–0x3f。用来绘图,反白显示等高级功能
3.CGRAM,地址范围0x40–0x7f。用来保存液晶本身没有的其他自定义的图像
4.DDRAM,地址范围是0x80–0x8f。用来保存ASCII码值,通过ASCII码指向自定义CGRAM图像数据首地址或者光刻的CGRAM图像数据首地址
5.GDRAM,地址范围是0x80–0xff。允许扩充指令后,用于绘图
前面初始化那一段可以直接用1602的,效果是一样的,那个图见另一篇
初始化函数LCD12864_Init
void LCD12864_Init()
{
P4M1 = 0;
P4M0 = 0;//把P4全部设置为标准IO口,这里不讲究了
//这时候就根据时序图写时序
LCD12864_Delay(250); //上电后等待至少15ms,才能往LCD写指令
LCD12864_Delay(250); //上电后等待至少15ms,才能往LCD写指令
LCD12864_Write_Cmd(0x38);
LCD12864_Write_Cmd(0x01);
LCD12864_Delay(50);
LCD12864_Write_Cmd(0x02);
LCD12864_Delay(50);
LCD12864_Write_Cmd(0x06);
LCD12864_Write_Cmd(0x0c);
LCD12864_Write_Cmd(0x14);
}
==为了看初始化咋样,我们显示一个字符看看,就暂且在初始化下面写,不能显示就看看代码哪错了==
中文错误显示
中文正确显示
为了方便显示汉字,我们创建汉字缓存数组(当然下面并不是方便的操作,但是为了让初学者明白原理,这是最好的操作)
==很重要的东西,显示汉字的缺陷==
液晶显示服务
//液晶显示服务
void LCD12864_Display_Ser()
{
LCD12864_Write_Cmd(0x80);
LCD12864_Write_Data(LCD12864_Write_Buffer[0]);
LCD12864_Write_Data(LCD12864_Write_Buffer[1]);
LCD12864_Write_Data(LCD12864_Write_Buffer[2]);
LCD12864_Write_Data(LCD12864_Write_Buffer[3]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[14]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[15]);//年
LCD12864_Write_Data(LCD12864_Write_Buffer[4]);
LCD12864_Write_Data(LCD12864_Write_Buffer[5]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[16]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[17]);//月
LCD12864_Write_Data(LCD12864_Write_Buffer[6]);
LCD12864_Write_Data(LCD12864_Write_Buffer[7]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[18]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[19]);//日
}
液晶数据分配
void LCD12864_Allot()//永远都要记住LCD是慢的模块
//不需要刷的很快(因为他放在main里面是快刷的)所以我们
//为了不影响其他器件,我们让他刷的次数降低就行
{
static xdata u16 count = 0;
count++;
if(count>500)
{
count = 0;
//两个字节一组数字
LCD12864_Write_Buffer[0] = 0x30+2;//不能直接2,要转成ASCII值
LCD12864_Write_Buffer[1] = 0x30+0;
LCD12864_Write_Buffer[2] = 0x30+2;
LCD12864_Write_Buffer[3] = 0x30+1;
LCD12864_Write_Buffer[4] = 0x30+1;
LCD12864_Write_Buffer[5] = 0x30+0;
LCD12864_Write_Buffer[6] = 0x30+0;
LCD12864_Write_Buffer[7] = 0x30+5;
}
LCD12864_Display_Ser();
}
12864液晶的各种存储器关系图
下图是DDRAM的存储地址结构图,需显示的汉字就是显示在这里,==液晶电路是左右半屏拼接,实际上显示是上下半屏拼接==,A0H–A7H,B0H–B7H,这两行是上半屏的但是不显示出来,做上下卷屏操作的时候用。A8H–AFH,B8H–BFH,就是下半屏的卷屏缓存
如果是左右移屏操作,向左移屏,88H会显示到87H的位置,但是,地址编号和内容不改变,只是修改了显示位置
==内部电路的结构==
==显示屏上面的实际位置==
1.液晶初始化操作
复位后,按顺序写入指令(开显示0x0c)和(清屏0x01),然后延时一段时间
2.直接显示英文和汉字的操作
3.显示自定义字符的操作
- 点赞
- 收藏
- 关注作者
评论(0)