身价过亿的冰山御萝的姐姐对小码农说你有大一点的液晶吗
Posted 小码农UU
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身价过亿的冰山御萝的姐姐对小码农说你有大一点的液晶吗相关的知识,希望对你有一定的参考价值。
文章目录
- 为了御萝的姐姐,咳咳,为了扩展知识我怎么只能用弟弟那样小的液晶呢,我不应该大一点吗
- ==联动文章 [身价过亿的冰山御萝对小码农说你液晶能显示吗](https://blog.csdn.net/qq_42832862/article/details/120619604?spm=1001.2014.3001.5501)==
- LCD12864简介
- 原理图
- LCD12864时序图
- ==LCD12864的命令,CGRAM,DDRAM,DDROM,GDRAM==
- 12864液晶的各种存储器关系图
- 1.液晶初始化操作
- 2.直接显示英文和汉字的操作
- 3.显示自定义字符的操作
- ==联动文章 [身价过亿的冰山御萝对小码农说你液晶能显示吗](https://blog.csdn.net/qq_42832862/article/details/120619604?spm=1001.2014.3001.5501)==
为了御萝的姐姐,咳咳,为了扩展知识我怎么只能用弟弟那样小的液晶呢,我不应该大一点吗
联动文章 身价过亿的冰山御萝对小码农说你液晶能显示吗
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.显示自定义字符的操作
联动文章 身价过亿的冰山御萝对小码农说你液晶能显示吗
以上是关于身价过亿的冰山御萝的姐姐对小码农说你有大一点的液晶吗的主要内容,如果未能解决你的问题,请参考以下文章