欢迎来围观小白讲知识,作为硬件中的小白一枚,对于很多大神讲得东西总是摸不透,恕小白直言,大神研究得太深入,小白还依然在表面,所以小白还是看小白写得东西能懂许多。最后还是那一句 大神勿喷。
接下来进入主题教你在12864液晶上显示一些简单的文字,这仅仅是显示文字哦,对于要显示图啊什么的,我们还有后续继续说。
</br>
虽然很简单,但对于初学者来说,找不到路就很难了,很可能你把代码烧录了进去但没有显示,这就很尴尬了。所以今天带大家来学学入何简单地让显示屏显示你要显示的文字。
液晶基本特征
1. 低电源电压(VDD:+3V 或+5V),DM12864-A 为 5V,
DM12864-L 为 3.3, 驱动芯片:ST7920
2.显示分辨率:128×64 点
3. 内置汉字字库,提供 8192 个 16×16 点阵汉字(简繁体可选)
4. 内置 128 个 16×8 点阵字符
5. 2MHZ 时钟频率
6. 显示方式:STN、半透、正显
7. 驱动方式:1/32DUTY,1/5BIAS
8. 视角方向:6 点
9. 背光方式:侧部高亮白色 LED,蓝光白字,功耗仅为普通 LED 的 1/5—1/10
10. 通讯方式:串行、并口可选
11 内置 DC-DC 转换电路,无需外加负压
12 无需片选信号,简化软件设计
13 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃
并行模式下的引脚定义
控制界面的4种模式
由于我们并不需要从液晶中读出数据,因为没什么可读出来的,所以我们只需向液晶写入数据和写入命令,因此R/W=0
控制液晶的指令
对于这些指令,当我们要用时,刻意去查找就行了,指令中的X表示可以为任何的值,即1或0 。
液晶的时序图
对于要做的任意模块来说,看懂时序图是非常重要的,时序图就是让你知道何时写数据、指令。之前我们说了,我们只需写入就行,不需要读所以,把R/W置0。
当我们要写代码时,先把端口定义好先,然后在写。写指令把RS置0,按照时序图延时一下,然后把使能E置0,也延时一下,把指令写入指令口,即赋值,也要延时一下,再把使能端E拉高,即把E置1,再延时一下,这样就把指令发送给了液晶了。
</br>
void write_com(uchar cmdcode)
{
chk_busy();
LCM_RS=0;
LCM_RW=0;
LCM_EN=1;
Lcd_Bus=cmdcode;
LCM_EN=0;
}
写数据,写数据时,我们要把RS拉低,即置0,按照时序图延时一下,然后把使能E置0,也延时一下,把数据写入数据口,即赋值,也要延时一下,再把使能端E拉高,即把E置1,再延时一下,这样就把数据发送给了液晶了
</br>
void write_data(uchar Dispdata)
{
chk_busy();
LCM_RS=1;
LCM_RW=0;
LCM_EN=1;
Lcd_Bus=Dispdata;
LCM_EN=0;
}
只有使能端E处于高电平时,数据才是稳定的,所以我们发完数据或指令要稍微延时一下的原因。接下来我们就要在屏幕上指定我们要显示的地方显示了,即定位我们文字的位置。
</br>
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
write_com(pos); //设置地址
}
在发送数据或指令时,我们得检查一下,是否液晶已经处理完数据或指令了,所以我们得忙位检查一下
void chk_busy()
{
LCM_RS=0;
LCM_RW=1;
LCM_EN=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
LCM_EN=0;
}
当我们要显示第二主页面时,我们要清理一下屏幕上的文字,即清屏。
清屏很简单,只需发送指令0x01即可。
void lcm_clr(void)
{
write_com(0x01);
}
当然我们显示之前得初始化一下液晶,即要是液晶如何显示,有无光标等
void lcm_init() //初始化液晶函数
{
write_com(0x30); //选择8bit数据流
write_com(0x0c); //开显示(无游标、不反白)
lcm_clr(); //清除显示,并且设定地址指针为00H
write_com(0x06); //光标右移,DDRAM位址计数器(AC)加1,不整屏 移动
}
好了,有了这些函数,显示文字也就很容易了
#inclue<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Lcd_Bus P0 //数据口
sbit LCM_EN = P1^0; //液晶使能控制
sbit LCM_RW = P1^1; //液晶读/写控制
sbit LCM_RS = P1^2; //寄存器选择输入
sbit LCM_PSB = P1^3; //串/并方式控制 0时为串,1时为并
uchar code dis1[] = {"欢迎关注"};
uchar code dis3[] = {"五分钱特效"};
uchar code dis4[] = {"不定期更新"};
void main()
{
void lcm_init();
void lcm_clr(void);
uchar i;
Delay(10); //延时
lcd_pos(0,1); //设置显示位置为第一行的第1位开始显示
i = 0;
while(dis1[i] != '\0')
{ //显示字符
write_data(dis1[i]);
i++;
}
lcd_pos(1,1); //设置显示位置为第三行的第1位开始显示
i = 0;
while(dis3[i] != '\0')
{
write_data(dis3[i]); //显示字符
i++;
}
lcd_pos(2,1); //设置显示位置为第三行的第1个字符
i = 0;
while(dis4[i] != '\0')
{
write_data(dis4[i]); //显示字符
i++;
}
while(1);
}
这样就能显示想要显示的文字了