[单片机笔记]LCD1602模块(51单片机)

1 LCD1602概要

1.1 介绍

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

2 LCD1602功能

2.1 引脚功能

序号引脚功能序号引脚功能
1Vss电源地9DB2数据线line2
2Vcc电源(+5V)10DB3数据线line3
3Vee对比调整电压11DB4数据线line4
4RS0=输入指令,1=输入数据12DB5数据线line5
5R/W0=向LCD输入指令或数据,1=从LCD读取数据13DB6数据线line6
6E使能信号,=1则读取信息,1—>0(下降沿)执行命令14DB7数据线line7
7DB0数据线line0(最低位)15ALCD背光电源正极(接+Vcc)
8DB1数据线116KLCD背光电源负极(接地)

2.2 控制指令集

在这里插入图片描述

表格来源:https://baike.baidu.com/item/LCD1602/6014393

2.3 连线方法

1.直接控制方式
LCD1602的8根数据线和3根控制线E,RS和R/W与单片机相连后即可正常工作。一般应用中只须往LCD1602中写入命令和数据,因此,可将LCD1602的R/W读/写选择控制端直接接地,这样可节省1根数据线。如下图:
在这里插入图片描述
2.间接控制方式
间接控制方式也称为四线制工作方式,是利用HD44780所具有的4位数据总线的功能,将电路接口简化的一种方式。为了减少接线数量,只采用引脚DB4~DB7与单片机进行通信,先传数据或命令的高4位,再传低4位。采用四线并口通信,可以减少对微控制器I/O的需求,当设计产品过程中单片机的I/O资源紧张时,可以考虑使用此方法。

3 程序设计

3.1 头文件

LCD1602.h

#ifndef __LCD1602_H
#define __LCD1602_H

#define LCD1602_BKL_ON		0	//背光开
#define LCD1602_BKL_OFF		1	//背光关

#define LCD1602_DB P2			//数据端口  D0~D7
sbit LCD_RES = P4^1;			//1602的数据/指令选择控制线
sbit LCD_EN = P4^2;				//1602的使能控制线
sbit Lcd1602_light = P0^2;      //背光引脚

/*****************************************************************************/
void LCD1602_Init();
void LCD1602_Clear();

void LCD1602_write_cmd(unsigned char cmd);
void LCD1602_write_data(unsigned char date);
void LCD1602_wtire_CGRAM();

void LCD1602_SetCursor(unsigned char x,unsigned char y);
void LCD1602_ShowChar(unsigned char xpos,unsigned char ypos,unsigned char xsz);
void LCD1602_ShowStr(unsigned char xpos,unsigned char ypos,char *p);
void LCD1602_ShowNum(char x, char y, unsigned int num);

void LCD1602_BKLSet(unsigned char val);
unsigned char LCD1602_BKLGet();

void Delay_ms(unsigned int nms);
#endif

3.2 .c程序

LCD1602.c

#include "LCD1602.h"

3.2.1 延迟函数


/******************************************************************************
 * 函数名称:void Delay_ms(unsigned int nms)				      	*
 * 函数功能:延迟函数							 					      		*
 * 输入参数: //nms为要延时的ms数										   			*
 * 返回值  :无														          	*
 * 其他说明:	 				 				     			  				*
 ******************************************************************************/
void Delay_ms(unsigned int nms)		//@11.0592MHz
{
	unsigned char i, j;	//用单片机小工具根据自己的单片机类型及晶振直接生成对应的延时函数即可
	while(nms--)
	{
		i = 15;
		j = 90;
		do
		{
			while (--j);
		} while (--i);
	}
}

3.2.2 写命令函数

/******************************************************************************
 * 函数名称:void LCD1602_write_cmd(unsigned char cmd)				      	*
 * 函数功能:写命令函数							 					      		*
 * 输入参数:	cmd 命令											   			*
 * 返回值  :无														          	*
 * 其他说明:	 				 				     			  				*
 ******************************************************************************/
void LCD1602_write_cmd(unsigned char cmd)	
{
	LCD1602_DB=cmd;
	LCD_RES=0;
	LCD_EN=1;
	Delay_ms(10);	
	LCD_EN=0;
}

3.2.3 写数据函数

/******************************************************************************
 * 函数名称:void LCD1602_write_data(unsigned char date)				      		*
 * 函数功能:写数据函数							 					      		*
 * 输入参数:	date 数据										      			*
 * 返回值  :无														          *
 * 其他说明:	 				 				     			  				*
 ******************************************************************************/

void LCD1602_write_data(unsigned char date)	
{
	LCD1602_DB=date;
	LCD_RES=1;
	LCD_EN=1;
	Delay_ms(10);
	LCD_EN=0;
}

3.2.4 1602初始化函数

/******************************************************************************
 * 函数名称:void LCD1602_Init(void)				                    			*
 * 函数功能:1602初始化函数							 					      *
 * 输入参数:	无										      					*
 * 返回值  :无														          *
 * 其他说明:	 				 				     			  				*
 ******************************************************************************/

void LCD1602_Init()	
{
	LCD1602_BKLSet(LCD1602_BKL_ON);	//背光开启
	LCD1602_write_cmd(0x01); 	//显示清屏
	LCD1602_write_cmd(0x38);	//显示模式设置
	LCD1602_write_cmd(0x0C);	//显示开及光标设置
	LCD1602_write_cmd(0x06);	//显示光标移动位置
}

3.2.5 1602清屏函数

/******************************************************************************
 * 函数名称:void LCD1602_Clear(void)				                    	*
 * 函数功能:1602清屏函数							 					      *
 * 输入参数:	无										      				*
 * 返回值  :无														          *
 * 其他说明:	 				 				     			  				*
 ******************************************************************************/
void LCD1602_Clear()
{
	LCD1602_write_cmd(0x01);
}

3.2.6 打开1602背光函数

/******************************************************************************
 * 函数名称:void LCD1602_BKLSet(unsigned char val)				              *
 * 函数功能:打开1602背光函数							 					      *
 * 输入参数:	LCD1602_BKL_ON 开LCD1602_BKL_OFF 关							*			 
 * 返回值  :无														          *
 * 其他说明:	 				 				     			  				*
 ******************************************************************************/
void LCD1602_BKLSet(unsigned char val)
{
	Lcd1602_light = val;
}

3.2.7 获取1602背光函数

/******************************************************************************
 * 函数名称:unsigned char LCD1602_BKLGet()				                    *
 * 函数功能:获取1602背光函数							 					      *
 * 输入参数:无									      							*
 * 返回值  :	0 开1 关															*
 * 其他说明:	 				 				     			  				*
 ******************************************************************************/
unsigned char LCD1602_BKLGet()
{
	return Lcd1602_light;
}

3.2.8 设置1602位置函数

/******************************************************************************
 * 函数名称:void LCD1602_SetCursor(unsigned char x,unsigned char y)			*
 * 函数功能:设置1602位置函数							 					      *
 * 输入参数:x 横坐标 y 纵坐标									      				*
 * 返回值  :	无														          *
 * 其他说明:	 				 				     			  				*
 ******************************************************************************/
void LCD1602_SetCursor(unsigned char x,unsigned char y)
{
	unsigned char addr;
	if(y==0)
		addr=0x00+x;
	else
		addr=0x40+x;
	LCD1602_write_cmd(addr | 0x80);
}

3.2.9 制定位置显示函数

/******************************************************************************
 * 函数名称:void LCD1602_ShowNum(char x, char y, unsigned int num)			 *
 * 函数功能:指定位置显示数字函数							 					      *
 * 输入参数:x 横坐标 y 纵坐标		num 数字							      *
 * 返回值  :	无														          *
 * 其他说明:	 				 				     			  *
 ******************************************************************************/
void LCD1602_ShowNum(char x, char y, unsigned int num)
{
	unsigned int i,j,k,l,n;
	i=num/10000;
	j=(num-10000*i)/1000;
	k=(num-10000*i-1000*j)/100;
	l=(num-10000*i-1000*j-100*k)/10;
	n=num%10;
	LCD1602_SetCursor(x,y);
	if(i!=0)LCD1602_write_data(i+0x30);
	if((i!=0)||(j!=0))LCD1602_write_data(j+0x30);
	if((i!=0)||(j!=0)||(k!=0))LCD1602_write_data(k+0x30);
	if((i!=0)||(j!=0)||(k!=0)||(l!=0))LCD1602_write_data(l+0x30);
	LCD1602_write_data(n+0x30);
}

3.2.10 指定位置显示字符函数

/******************************************************************************
 * 函数名称:void LCD1602_ShowChar(unsigned char xpos,unsigned char ypos,char xsz)  *
 * 函数功能:指定位置显示字符函数							 					      *
 * 输入参数:xpos 横坐标 ypos 纵坐标		xsz 字符							      *
 * 返回值  :	无														          *
 * 其他说明:	 				 				     			  *
 ******************************************************************************/
void LCD1602_ShowChar(unsigned char xpos,unsigned char ypos,char xsz)	
{
	ypos%=2;
	if(ypos==0)
	{
		LCD1602_write_cmd(0x80+xpos);
	}
	else
	{
		LCD1602_write_cmd(0x80+0x40+xpos);
	}
	LCD1602_write_data(xsz);
}

3.2.11 指定位置显示字符串函数

/******************************************************************************
 * 函数名称:void LCD1602_ShowStr(unsigned char xpos,unsigned char ypos,char *p) *
 * 函数功能:指定位置显示字符串函数							 					      *
 * 输入参数:xpos 横坐标 ypos 纵坐标		*p 字符串							      *
 * 返回值  :	无														          *
 * 其他说明:	 				 				     			  *
 ******************************************************************************/
void LCD1602_ShowStr(unsigned char xpos,unsigned char ypos,char *p)
{
	if(ypos>1)return;
	while(*p!='\0')
	{
		LCD1602_ShowChar(xpos++,ypos,*p++);
		if(*p=='\n')
		{
			xpos=0;
			ypos++;
			p++;
		}
	}
}

3.2.12 类Y的字模

unsigned char code code_Y[8]={0x11,0x0A,0x04,0x04,0x04,0x04,0x04,0x00};//类似Y的字模

3.2.13 自定义显示字符函数

/******************************************************************************
 * 函数名称:void LCD1602_wtire_CGRAM(void) *
 * 函数功能:自定义显示字符函数							 					      *
 * 输入参数:   无							      *
 * 返回值  :	无														          *
 * 其他说明:	 				 				     			  *
 ******************************************************************************/
void LCD1602_wtire_CGRAM()
{
    unsigned char num;
    LCD1602_write_cmd(0x40);    //对CGRAM第一个自定义字符操作,若是第二个则为0x48,
    							//其次类推(上面有对顶的关系)
    for(num=0;num<8;num++)
    {
       LCD1602_write_data(code_Y[num]);
    } 
    LCD1602_write_cmd(0x80);    //规定显示在第一行第一个位置 
    LCD1602_write_data(0x00);   //显示第一个自定义字符 (0x40对应第一个:0x00)

}
/********************************************************************/


转载自:LCD1602单片机(STC51/STM32)驱动程序详解

  • 30
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值