当前位置:网站首页>Lcd1602——斌哥51
Lcd1602——斌哥51
2022-07-24 02:46:00 【Fecter11】
最新修改时间2022/7/22
LCD1602
16代表显示16个字符,2代表总共显示两行
芯片的工作电压是4.5-5.5v
工作电流2.0ma(5V)
模块最佳工作电压5.0v
字符尺寸:2.95X4.25(wxh)mm
管脚说明:
VSS:电源地
VDD:接5v电源
VL:液晶显示器对比度调整端,接正电源的时候对比度弱,接地的时候对比度高。对比度过高会产生鬼影,所以在使用的时候,串接一个10k的电位器调整对比度。(对比度调节可以理解为)
补充:
对比度是指投影图像最亮和最暗区域之间的比率,比值越大,从黑到白的渐变层次就越多,从而色彩表现越丰富。对比度对视觉效果的影响非常关键,一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度小,则会让整个画面都灰蒙蒙的。高对比度对于图像的清晰度、细节表现、灰度层次表现都有很大帮助。对比度越高图像效果越好,色彩会更饱和,反之对比度低则画面会显得模糊,色彩也不鲜明。
RS:Register selection寄存器选择位。高电平选择数据寄存器,低电平选择指令寄存器。(高数据,低命令)
R/W:为读写信号线,高电平进行读操作,低电平进行写操作。
当RS和R/W同时为低电平的时候,可以写入指令或者写入显示地址。(高读,低写)
当RS为低,R/W为高的时候,可以用于读忙操作。
当RS为高,R/W为低的时候,可以用于写数据。
E:为使能端,当E从高电平降为低电平的时候,液晶模块开始执行命令。
D0-D7:8位数据线。
BLA:背光源正极(调节亮度)
BLK:背光源负极(调节亮度)
显示地址:

重点:
我们直接看的话,第二行第一个地址是0x40,那是不是我们可以直接操作0x40这个地址,使得光标定位在这个位置呢?
答案是不可以!!!!!
因为写入显示地址的时候,要求D7为1,所以实际写入的地址信息是40h(01000000)+80h(10000000)=c0h(11000000)
也就是说我们在操作显示地址的时候要记得加上80h
注意看第一行的起始地址是0x00末尾的地址是0x27
那么第一行总共有40个可供操作的地址,那么两行就是80个可供操作的地址。
也就是说每个字符占8位,总共80个字符,就是80*8=640位,也就是64字节的RAM缓冲区。
而实际我们使用的时候值显示每行前16个字符。
而LCD1602只能显示ASCII表中的打印字符(注意ASCII有两种字符,一种是控制字符,一种是打印字符)

这里说明一下,我们在打印相应的字符时可以通过加上’0’(字符0)的方式对应打印输出目标。也可以直接加上十进制的数字48
指令集:(我们控制模块的命令)











DDRAM : 显示用ram,直接和屏幕上的点相对应。屏幕上的一个点和ddram中的一个位对应,字符屏的ddram和图形屏的ddram有一点点区别。
CGROM : 字模存储用空间。你要显示某个ascii字符时,要显示字符的字模就存在这里。

读时序:
注意时间间隔
比如:我们读取有效数据要求间隔100ns
我们的51单片是11.0592mhz
我们的机器周期就有(1/11.0592mhz)*12 约等于1.085us,所以我们的指令周期是显然是足够的
写操作时序:
源文件如下:
main.c
# include "lcd1602.h"
# include "display.h"
uchar num = 0; //0-255
uint i = 0;
//下面的主函数是显示单个字符的方式
/************************ * 主函数 *************************/
//void main (void)
//{
// Lcd1602_busycheck();
// Lcd1602_Write_CMD(0x01); //清屏
// Lcd1602_Write_CMD(0x06); //每次写入新数据,光标右移,屏幕不移动
// Lcd1602_Write_CMD(0x0C); //打开屏幕,光标不显示
// Lcd1602_Write_CMD(0x38); //选择8位的数据位,并且允许两行都可以用来显示
//
// Lcd1602_Write_CMD(0x80); //写地址,从第一行的第一位开始写。0x00 + 0x80
//
//
// Lcd1602_Write_DAT('O') ; //写显示数据
// Lcd1602_Write_DAT('K') ; //写显示数据
//}
//主函数,显示字符串,并可以指定位置
//void main (void)
//{
// Lcd1602_busycheck();
// Lcd1602_Write_CMD(0x01); //清屏
// Lcd1602_Write_CMD(0x06); //每次写入新数据,光标右移,屏幕不移动
// Lcd1602_Write_CMD(0x0C); //打开屏幕,光标不显示
// Lcd1602_Write_CMD(0x38); //选择8位的数据位,并且允许两行都可以用来显示
//
// LCD_Position(0,7); //从第零行的第七个开始显示
//
// LCD_dispaly("good");
//
//}
//动态显示
void main (void)
{
Lcd1602_busycheck();
Lcd1602_Write_CMD(0x01); //清屏
Lcd1602_Write_CMD(0x06); //每次写入新数据,光标右移,屏幕不移动
Lcd1602_Write_CMD(0x0C); //打开屏幕,光标不显示
Lcd1602_Write_CMD(0x38); //选择8位的数据位,并且允许两行都可以用来显示
LCD_Position(0,7); //从第零行的第七个开始显示
LCD_dispaly("good");
while(1)
{
num++; //num是uchar型,最大255
LCD_Position(1,0);
Lcd1602_Write_DAT(num/100 + '0');
Lcd1602_Write_DAT(num%100/10 + '0');
Lcd1602_Write_DAT(num%100%10 + '0');
i =5000;
while(i--);
}
}
lcd1602.c
# include "lcd1602.h"
# define uchar unsigned char
# define uint unsigned int
/********************************** * 忙检检测函数 * * 判断LCD1602当前是否在忙 * ***********************************/
void Lcd1602_busycheck()
{
uint sta = 0; //定义一个变量用来存储Dataport读到的数据
Dataport = 0xff; //人为释放Dataport数据线
RS = 0; //命令
RW = 1; //读
//忙则循环判断,不忙则结束循环
do
{
E = 1; //使能
sta = Dataport; //读取数据端口的值,如果显示屏不忙那就是0xFF,如果忙就不是0xFF
E = 0;
}while((sta & 0x80) == 0x80); //0x80 就是1000 0000 我们用来判断端口的最高位是不是1,如果是1则代表忙,不是1则不忙
}
/********************************** * 写数据函数 * * 判断LCD1602当前是否在忙 * ***********************************/
void Lcd1602_Write_DAT(uchar Dat) //一次写8Bit
{
Lcd1602_busycheck(); //检测忙不忙
RS = 1; //数据
RW = 0; //写操作
Dataport = Dat;
E = 1; //当E由高电平变为低电平的时候,液晶开始执行命令
_nop_();
E = 0;
}
/********************************** * 写命令函数 * * 判断LCD1602当前是否在忙 * ***********************************/
void Lcd1602_Write_CMD(uchar Comd) //一次写8Bit
{
Lcd1602_busycheck(); //检测忙不忙
RS = 0; //命令
RW = 0; //写操作
Dataport = Comd;
E = 1; //当E由高电平变为低电平的时候,液晶开始执行命令
_nop_();
E = 0;
}
lcd1602.h
# ifndef __lcd1602_H__
# define __lcd1602_H__
# include <reg51.h>
# include <intrins.h>
# define uchar unsigned char
# define uint unsigned int
# define Dataport P0 //以P0作为数据口
sbit RS = P3^5; //命令或数据,高数据,低命令
sbit RW = P3^6; //写或读,高读低写
sbit E = P3^4; //使能
void Lcd1602_busycheck(); //忙检测
void Lcd1602_Write_DAT(uchar Dat); //写数据
void Lcd1602_Write_CMD(uchar Comd); //写命令
# endif
display.c
# include "display.h"
//LCD显示字符串函数
void LCD_dispaly(uchar* str)
{
//"\0"在c语言中代表“字符串结束符”。“\0”的ASCII码为“0”,
//也就是空字符;字符串总是以“\0”作为串的结束符;因此当把一个字符
//串存入一个数组时,也把结束符“\0”存入数组,并以此作为该字符串是
//否结束的标志。”
while(*str) //比如输入good 总共有g o o d \0 5个元素
{
Lcd1602_Write_DAT(*str++) ;
}
}
//指定写入数据的位置
void LCD_Position(bit x,uchar y) //定义行x,定义列y
{
uchar position;
if(x == 0)
position = 0x80 + y;
else
position = 0xC0 + y;
Lcd1602_Write_CMD(position);
}
display.h
# ifndef __display_H__
# define __display_H__
# include "lcd1602.h"
# define uchar unsigned char
# define uint unsigned int
void LCD_dispaly(uchar* str);
void LCD_Position(bit x,uchar y) ;
#endif
边栏推荐
- c语言小练习
- Mysql database, grouping function
- TCP data transmission and performance
- 【补题日记】[2022牛客暑期多校1]D-Mocha and Railgun
- Mysql database, query
- Attack and defense world web practice area (backup, cookie, disabled_button)
- 开源量子开发框架 Cirq
- [diary of supplementary questions] [2022 Hangdian summer school 1] b-dragon Slayer
- [diary of supplementary questions] [2022 Niuke summer school 1] i-chiitoitsu
- 中城院真的在帮助供应商解决问题吗?
猜你喜欢
![js传参时传入 string有数据;传入 number时没有数据;2[0]是对的!number类型数据可以取下标](/img/4e/3d0c25d9579b6d5c00473048dbbd83.png)
js传参时传入 string有数据;传入 number时没有数据;2[0]是对的!number类型数据可以取下标

Wechat applet setting background image does not display problem solution
![[leetcode] sword finger offer 61. shunzi in playing cards](/img/ca/1756f1c33cf9b18d0c88d46bac636e.png)
[leetcode] sword finger offer 61. shunzi in playing cards

Nodejs builds cloud native microservice applications based on dapr, a quick start guide from 0 to 1

7 issues to consider before website construction

22 -- range and of binary search tree

TP5 framework link promotion project

TCP data transmission and performance
![La chaîne entrante a des données lors de la transmission des paramètres JS; Aucune donnée n'a été transmise au numéro; 2 [0] Oui! Les données de type numéro peuvent être indexées](/img/4e/3d0c25d9579b6d5c00473048dbbd83.png)
La chaîne entrante a des données lors de la transmission des paramètres JS; Aucune donnée n'a été transmise au numéro; 2 [0] Oui! Les données de type numéro peuvent être indexées

攻防世界WEB练习区(weak_auth、simple_php、xff_referer)
随机推荐
中城院真的在帮助供应商解决问题吗?
Mysql数据库,查询篇
JpaRepository扩展接口
Wechat applet setting background image does not display problem solution
Force open web page
Soft test --- fundamentals of programming language (Part 1)
【英雄哥七月集训】第 23天: 字典树
攻防世界WEB练习区(view_source、get_post、robots)
summernote富文本编辑器
Wechat applet realizes broken line area chart rose chart three-dimensional histogram
【补题日记】[2022牛客暑期多校1]J-Serval and Essay
PMP preparation experience | good habits, good process, good results
[brother hero July training] day 23: dictionary tree
Causal learning open source project: from prediction to decision!
O3DE 的Lumberyard 游戏引擎
Doodle Icons - 一组免费商用的涂鸦风格图标库,可爱轻快又独特
Super complete PMP reference document summary
C language actual combat guessing game
SSM家庭理财个人理财管理系统记账系统
Chinese scientists have made new progress in high security quantum key distribution networks