基于Proteus无实物零基础STM32入门自学教程(十)--LCD1602液晶显示

编程知识 行业动态 更新时间:2024-06-13 00:22:42

本节课我们继续来点亮高端一点的显示器件--lcd1602液晶。作为工控领域最普遍的显示器件,也是显示内容更多价格最便宜的显示器件。至今仍然称为工控产品的主流显示器件之一,只有极个别产品对成本要求高时会使用7段数码管作为显示器件。但是数码管显示的字符毕竟有限,且极不形象。故LCD1602为代表的液晶,因其能显示众多字符逐渐称为主流,个别液晶集成了汉字字库更使其称为工程师的首选。

一、Protues仿真图

上图为本次仿真的硬件连接和仿真效果图。全部使用PB端口连接整个液晶,包括数据DB0-DB7、EN、RS、RW这些数据和控制端口。具体连接如上,VDD和VEE之间需要串联一个可变电阻,用于调节液晶的字符显示亮度。这个并不影响软件的仿真,但是设计思路与实物一致,大家可以直接照搬到自己的硬件设计上。

在基本有了一个概念后,我们来看看LCD1602的液晶的工作原理。先来看看1602的实物样子。

大家可以数一下现在图片里显示的字符的数量。A-T一共是16个,a-t也是16个。所以LCD1602的意思是16个字符,能显示2行。所以名叫LCD1602液晶。记住字符是针对英文字符,不是中文。

液晶引脚的定义如上图,15和16可选,带背光的液晶会在液晶下方加入一个LED的光源,它的电源由15和16提供。如果不带背光的液晶15和16引脚接了也没有用。看了以上引脚定义再结合我的硬件图应该有一个基本的概念了。那么接下来说一下液晶的工作原理。

DB0-DB7是数据端口,同时该端口承担接收命令和接收数据的功能,那么液晶不是人怎么能区分你单片机发过来的是数据还是命令呢?那么RS,RW和EN这三端起着重要的作用,单片机通过控制这三端的高低电平的组合让液晶知道现在给你发送的是命令还是数据。这种组合关系需要通过LCD的时序图自己结合程序一点点观察。网络截一张比较易懂的图给大家看看。

1602液晶的读操作一般比较少就不单独给大家列出来了。知道了怎么让液晶识别命令还是数据之后,还需要知道液晶字符显示的位置,得让字符按照我们的心意,让它们在哪显示就在哪出现。因此需要指导如下图的RAM地址。

从上图可知道,16x2一共32个字符分别对应的地址为00--0F和40--4F。剩下的10-27和50-67可以作为滚动显示的隐藏字幕工大家使用。而实际使用中由于硬件控制器的原因,我们实际的显示地址都需要加上0x80这个基地址,即从上看第一行第一列的地址是0x00,直接送的显示地址应该为0x80+0x00。第二行的也是一样应该是0x80+0x40,其他显示位置以此类推。

最后根据液晶数据手册的说明书,我们可以开始玩了,让液晶使用什么功能就按照液晶给出的寄存器代码直接写命令给液晶就可以了。

二、MDK代码

LCD1602的核心代码如下

#include lcd1602.h


/****  1602液晶初始化函数,包括stm32的GPIO底层配置函数  ****/
void LCD1602_Init(void)
{
	   LCD1602_GPIO_Config();   //开启GPIO口
       LCD1602_WriteCmd(0X38);  //16*2显示,5*7点阵,8位数据接口
       LCD1602_WriteCmd(0x0C);  //显示器开,光标关闭
       LCD1602_WriteCmd(0x06);  //文字不动,地址自动+1
       LCD1602_WriteCmd(0x01);  //清屏
}


/****  1602液晶检测忙命令函数,经仿真测试可不用此函数  ****/
void LCD1602_WaitReady(void) //检测忙状态
{
		uint8_t sta;

		GPIOB->ODR =0x00FF;
		LCD_RS_Clr();
		LCD_RW_Set();
		LCD_EN_Set();
//	delay_us(1);
		do{
			sta=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
			LCD_EN_Clr();
		   }while(sta);
}


/****  1602液晶写命令函数,cmd为写入的命令  ****/
void LCD1602_WriteCmd(uint8_t cmd) //写指令
{
//	LCD1602_WaitReady();
		LCD_RS_Clr();
		LCD_RW_Clr();
//	LCD_EN_Clr();
//	delay_us(1);
		LCD_EN_Set();
		WriteData(cmd);
		LCD_EN_Clr();
		delay_us(400);
}
/****  1602液晶写数据函数,dat为写入的数据  ****/
void LCD1602_WriteDat(uint8_t dat) //写数据
{
 //	LCD1602_WaitReady();
		LCD_RS_Set();
		LCD_RW_Clr();
//	delay_us(30);
		LCD_EN_Set();
		WriteData(dat);
		LCD_EN_Clr();
		delay_us(400);
}


/****  根据1602的RAM起始地址,定位(x,y)-对应屏幕上的字符坐标  ****/
void LCD1602_SetCursor(uint8_t x, uint8_t y)
{
    uint8_t addr;
    
    if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址
		{addr = 0x80 + 0x00 + x;}  //第一行字符地址从0x00起始,RAM地址为0x80
    else
		{addr = 0x80 + 0x40 + x;}  //第二行字符地址从0x40起始,RAM地址为0x80
    LCD1602_WriteCmd(addr); 
}
      
/****  1602液晶数字显示函数  ****/        
void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num)
{     

	  LCD1602_SetCursor(x, y);	//定位起始地址
      LCD_ShowChar(x,y,num+'0');
	
} 

/****  1602液晶字符显示函数  ****/  
void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat)
{

	  LCD1602_SetCursor(x, y);	//定位起始地址
	  LCD1602_WriteDat(dat);
}


/****  1602液晶字符串显示函数  ****/
void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str)
{
      LCD1602_SetCursor(x, y);	 //定位起始地址
      while(*str != '\0')       
		  {
		    LCD1602_WriteDat(*str++);
		  }
}

主函数调用时候则异常简单,一个初始化,一个调用函数完成功能。

​
#include "stm32f10x.h"
#include "lcd1602.h"


int main(void)
	
{

 	LCD1602_Init();
	LCD1602_ShowStr(1,0,"LCD1602 is OK.");
while(1)
	{	


  }

}

​

三、仿真效果和源代码资源

 基于Proteus无实物零基础STM32入门自学教程(十)--LCD1602液晶显示-单片机文档类资源-CSDN下载

 

 

 

 

 

 

更多推荐

基于Proteus无实物零基础STM32入门自学教程(十)--LCD1602液晶显示

本文发布于:2023-04-03 01:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/add37ec4c2c466238bf2a24c0f59b1b3.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:实物   液晶显示   入门   基础   教程

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!