小码农12864液晶再次进攻单片机

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

小码农12864液晶再次进攻单片机

LCD12864简介

变态的LCD12864液晶屏,背面3个COB牛屎堆,一个主控芯片ST7920,另外两个移位芯片ST7921

image-20211005080146245

主控芯片ST7920的功能是

1.与我们的单片机并行通讯

2.字库ROM,CGROM,DDRAM

3.行扫描COM0-COM31

4.列扫描SEG0-SEG63

5.串行方式发送数据到两片ST7921驱动芯片

驱动芯片ST7921的功能是

1.接收来自ST7920的串行信号,转化成并口驱动电压

2.根据信号要求,两片芯片分别驱动SEG64-SEG159,SEG160-SEG255

image-20211005093951823

原理图

image-20211005133240359

LCD12864时序图

并行

image-20211005112719150

写指令函数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 接地 为低电平):

  1. 写命令过程:RS 低 电平,然后命令加载到 D0- -D7, E 脚产生 下降沿 ,命令即被12864 接收并执行。
  2. 写内容过程:RS 高 电平,然后数据加载到 D0- -D7, E 脚产生 下降沿 ,数据即被 12864接收并显示 。

串行(我们没用到,想用的自己分析这个时序图就行了)

image-20211005112901724

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。允许扩充指令后,用于绘图

image-20211005143704693

前面初始化那一段可以直接用1602的,效果是一样的,那个图见另一篇

初始化函数LCD12864_Init

image-20211005145620692

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);
}
复制代码

为了看初始化咋样,我们显示一个字符看看,就暂且在初始化下面写,不能显示就看看代码哪错了

image-20211005152046828

中文错误显示

image-20211005153931962

中文正确显示

image-20211005154351271

为了方便显示汉字,我们创建汉字缓存数组(当然下面并不是方便的操作,但是为了让初学者明白原理,这是最好的操作)

image-20211005155843390

很重要的东西,显示汉字的缺陷

image-20211005172226611

液晶显示服务

//液晶显示服务
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();
}
复制代码
image-20211005172054101

12864液晶的各种存储器关系图

image-20211005120729234

下图是DDRAM的存储地址结构图,需显示的汉字就是显示在这里,液晶电路是左右半屏拼接,实际上显示是上下半屏拼接,A0H--A7H,B0H--B7H,这两行是上半屏的但是不显示出来,做上下卷屏操作的时候用。A8H--AFH,B8H--BFH,就是下半屏的卷屏缓存

如果是左右移屏操作,向左移屏,88H会显示到87H的位置,但是,地址编号和内容不改变,只是修改了显示位置

内部电路的结构

image-20211005121900412

显示屏上面的实际位置

image-20211005123658502

1.液晶初始化操作

复位后,按顺序写入指令(开显示0x0c)和(清屏0x01),然后延时一段时间

2.直接显示英文和汉字的操作

image-20211005124648092

image-20211005124938066

3.显示自定义字符的操作

image-20211005125128849

image-20211005125154133

image-20211005181504476

猜你喜欢

转载自juejin.im/post/7028723010617999368