基础知识准备
lcd1602简介
图片来自b站斌哥单片机
需要关注的有以下几点:
- RS : 高数据低命令;RS= 1时,lcd1602读写数据,RS=0时,lcd1602读写命令
- R/W:高读低写;RW=1时,单片机读取lcd1602数据,RW = 0时,单片机向lcd1602写数据
- E:使能的,当且仅当E=1时读写数据与命令,读写完毕,记得将E置为0
- D0-D7:为8个I/O口,读写数据与命令使用
显示及地址
图片来自b站斌哥单片机
需要关注的有以下几点:
- lcd1602共计有两行,每行40个字节
- 第一行首地址0x80
- 第二行首地址为0xc0
- lcd1602只显示每行前16个字节,其余字节要想显示需要向前移动
lcd1602可显示的字符
图片来自b站斌哥单片机
需要关注的有以下几点:
- lcd1602只显示右边的打印字符
- lcd1602不显示左边的控制字符
lcd1602指令集
这个很重要,需要掌握
lcd1602时序图
这个了解即可,需要知道:
-
lcd1602读数据时,先准备好E,再读数据
-
lcd1602写数据时,先准备好数据,再将E置为高电平
-
读时序
- 写时序
举例
在lcd1602上打印“hello world"
代码
#include<reg52.h>
//初始化管脚配置
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
#define DataPort P0
void LCD1602_BYCHECK();
void LCD1602_WRITE_CMD(unsigned char mycmd);
void LCD1602_WRITE_DATA(unsigned char myData);
void LCD1602_init();
void LCD1602_addr(unsigned char row,unsigned char col);
void display_string(char *);
void main()
{
char *p ="hello world" ;
LCD1602_init();
//设置数据显示地址,输入行号与列号
LCD1602_addr(1,0);
display_string(p);
while(1)
{
}
}
//设置数据显示地址,输入行号与列号
void LCD1602_addr(unsigned char row,unsigned char col)
{
unsigned char position = 0;
if(row == 1)
{
position = 0x80 + col;
}
else if(row == 2)
{
position = 0xc0 + col;
}
LCD1602_WRITE_CMD(position);//设置数据显示地址
}
//lcd1602初始化
void LCD1602_init()
{
LCD1602_WRITE_CMD(0x01);//清屏
LCD1602_WRITE_CMD(0x06);//指针自增
LCD1602_WRITE_CMD(0x0c);//显示开,光标关
LCD1602_WRITE_CMD(0x38);//8位接口,两行显示
}
//lcd1602忙检测,若芯片忙,则等着
void LCD1602_BYCHECK()
{
unsigned char state = 0;
DataPort = 0xff; //释放管理权
RS = 0;
RW = 1;
do
{
E = 1; //先准备好E,在读数据
state = DataPort;
E = 0;
}while((state&0x80) == 0x80);//lcd1602忙,等着
}
//写数据
void LCD1602_WRITE_DATA(unsigned char myData)
{
LCD1602_BYCHECK();
RS = 1;
RW = 0;
E = 0;
DataPort = myData;//先准备好数据,再将E置位高电平
E = 1;
E = 0;
}
//写命令
void LCD1602_WRITE_CMD(unsigned char mycmd)
{
LCD1602_BYCHECK();
RS = 0;
RW = 0;
E = 0;
DataPort = mycmd;
E = 1;
E = 0;
}
//显示字符串
void display_string(char *p)
{
while(*p)
{
LCD1602_WRITE_DATA(*p++);
}
}