开发板电源按钮上面的滑动变阻器(1602标号的是控制1602液晶的,12864标号的是控制12864液晶的)是控制液晶的颜色,可以把矩阵检测的程序写入单片机,然后然液晶显示,同时顺时针调节滑动变阻器,让液晶颜色变亮
这里用的1602(16对应一行显示十六个字符,02对应一共两行)液晶阵脚是十六针的,一行显示十六个字符,一共两行;12864(横的128个点,竖的 64点)图像液晶,
见1602液晶说明的P1,RS是数据命令选择端,高电平表示数据选择端,低电平表示命令选择端,程序中写命令,RS状态是H,程序中写数据,4号口接到单片机的P3.5上
RL高电平是读选择端状态,低电平是写选择端
在使用一个芯片的之前要将这个芯片的资料搞明白,搞明白之后再操作该芯片
见1602液晶说明的P2的基本操作时序,高脉冲指的是一个凸型脉冲,低脉冲指的是一个凹型脉冲,这里只看写指令和写数据;见P5写操作时序中,RS先给低电平写指令再给高电平写数据,RW给低电平开始写指令或数据,tsp2为有效数据准备时间,当E高电平时,开始将有效数据送出,在tpw时间内DB0到DB7的数据必须有效才能写进去,这里我们给RW始终低电平让液晶始终在写;见P2的显示模式设置,5*7点阵就是横行5个点、竖行7个点显示一个字符,指令码对应0x38;见P3的设置指针设置,80H+0对应RAM地址(见P2)上面的00,80H+1对应RAM(数据存储区)地址的01,从00到27,然后断开,再从40到67;P2的RAM地址映射图是液晶数据存储区的地址映射
开发板上液晶在蜂鸣器的下面,HEADER16,1管脚是地,2管脚是VCC,15和16管脚是背光的作用,15管脚接电阻用来限流并且不让光太亮,D0到D7是数据口接单片机的P0口,6管脚是使能,对应TX-1C型单片机实验板原理图上的LCDEN接单片机的P3.4口,管脚5是读写选择端R/W,这里只写不读,给5管脚低电平,数据命令选择端RS接单片机的P3.5口,3管脚是偏压信号,液晶显示需要一个负电压,上面有个滑动变阻器,调节滑动变阻器内部显示的对比度就发生变化;程序中控制LCDEN接单片机的P3.4口和数据命令选择端RS接单片机的P3.5口即可
液晶使用时先把光标弄出来,可以写两个函数,一个用来写指令一个用来写程序
买完液晶就看资料,看完资料就按资料连接控制就行了
寄存器等一些知识不用记的,我们是应用,应用时可以查书
使用时要关掉数码管,防止和液晶一起使用时功率过大,所以用锁存器关掉数码管
液晶显示不用大循环,显示后不给命令改变就不会变
先让液晶有显示:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;//使用时要关掉数码管,防止和液晶一起使用时功率过大,所以用锁存器关掉//数码管
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;//数据口送上数据,有效数据准备好后让使能端lcden置高
delay(5);//见1602液晶说明P2的写程序时序图
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//液晶写指数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);//见1602液晶说明P2,初始化设置中第一步显示模式设置
write_com(0x0e);//显示开关及光标设置
write_com(0x06);//地址指针加1 ,整屏不移动
}
void main()
{
init();
while(1);
}
写数字1:见字符手册的PDF的P16的表,当送去‘1’(‘1’实际上是ASCII码,对应一个十六进制数)时,实际上送去的是31(3为横坐标,1为纵坐标),程序中可以送0x31
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//uchar code table[]="I LIKE MCU!";//写单字符用单引号引,多字符用双引号引
//uchar code table1[]="WWW.TXMCU.COM";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;//使用时要关掉数码管,防止和液晶一起使用时功率过大,所以用锁存器关掉//数码管
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;//数据口送上数据
delay(5);//见见1602液晶说明P2的写程序时序图
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//液晶写指数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);//见1602液晶说明P2,初始化设置中第一步显示模式设置
write_com(0x0e);//显示开关及光标设置
write_com(0x06);//地址指针加1 ,整屏不移动,当write_com(0x07)时,在初始化//write_com(0x80)地址没有变化时,所有字符移动到液晶左侧的外面,
write_com(0x01);//01为清屏指令
write_com(0x80);//数据指针初始化,设置数据的初始位置
}
void main()
{
init();
write_data('1');//注意要有单引号,如果没有单引号write_data(1),就会显示乱码
while(1);//保持住
}
主程序中写入AB:
void main()
{
init();
write_data(0x41);
delay(10);
write_data('B');
while(1);
}
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LIKE MCU!";//写单字符用单引号引,多字符用双引号引
uchar code table1[]="WWW.TXMCU.COM";//注意数组是从序号0开始的
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;//使用时要关掉数码管,防止和液晶一起使用时功率过大,所以用锁存器关掉//数码管
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//液晶写指令,见1602液晶说明P2的写指令
{
lcdrs=0;//RS给低电平写指令,这里就不用把RS置为高电平
P0=com;//数据口送上数据
delay(5);//见见1602液晶说明P2的写程序时序图
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//液晶写指数据
{
lcdrs=1; //RS给高电平读指令,这里就不用把RS置为低电平
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;//关掉数码管
wela=0;
lcden=0;
write_com(0x38);//见1602液晶说明P2,初始化设置中第一步显示模式设置
write_com(0x0e);//显示开关及光标设置
write_com(0x06);//地址指针加1 ,整屏不移动
write_com(0x01);//01为清屏指令
write_com(0x80+0x10);//数据指针初始化
}
void main()
{
init();
for(num=0;num<11;num++)
{
write_data(table[num]);
delay(20);//延长的时间长可以看出动态效果,如delay(300)
}//在该句下面添加清屏write_com(0x01),table[]的字符显示完就清屏,继续显示下面的
write_com(0x80+0x40);//放到第二行可以write_com(0x80+0x40),见1602液晶说明
//想空几位,可以write_com(0x80+0x40+0x03),右移三位,也可以write_com(0x80+0x40+3),//这里十进制和十六进制可以通用
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(20);
}
while(1);
}
字符串先显示出来,再全部左移:
编译后错误提示:UNCALLED SEGMENT表示一个函数没有调用
显示从右到左滚动:将数据指针指到10那,写完再用整屏移动,见EN_TC1602的PDF的P12的Cursor or Display Shift命令,S/C和R/L为10时表示显示左移,光标跟随显示移动,code为0x18左移一下:
void main()
{
init();
for(num=0;num<11;num++)// 这里写的数据是在液晶外面写的,初始化程序的0x10是液晶外面
{
write_data(table[num]);
delay(200);//延长的时间长可以看出动态效果,如delay(300)
}
write_com(0x80+0x53);
for(num=0;num<13;num++)// 这里写的数据是在液晶外面写的,0x53是液晶外面
{
write_data(table1[num]);
delay(20);
}
for(num=0;num<16;num++)
{
write_com(0x18);//写完数据就移动,整屏左移
delay(200);
}
while(1);
}