【51单片机篇】LCD1602显示
·
一、初识LCD1602
1.LCD1602是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)。
2.引脚说明
二、显示逻辑
1.搞明白在哪里显示(地址)?显示什么(内容)?


三、时序分析
1.写操作时序
(1)RS=1:写内容;RS=0:写地址;
(2) RW = 0:写操作;
(3)E:从低电平上升到高电平(这个过程中延时25ns),然后高电平持续150ns,最后从高电平下降到低电平(这个过程中延时25ns),延时时间可以用_nop_()函数代替。
2.读操作时序
(1)RS:通过指令9可知,RS=0;
(2)RW=1:读操作;
(3)E:从低电平上升到高电平(这个过程中延时25ns),然后高电平持续150ns,最后从高电平下降到低电平(这个过程中延时25ns),延时时间可以用_nop_()函数代替。
四、代码示例
1.编程实现LCD1602显示字符'C'
#include "reg52.h"
#include <intrins.h>
#define databuffer P0//定义8位数据线,P0端口组
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;
void Check_Busy()
{
char tmp = 0x80;
databuffer = 0x80;
while(tmp & 0x80){//比较最高位
RS = 0;
RW = 1;
EN = 0;
_nop_();
EN = 1;
_nop_();
_nop_();
tmp = databuffer;
EN = 0;
_nop_();
}
}
void Write_Cmd_Func(char cmd)//写指令,RS低电平
{
Check_Busy();
RS = 0;
RW = 0;
EN = 0;
_nop_();//空函数,延时1us
databuffer = cmd;
_nop_();
EN = 1;
_nop_();
_nop_();
EN = 0;
_nop_();
}
void Write_Data_Func(char cmd)//写数据,RS高电平
{
Check_Busy();
RS = 1;
RW = 0;
EN = 0;
_nop_();//空函数,延时1us
databuffer = cmd;
_nop_();
EN = 1;
_nop_();
_nop_();
EN = 0;
_nop_();
}
void Delay15ms() //@11.0592MHz
{
unsigned char i, j;
i = 27;
j = 226;
do
{
while (--j);
} while (--i);
}
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 9;
j = 244;
do
{
while (--j);
} while (--i);
}
void LCD1602_Init()
{
//1.延时15ms
Delay15ms();
//2.写指令38H(不检测忙信号)
Write_Cmd_Func(0x38);
//3.延时5ms
Delay5ms();
//4.以后每次写指令,读/写数据操作均需要检测忙信号
//5.写指令38H:显示模式设置
Write_Cmd_Func(0x38);
//6.写指令08H:显示关闭
Write_Cmd_Func(0x08);
//7.写指令01H:显示清屏
Write_Cmd_Func(0x01);
//8.写指令06H:显示光标移动设置
Write_Cmd_Func(0x06);
//9.写指令0CH:显示开及光标设置
Write_Cmd_Func(0x0c);
}
void main()
{
char pposition = 0x80 + 0x05;
char dataShow = 'C';
LCD1602_Init();
Write_Cmd_Func(pposition);//要显示的地址
Write_Data_Func(dataShow);//要显示的内容
}
2.编程实现LCD1602显示一行
#include "reg52.h"
#include <intrins.h>
#define databuffer P0//定义8位数据线,P0端口组
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;
void Check_Busy()
{
char tmp = 0x80;
databuffer = 0x80;
while(tmp & 0x80){//比较最高位
RS = 0;
RW = 1;
EN = 0;
_nop_();
EN = 1;
_nop_();
_nop_();
tmp = databuffer;
EN = 0;
_nop_();
}
}
void Write_Cmd_Func(char cmd)//写指令,RS低电平
{
Check_Busy();
RS = 0;
RW = 0;
EN = 0;
_nop_();//空函数,延时1us
databuffer = cmd;
_nop_();
EN = 1;
_nop_();
_nop_();
EN = 0;
_nop_();
}
void Write_Data_Func(char cmd)//写数据,RS高电平
{
Check_Busy();
RS = 1;
RW = 0;
EN = 0;
_nop_();//空函数,延时1us
databuffer = cmd;
_nop_();
EN = 1;
_nop_();
_nop_();
EN = 0;
_nop_();
}
void Delay15ms() //@11.0592MHz
{
unsigned char i, j;
i = 27;
j = 226;
do
{
while (--j);
} while (--i);
}
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 9;
j = 244;
do
{
while (--j);
} while (--i);
}
void LCD1602_Init()
{
//1.延时15ms
Delay15ms();
//2.写指令38H(不检测忙信号)
Write_Cmd_Func(0x38);
//3.延时5ms
Delay5ms();
//4.以后每次写指令,读/写数据操作均需要检测忙信号
//5.写指令38H:显示模式设置
Write_Cmd_Func(0x38);
//6.写指令08H:显示关闭
Write_Cmd_Func(0x08);
//7.写指令01H:显示清屏
Write_Cmd_Func(0x01);
//8.写指令06H:显示光标移动设置
Write_Cmd_Func(0x06);
//9.写指令0CH:显示开及光标设置
Write_Cmd_Func(0x0c);
}
void LCD1602_showLine(char row,char col,char *string)
{
switch(row){
case 1:
Write_Cmd_Func(0x80+col);
while(*string){
Write_Data_Func(*string);
string++;
}
break;
case 2:
Write_Cmd_Func(0x80+0x40+col);
while(*string){
Write_Data_Func(*string);
string++;
}
break;
}
}
void main()
{
char pposition = 0x80 + 0x05;
LCD1602_Init();
LCD1602_showLine(1,5,"NO.1");
LCD1602_showLine(2,2,"Hello China");
}
更多推荐
所有评论(0)