lcd1602模块的基本组成_1602液晶显示模块P0口

lcd1602模块的基本组成_1602液晶显示模块P0口LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。下图即是该模块:(百度百科)一般来说,在嵌入式开发领域显示模块是非常重要的一部分,所以发展出了许多种应用在不同场合的集成显示模块。LCD1602由于出现较早,所以即便出现了应用更广泛的、…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

硬件模块

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。下图即是该模块:
经典的LCD1602A模块

点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成。显示屏上64×16个显示单元与显示RAM区的1024字节相对应,每一字节的内容与显示屏上相应位置的亮暗对应。例如显示屏第一行的亮暗由RAM区的000H~00FH的16字节的内容决定,当(000H)=FFH时,屏幕左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,屏幕右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H时,在屏幕的顶部显示一条由8条亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。

在这里插入图片描述
Lcd1602A有16个引脚,两组电源引脚(1,2;15,16号引脚),8跟数据线(D0~D7),3跟控制引脚(4,5,6号引脚),3号引脚VL是辅助显示用的,一般在PCB板上接电位器,通过该引脚调节背光亮度。从数据线就可以知道,该模块与单片机并行通信,同时还要额外占用3根控制线。Lcd1602的指令主要有以下几种:
在这里插入图片描述

驱动程序

实物模块驱动程序

根据这些指令,我们可以选择性地往LCD1602A的寄存器内写控制命令控制命令、读取状态或者显示内容,下面是基于51单片机的部分必要的C程序:

/*******************IO引脚定义*********************************************/
sbit LCD_RS=P1^0;//定义引脚
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
/********宏定义***********************************************************/
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识

上面代码是反映了单片机与LCD1602硬件连接的逻辑,最后一行应特别注意,最后一行定义了一个字节的数据,用于辅助判断LCD是否处于忙状态(检测这一状态十分重要,因为LCD处于忙的状态是无法再响应别的单片机的要求的,所以基本上上面指令表的每一个操作进行前都要先检测LCD是否处于空闲状态),其具体实现代码如下:

/***********写数据********************************************************/	
void WriteDataLCD(unsigned char WDLCD)
{ 
   
 	ReadStatusLCD(); //检测忙
 	LCD_Data = WDLCD;
 	LCD_RS = 1;
 	LCD_RW = 0;
 	LCD_E = 0; 		//若晶振速度太高可以在这后加小的延时
 	LCD_E = 0; 		//延时
 	LCD_E = 1;
}

/***********写指令********************************************************/	
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{ 
   
 	if (BuysC) ReadStatusLCD(); //根据需要检测忙
 	LCD_Data = WCLCD;
 	LCD_RS = 0;
 	LCD_RW = 0; 
 	LCD_E = 0;
 	LCD_E = 0;
	LCD_E = 1; 
}

/***********读数据********************************************************/	
unsigned char ReadDataLCD(void)
{ 
   
 	LCD_RS = 1; 
 	LCD_RW = 1;
 	LCD_E = 0;
 	LCD_E = 0;
 	LCD_E = 1;
 	return(LCD_Data);
}

/***********读状态*******************************************************/	
unsigned char ReadStatusLCD(void)
{ 
   
 	LCD_Data = 0xFF; 
 	LCD_RS = 0;
 	LCD_RW = 1;
 	LCD_E = 0;
 	LCD_E = 0;
 	LCD_E = 1;
 	while (LCD_Data & Busy); //检测忙信号
 	return(LCD_Data);
}

/***********初始化********************************************************/	
void LCDInit(void)
{ 
   
 	LCD_Data = 0;
 	WriteCommandLCD(0x38,0); 	//三次模式设置,不检测忙信号
    	Delay5Ms();
 	WriteCommandLCD(0x38,0);
    	Delay5Ms();
 	WriteCommandLCD(0x38,0); 
    	Delay5Ms();

 	WriteCommandLCD(0x38,1); 	//显示模式设置,开始要求每次检测忙信号
 	WriteCommandLCD(0x08,1); 	//关闭显示
 	WriteCommandLCD(0x01,1); 	//显示清屏
 	WriteCommandLCD(0x06,1); 	//显示光标移动设置
 	WriteCommandLCD(0x0C,1); 	//显示开及光标设置
}

/***********按指定位置显示一个字符*******************************************/	
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{ 
   
 	Y &= 0x1;
 	X &= 0xF; 				//限制X不能大于15,Y不能大于1
 	if (Y) X |= 0x40; 		//当要显示第二行时地址码+0x40;
 	X |= 0x80; 			//算出指令码
 	WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
 	WriteDataLCD(DData);
}

Proteus仿真驱动程序(LM016L)

#include "lcd.h"
#include <string.h>

void sleep(int i)
{ 
   
    int x;
    while(i--){ 
   
        for(x=0;x<123;x++);
    }
}

void LCD_Init(void)
{ 
   
    unsigned char x;
// char c[]={0x38,0x0c,0x06,0x01,0x80};
    char c[] = { 
   0x38,0x08,0x01,0x06,0x0c};

    for(x=0;x<5;x++)
    { 
   
        e = 0;
        rw = 0;
        rs = 0;
        LCD_DATA =c [x];
        e = 1;
        sleep(1);
        e = 0;
    }
}

void DisplayOneChar(unsigned char x,unsigned char y,char val)
{ 
   
    x &= 0xf;
    y &= 0x1;
    
    if(y) x |= 0x40;
    x |= 0x80;
   
    e = 0;
    rw = 0;
    rs = 0;           
    LCD_DATA = x;
    e=1;
    sleep(1);
    e=0;
    
    e = 0;
    rw = 0;
    rs = 1;           
    LCD_DATA = val;
    e=1;
    sleep(1);
    e=0;
}

void DisplayListChar(unsigned char x_s, unsigned char y_s, char xs[])
{ 
   
    unsigned char x,length;
    
    x_s &= 0xf;
    y_s &= 0x1;
    
    if(y_s) x_s |= 0x40;
    x_s |= 0x80;
   
    e = 0;
    rw = 0;
    rs = 0;           
    LCD_DATA = x_s;
    e=1;
    sleep(1);
    e=0;  
    
    length = strlen(xs);

    for(x = 0; x < length; x++){ 
   
        e = 0;
        rw = 0;
        rs = 1;           
        LCD_DATA = xs[x];
        e=1;
        sleep(1);
        e=0;
    }
}


总结

关注微信公众号“24K纯学渣”回复“lcd1602”获取程序文件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190477.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ESLint结合gulp使用

    ESLint结合gulp使用ESLint结合gulp使用一、安装二、使用步骤1.引入库2.读入数据总结一、安装示例:pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsimportwarningswarnings.filterwarnings(‘ignore’)im

    2022年6月18日
    23
  • 局域网vlan配置步骤_局域网vlan划分案例

    局域网vlan配置步骤_局域网vlan划分案例计算机网络技术的发展犹如戏剧舞台,你方唱罢我登台。从传统的以太网(10Mb/s)发展到快速以太网(100Mb/s)和千兆以太网(1000Mb/s)也不过几年的时间,其迅猛的势头实在令人吃惊。而现在中大型规模网络建设中,以千兆三层交换机为核心的所谓“千兆主干跑、百兆到桌面”的主流网络模型已不胜枚举。现在,网络业界对“三层交换”和VLAN这两词已经不感到陌生了。一、什么是三…

    2022年9月18日
    0
  • 集群机器搭建多节点MPI运行环境「建议收藏」

    集群机器搭建多节点MPI运行环境「建议收藏」1、各个节点安装MPI:https://blog.csdn.net/liu_feng_zi_/article/details/942864382、软硬件环境:1、节点:3个节点:node1,node2,node32、系统操作系统:Centos73、多节点配置1、host配置:通过下面命令打开host文件vim/etc/hosts在每个节点的host文件内添加ip地址和主机名,例如:10.10.1.12node110.10.1.56node210.

    2022年10月8日
    0
  • java clone()_java throwable

    java clone()_java throwable克隆是一种基本的编程模式。事实上,Java在很多方面可能实现得很差,但这丝毫没有减少克隆的必要性。而且,很容易实现克隆,无论你希望它如何工作,浅层的,深层的,混合的,无论什么。如果愿意的话,甚至可以为函数使用clone名称,而不实现Cloneable。假设我有类A、B和C,其中B和C是从A派生的。如果我有一个A类型的对象列表,如下所示:ArrayListlist1;ArrayListlist2…

    2022年10月10日
    0
  • minipcie转nvme,msata转ngff sata「建议收藏」

    minipcie转nvme,msata转ngff sata「建议收藏」现如今的电脑主板,m.2/ngff接口相当普遍。具有minipcie接口的主板大概只有工控主板和老款的主板的了。并不代表minipcie就会别淘汰了。对于消费用户,minipcie接口就是装个无线网卡。但在某些情况下,并不需要这无线网卡功能,这一接口就作他用了,比如扩展nvme固态盘或者傲腾呢?!nvme固态盘/傲腾是m.2/ngff接口的,接口不一样,不能直接安装。但是可以通过接口转接板将minipcie接口转换成m.2/ngff接口来安装nvme固态盘,NICE!常见的nvme固态盘尺寸

    2022年9月7日
    0
  • lm算法是什么算法_opencv图像处理算法

    lm算法是什么算法_opencv图像处理算法1.高斯牛顿法残差函数f(x)为非线性函数,对其一阶泰勒近似有:这里的J是残差函数f的雅可比矩阵,带入损失函数的:令其一阶导等于0,得:这就是论文里常看到的normalequation。2.LMLM是对高斯牛顿法进行了改进,在求解过程中引入了阻尼因子:2.1阻尼因子的作用:2.2阻尼因子的初始值选取:一个简单的策略就是:2.3阻尼因子的更新策略3.核心代码讲解3.1构建H矩阵void…

    2022年10月1日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号