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

文章目录

  • 1 LCD1602概要
    • 1.1 介绍
  • 2 LCD1602功能
    • 2.1 引脚功能
    • 2.2 控制指令集
    • 2.3 连线方法
  • 3 程序设计
    • 3.1 头文件
    • 3.2 .c程序
      • 3.2.1 延迟函数
      • 3.2.2 写命令函数
      • 3.2.3 写数据函数
      • 3.2.4 1602初始化函数
      • 3.2.5 1602清屏函数
      • 3.2.6 打开1602背光函数
      • 3.2.7 获取1602背光函数
      • 3.2.8 设置1602位置函数
      • 3.2.9 制定位置显示函数
      • 3.2.10 指定位置显示字符函数
      • 3.2.11 指定位置显示字符串函数
      • 3.2.12 类Y的字模
      • 3.2.13 自定义显示字符函数

1 LCD1602概要

1.1 介绍

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

2 LCD1602功能

2.1 引脚功能

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

2.2 控制指令集

[单片机笔记]LCD1602模块(51单片机)_第1张图片

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

2.3 连线方法

1.直接控制方式
LCD1602的8根数据线和3根控制线E,RS和R/W与单片机相连后即可正常工作。一般应用中只须往LCD1602中写入命令和数据,因此,可将LCD1602的R/W读/写选择控制端直接接地,这样可节省1根数据线。如下图:
[单片机笔记]LCD1602模块(51单片机)_第2张图片
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)驱动程序详解

你可能感兴趣的:(嵌入式学习笔记,单片机,51单片机,stm32)