概述
声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。
作者:sumjess
一、液晶概述:
液晶(LiquidCrystal) 是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄型显示器上。
+55°C,存储温度范围为-20°C+60°C,即使是宽温级液晶,其正常工作温度范围也仅为-20°C+70°C,存储温度范围为-30°C+80°C,因此在设计相应产品时,务必要考虑周全,选取合适的液晶。
二、常用1602液品操作实例:
1602液晶的讲解以并行操作为主,设计两个程序,一个是在液晶的任意位置显示字符,另一个是滚动显示一串字符。
接口信号说明
主要技术参数(见表 7.2.2 )
基本操作时序
RAM地址映射图
0F、404F地址中的任一处写入显示数据时,液晶都可立即显示出来,当写入到1027或5067地址处时,必须通过移屏指令将它们移入可显示区域方可正常显示。
状态字说明(见表7.2.3)
注意:原则上每次对控制器进行读/写操作之前,都必须进行读/写检测,确保STA7为0。实际上,由于单片机的操作速度慢于液晶控制器的反应速度,因此可以不进行读/写检测,或只进行简短延时即可。
6、数据指针设置
其他设置(见表 7.2.5 )
初始化设置
液晶1,2端为电源;15,16为背光电源;为防止直接加5V电压烧坏背光灯,在15脚串接一个10Ω电阻用于限流。
液晶3端为液晶对比度调节端,通过一个10kΩ电位器接地来调节液晶显示对比度。首次使用时,在液晶上电状态下,调节至液晶上面一行显示出黑色小格为止。
液晶4端为向液晶控制器写数据/写命令选择端,接单片机的P3.5口。
液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入命令和显示数据,因此此端始终选择为写状态,即低电平接地。
#include <reg52.h>
//编译器自带的库用 < >
编译器包含C52的定义
#include <intrins.h> //编译器自带的库用 < >
循环移位函数等
#include <stdio.h>
//编译器自带的库用 < >
标准输入输出函数
#include <stdlib.h>
//编译器自带的库用 < >
C语言标准库函数
#include "delay_Sum.h"
//后加的库用 “ ”
延时函数、显示器延时函数
#include "74hc595_Sum.h" //后加的库用 “ ”
74hc595芯片操作
#include "boardinit_Sum.h" //后加的库用 “ ”
数码管硬件芯片定义
#include "1602_Sum.h"
//后加的库用 “ ”
1602函数
void main()
{
char e[16]={"123456789Sumjess"};
uchar m=0;
boardinit();
//数码管硬件初始化
lcdinit_1602();
//1602初始化
while(1)
{
m=rand();
Disp_1602(1,1,e,16);
Disp_1602(1,2,"
00:00:00
",16);
write_twoline_1602(2,(int)m);
delay(1000);
}
}
库函数如下:
/*
* 文 件 名:1602led.c.c
* 芯
片:1602液晶
* 晶
振:11.0592MHz
* 创 建 者:XK
* 创建日期:2011.8.6
* 修 改 者:
* 修改日期:
* 功能描述:1602,写数据函数
*/
#include <reg52.h>
#include "1602_Sum.h"
#include "delay_Sum.h"
#include "74hc595_Sum.h"
sbit rs_1602=P2^5; //1602rs信号
sbit rw_1602=P2^6; //1602rw信号
sbit e=P2^4;
/*
void write_zl(uchar zl)
{
rs=0;
P0=zl;
delay(5);
e=1;
delay(5);
e=0;
}
void write_sj(uchar sj)
{
rs=1;
P0=sj;
delay(5);
e=1;
delay(5);
e=0;
}
*/
void write_order_1602(uchar order_data)
{
e=0;
rs_1602=0;
P0=order_data;
e=1;
delay(1);
e=0;
}
void write_data_1602(uchar data_1602)
{
e=0;
rs_1602=1;
P0=data_1602;
e=1;
delay(1);
e=0;
}
/
//功能:按指定位置显示一串字符
///
//输入:
//列显示地址x_1602(取值范围1-16)
//行显示地址y_1602(取值范围1-2),
//指定字符串指针*p_1602,
//要显示的字符个数count_1602 (取值范围1-16)
///
// 子函数使用例子: Disp_1602(1,1," TEMP:
.
",16); //在1602第一行第一列写16个字符,既字符串数据
/
void Disp_1602(unsigned char x_1602,unsigned char y_1602,unsigned char *p_1602,unsigned char count_1602)
{
unsigned char i;
for(i=0;i<count_1602;i++)
{
if (1 == y_1602)
x_1602 |= 0x80; //当要显示第一行时地址码+0x80;
else x_1602 |= 0xC0;
//在第二行显示是地址码+0xC0;
write_order_1602(x_1602-1);
write_data_1602(*p_1602);
x_1602++;
p_1602++;
}
}
void write_oneline_1602(uchar add_1602,uint date_1602)
{
uchar ge,shi;
shi=date_1602/10;
ge=date_1602%10;
write_order_1602(0x80+add_1602-1);
write_data_1602(0x30+shi);
write_order_1602(0x80+add_1602);
write_data_1602(0x30+ge);
//在1602上写时间函数
即在1602第二行指定位置上写显示
}
void write_twoline_1602(uchar add_1602,uint date_1602)
{
uchar shi,ge;
shi=date_1602/10;
ge=date_1602%10;
write_order_1602(0x80+0x40+add_1602-1);
write_data_1602(0x30+shi);
write_order_1602(0x80+0x40+add_1602);
write_data_1602(0x30+ge);
//在1602上写时间函数
即在1602第二行指定位
}
void lcdinit_1602()
{
rw_1602=0;
e=0;
write_byte_74hc595(0X02);//关流水灯使能 关蜂鸣器 光继电器 打开1602背光打开
write_order_1602(0x38);
//液晶设置不判忙模式
write_order_1602(0x0c);
//开显示 不显示光标
write_order_1602(0x06);
//当写一个字符是,地址指针加 1
write_order_1602(0x01);
//显示清屏
}
分析如下:
写命令操作和写数据操作分别用两个独立的函数来完成,函数内部唯一的区别就是液晶数据命令选择端的电平,写命令函数解释如下:
write_com(0x38); //设置16X2显示,5X7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针自动加1write_com(0x01); //显示清0, 数据指针清0
write_com(0x80);"命令先将数据指针定位到第一行第一个字处,然后写完第一行要显示的字,在每两个字之间做简短延时,这个时间可自行测试,时间太长会影响写入及显示速度,时间太短会影响控制器接收数据的稳定性,以测试稳定为最佳。
write_com(0x80+0x40)。
分析如下:
write_com(0x80+0x10);",将数据写在液晶第一行非显示区域地址处,写第二行时同样用’'write_com(0x80+0x10);"定位数据指针,这样写的目的是在接下来要使用移屏命令将液晶整屏向左移动。
write_com(0x18);"为整屏左移指令,每间隔200ms移动l个地址,共移动16个地址,刚好将要显示的数据全部移入液晶可显示区域。
0x07指令也可完成移屏功能,大家可自行做实验验证。
三、常用12232 液晶操作实例:
12232液晶的讲解以串行操作为主,设计两个程序,一个是在液晶的任意位置显示数字、符号和汉字,另一个是滚动显示一串字符。
接口信号说明
主要技术参数(见表7.3.3)
井行基本操作时序
4、忙标志(BF)
5、字型产生ROM(CGROM)
6、显示数据RAM(DDRAM)
0F的编码中将选择CGRAM的定义,107F的编码中将选择瘦长英数字的字型,至于A0以上的编码自动地结合下一个位元组,组成两个位元组的编码,形成中文字型编码(A140~D75F)。
字型产生RAM(CGRAM)
地址计数器AC
游标/闪烁控制电路
状态字说明(见表7.3.4)
注意:原则上每次对控制器进行读/写操作之前,都必须进行读/写检测,确保STA7为0。实际上,由千单片机的操作速度低于液晶控制器的反应速度,因此可以不进行读/写检测,或只进行简短延时即可。
指令说明(见表7.3.5)
井行写操作时序(见图7.3.1)
串行读/写操作时序(见图7.3.2)
分析如下:
分析如下:
四、常用12864液品操作实例:
12864液晶操作方法与7.3节12232液晶操作方法非常相似,本节讲解其并行操作方法,设计一个程序,在液晶的任意位置显示数字、符号和汉字。
接口信号说明
主要技术参数(见表7.4.2)
忙标志(BF)
状态字说明(见表7.4.3)
注意:原 则上每次对控制器进行读/写操作之前,都必须进行读/写检测,确保STA7为0。实际上,由千单片机的操作速度低千液晶控制器的反应速度,因此可不必进行读/写检测,或只进行简短延时即可。
指令说明(见表7.4.4)
指令详解:
显示坐标关系
图形显示坐标
井行写操作时序(见图7.4.2)
串行读/写操作时序(见图7.4.3)
【例7.4.1】
用新建文件Sumjess2.5_5.c,程序代码如下:
#include <reg52.h>
//编译器自带的库用 < >
编译器包含C52的定义
#include <intrins.h> //编译器自带的库用 < >
循环移位函数等
#include <stdio.h>
//编译器自带的库用 < >
标准输入输出函数
#include <string.h>
//编译器自带的库用 < >
字符串处理函数
#include "delay_Sum.h"
//后加的库用 “ ”
延时函数、显示器延时函数
#include "74hc595_Sum.h" //后加的库用 “ ”
74hc595芯片操作
#include "boardinit_Sum.h" //后加的库用 “ ”
数码管硬件芯片定义
#include "12864_Sum.h"
//后加的库用 “ ”
12864函数
unsigned char code IC_DAT[]={
"----欢迎使用----"
"
QQ:1371129880 "
"
博客:Sumjess "
"
祝你学习愉快
"
};
unsigned char code IC_DAT2[]={
"我爱你时,
"
"我不爱你时,
"
"你是那么的闪耀
"
"你什么都不是。
"
};
void main()
{
boardinit();
//数码管硬件初始化
while(1)
{
initinal();//调用LCD字库初始化程序
delay(5);
lcd_mesg(IC_DAT);
delayms(300);
//延时程序必要的,长与短,自己调节
initinal();
delay(5);
lcd_mesg(IC_DAT2);
delayms(300);
}
}
库函数:
#include <reg52.h>
#include "12864_Sum.h"
#include "74hc595_Sum.h"
sbit RS
= P2^5;
//注意:一定要看12864液晶模块的资料,来确定怎样操作
sbit WRD = P2^6;
sbit E
= P2^4;
sbit PSE = P1^3;
sbit RES = P1^5;
void lcd_mesg(unsigned char code *addr1)
//显示汉字函数,8*4=32
{
unsigned char i;
TransferData(0x80,0);
delay(100);
for(i=0;i<32;i++)
{
TransferData(*addr1,1);
addr1++;
}
TransferData(0x90,0);
delay(100);
for(i=32;i<64;i++)
{
TransferData(*addr1,1);
addr1++;
}
}
void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据
{
WRD=0;
RS=DI;
P0=0XFF;
P0=data1;
E=1;// 置12684 使能端 E=1;
delay(1);
E=0;// 置12684 使能端 E=0;
}
void initinal(void)
//初始化,12864有要求的要写上
{
PSE=1;
//并口工作模式
RES=0; //复位
RES=1;
//复位置高
TransferData(0x30,0);
TransferData(0x30,0);
TransferData(0x08,0);
TransferData(0x10,0);
TransferData(0x0C,0);
TransferData(0x01,0);
TransferData(0x06,0);
}
分析如下: