基础知识准备
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 P0void 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++);}
}
运行结果
工程文件下载地址
GitHub下载链接