前言
本篇文章将为大家讲解LCD1602的使用方法。
一、LCD1602简单介绍
LCD1602是一种常用的液晶显示器,它的原理是通过液晶分子的振荡来控制显示内容的。液晶分子在电场的作用下,会发生振荡,从而改变液晶分子的极性,从而控制显示内容。液晶显示器的控制电路会根据输入的信号,控制电场的强度,从而控制液晶分子的振荡,从而控制显示内容。
二、LCD1602中各个引脚的作用
LCD1602的引脚有VSS、VDD、VO、RS、RW、E、D0-D7等。VSS和VDD分别为电源正负极;VO为显示屏的背光控制引脚;RS、RW、E分别为控制字符显示和数据读写的控制引脚;D0-D7为数据传输的引脚。
四、LCD1602命令解析
对于如何写命令我们直接看到数据手册就可以了。无论是写命令还是写数据我们只需要关注RS,R/W,E这几个引脚的电平即可。
1.写命令
当RS=0时代表输入指令。
R/W=0时代表向LCD写入指令或数据。
E是使能信号当E从1变为0时也就是下降沿会执行指令。
这里直接将要执行的命令写入LCD1602对应的数据端口即可。
写入后让E发生一个下降沿执行写入的指令。
void lcd1602_write_cmd(u8 cmd) { LCD1602_RS=0;//选择命令 LCD1602_RW=0;//选择写 LCD1602_E=0; LCD1602_DATAPORT=cmd;//准备命令 delay_ms(1); LCD1602_E=1;//使能脚E先上升沿写入 delay_ms(1); LCD1602_E=0;//使能脚E后负跳变完成写入 }
2.写数据
当RS=1时代表输入指令。
R/W=0时代表向LCD写入指令或数据。
E是使能信号当E从1变为0时也就是下降沿会执行指令。
其实写数据和写命令的函数只是需要注意RS的电平即可,其他代码原理都是一样的。
void lcd1602_write_data(u8 dat) { LCD1602_RS=1;//选择数据 LCD1602_RW=0;//选择写 LCD1602_E=0; LCD1602_DATAPORT=dat;//准备数据 delay_ms(1); LCD1602_E=1;//使能脚E先上升沿写入 delay_ms(1); LCD1602_E=0;//使能脚E后负跳变完成写入 }
3.清屏指令
根据手册可以知道只需要往数据端口写入0x01即可达到清屏效果。
void lcd1602_clear(void) { lcd1602_write_cmd(0x01); }
4.光标归位指令
光标归位指令写入0x02即可。
void lcd1602_CursorReset(void) { lcd1602_write_cmd(0x02); }
5.进入模式设置指令
将DB1设置为1每次写入一个字符后光标右移。
S=0写入数据后显示屏不移动。
void lcd1602_CursorReset(void) { lcd1602_write_cmd(0x06); //写入新数据后光标右移,显示屏不移动 }
6.显示开关控制指令
这里看自己的需求设置对应的指令。
7.设定显示屏或光标移动方向指令
字体左移
void lcd1602_LeftMove(void) { lcd1602_write_cmd(0x18); }
字体右移
void lcd1602_RightMove(void) { lcd1602_write_cmd(0x1c); }
三、LCD1602代码编写
lcd1602.c
这里使用普中的代码进行讲解。
这里使用的lcd1602是8位的,在lcd1602.h定义了一个宏来决定。
#include "lcd1602.h" /******************************************************************************* * 函 数 名 : lcd1602_write_cmd * 函数功能 : LCD1602写命令 * 输 入 : cmd:指令 * 输 出 : 无 *******************************************************************************/ #if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD void lcd1602_write_cmd(u8 cmd) { LCD1602_RS=0;//选择命令 LCD1602_RW=0;//选择写 LCD1602_E=0; LCD1602_DATAPORT=cmd;//准备命令 delay_ms(1); LCD1602_E=1;//使能脚E先上升沿写入 delay_ms(1); LCD1602_E=0;//使能脚E后负跳变完成写入 } #else //4位LCD void lcd1602_write_cmd(u8 cmd) { LCD1602_RS=0;//选择命令 LCD1602_RW=0;//选择写 LCD1602_E=0; LCD1602_DATAPORT=cmd;//准备命令 delay_ms(1); LCD1602_E=1;//使能脚E先上升沿写入 delay_ms(1); LCD1602_E=0;//使能脚E后负跳变完成写入 LCD1602_DATAPORT=cmd<<4;//准备命令 delay_ms(1); LCD1602_E=1;//使能脚E先上升沿写入 delay_ms(1); LCD1602_E=0;//使能脚E后负跳变完成写入 } #endif /******************************************************************************* * 函 数 名 : lcd1602_write_data * 函数功能 : LCD1602写数据 * 输 入 : dat:数据 * 输 出 : 无 *******************************************************************************/ #if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD void lcd1602_write_data(u8 dat) { LCD1602_RS=1;//选择数据 LCD1602_RW=0;//选择写 LCD1602_E=0; LCD1602_DATAPORT=dat;//准备数据 delay_ms(1); LCD1602_E=1;//使能脚E先上升沿写入 delay_ms(1); LCD1602_E=0;//使能脚E后负跳变完成写入 } #else void lcd1602_write_data(u8 dat) { LCD1602_RS=1;//选择数据 LCD1602_RW=0;//选择写 LCD1602_E=0; LCD1602_DATAPORT=dat;//准备数据 delay_ms(1); LCD1602_E=1;//使能脚E先上升沿写入 delay_ms(1); LCD1602_E=0;//使能脚E后负跳变完成写入 LCD1602_DATAPORT=dat<<4;//准备数据 delay_ms(1); LCD1602_E=1;//使能脚E先上升沿写入 delay_ms(1); LCD1602_E=0;//使能脚E后负跳变完成写入 } #endif /******************************************************************************* * 函 数 名 : lcd1602_init * 函数功能 : LCD1602初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ #if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD void lcd1602_init(void) { lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符 lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁 lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动 lcd1602_write_cmd(0x01);//清屏 } #else void lcd1602_init(void) { lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符 lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁 lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动 lcd1602_write_cmd(0x01);//清屏 } #endif /******************************************************************************* * 函 数 名 : lcd1602_clear * 函数功能 : LCD1602清屏 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void lcd1602_clear(void) { lcd1602_write_cmd(0x01); } /******************************************************************************* * 函 数 名 : lcd1602_show_string * 函数功能 : LCD1602显示字符 * 输 入 : x,y:显示坐标,x=0~15,y=0~1; str:显示字符串 * 输 出 : 无 *******************************************************************************/ void lcd1602_show_string(u8 x,u8 y,u8 *str) { u8 i=0; if(y>1||x>15)return;//行列参数不对则强制退出 if(y<1) //第1行显示 { while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示 { if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示 { lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置 } else { lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置 } lcd1602_write_data(*str);//显示内容 str++;//指针递增 i++; } } else //第2行显示 { while(*str!='\0') { if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示 { lcd1602_write_cmd(0x80+0x40+i+x); } else { lcd1602_write_cmd(0x80+i+x-16); } lcd1602_write_data(*str); str++; i++; } } }
lcd1602.h
#ifndef _lcd1602_H #define _lcd1602_H #include "public.h" //LCD1602数据口4位和8位定义,若为1,则为LCD1602四位数据口驱动,反之为8位 #define LCD1602_4OR8_DATA_INTERFACE 0 //默认使用8位数据口LCD1602 //管脚定义 sbit LCD1602_RS=P2^6;//数据命令选择 sbit LCD1602_RW=P2^5;//读写选择 sbit LCD1602_E=P2^7; //使能信号 #define LCD1602_DATAPORT P0 //宏定义LCD1602数据端口 //函数声明 void lcd1602_init(void); void lcd1602_clear(void); void lcd1602_show_string(u8 x,u8 y,u8 *str); #endif
四、代码测试
这里我们实现了LCD1602左移显示。
void main() { lcd1602_init();//LCD1602初始化 while(1) { lcd1602_show_string(0,0,"Hello World!");//第一行显示 lcd1602_show_string(0,1,"0123456789");//第二行显示 lcd1602_write_cmd(0x18); delay_ms(1000); } }
总结
LCD1602是一种液晶显示器,可以用于显示文本和图形信息。它具有低功耗,高分辨率和易于使用的特点,可以用于多种应用,如计算机控制、液晶显示器、汽车仪表板等。它可以用于显示汉字、英文字符、图形和数字,可以实现更高的效率和速度。
使用LCD1602可以帮助我们实现非常多的功能,使用他我们可以制作电子时钟,密码锁等小项目,希望大家好好理解这个模块。