基于51单片机LCD1602

(一)什么是LCD1602

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。

注意:LCD1602仅能显示字母、符号或数字,无法显示汉字。

(二)字符型液晶显示原理

点阵图形式液晶由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显示的基本原理。

字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD,常用16×1,16×2,20×2和40×2等的模块。一般的LCD1602字符型液晶显示器的内部控制器大部分为HD44780,能够显示英文字母、阿拉伯数字、日文片假名和一般性符号。

(三)LCD1602引脚表

在这里插入图片描述
引脚功能介绍:
·引脚1:VSS为地电源。
·引脚2:VDD接5V正电源。
·引脚3:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”现象,使用时可以通过一个10kQ的电位器调整其对比度。
·引脚4:RS为寄存器选择脚,高电平时选择数据寄存器、低电平时选择指令寄存器。
·引脚5:R/W为读/写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或显示地址;当RS为低电平,R/W为高电平时,可以读忙信号;当RS为高电平,R/W为低电平时,可以写入数据。
·引脚6:E端为使能端,当E端由高电平跳变为低电平时,液晶模块执行命令。
·引脚714:D0D7为8位双向数据线。
·引脚15:背光源正极。
·引脚16:背光源负极。

(四)控制器接口时序图

1:读操作时序图
在这里插入图片描述
2:写操作时序图
在这里插入图片描述
首先要对寄存器的选择和读、写操作选择进行配置。RS是寄存器选择,RS = 1对数据进行操作;RS = 0对指令进行操作。

接着对读写操作选择进行配置,RW = 0 写操作。

打开使能端,输入使能信号 E = 1。

数据总线,对DB0~DB7赋值,进行数据的传输

【注】如果先打开使能,再进行其他配置的话,有可能传输的数据不是自己想要的。

(五)1602的原理图

在这里插入图片描述
此部分是谱中科技单片机的1602原理图(大多数老师教学51单片机都是这块板子,如需要原理图请直接找我就好)

(六)1602的配置代码部分解读

1:端口的定义

#define LCD1602_PORT P0  //对数据传输口进行定义
sbit LCD1602_RS = P2^6;  //命令端口
sbit LCD1602_RW = P2^5;  //读写端口
sbit LCD1602_EN = P2^7;  //使能端口

特别注意:端口一定别写错了!!!写错了无法显示。

2:写指令

void LCD1602_write_com(unsigned char com)
{
	LCD1602_RS = 0;//写入命令
	LCD1602_PORT = com;
	LCD1602_delay_ms(1);
	LCD1602_EN = 1;//使能端口高电平
	LCD1602_delay_ms(1);
	LCD1602_EN = 0;
}

3:写数据

void LCD1602_write_data(unsigned char dat)
{
	LCD1602_RS = 1;
	LCD1602_PORT = dat;
	LCD1602_delay_ms(1);	
	LCD1602_EN = 1;
	LCD1602_delay_ms(1);
	LCD1602_EN = 0;
}

4:初始化

void Init_LCD1602()
{
	LCD1602_EN = 0;
	LCD1602_RW = 0;			//设置为写状态			    
	LCD1602_write_com(0x38);//显示模式设定
	LCD1602_write_com(0x0c);//开关显示,光标有无设置、光标闪烁设置
	LCD1602_write_com(0x06);//写一个字符后指针加一
	LCD1602_write_com(0x01);//清屏指令
	LCD1602_write_com(0x80);//设置数据指针起点
}

(七)LCD1602代码

1:lcd1602.c

#include "LCD1602.h"

//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void LCD1602_delay_ms(unsigned int n)
{
	unsigned int  i,j;
	for(i=0;i<n;i++)
		for(j=0;j<110;j++);
}

//****************************************************
//写指令
//****************************************************
void LCD1602_write_com(unsigned char com)
{
	LCD1602_RS = 0;
	LCD1602_PORT = com;
	LCD1602_delay_ms(1);
	LCD1602_EN = 1;
	LCD1602_delay_ms(1);
	LCD1602_EN = 0;
}

//****************************************************
//写数据
//****************************************************
void LCD1602_write_data(unsigned char dat)
{
	LCD1602_RS = 1;
	LCD1602_PORT = dat;
	LCD1602_delay_ms(1);	
	LCD1602_EN = 1;
	LCD1602_delay_ms(1);
	LCD1602_EN = 0;
}

//****************************************************
//连续写字符
//****************************************************
void LCD1602_write_word(unsigned char *s)
{
	while(*s>0)
	{
		LCD1602_write_data(*s);
		s++;
	}
}

void Init_LCD1602()
{
	LCD1602_EN = 0;
	LCD1602_RW = 0;						    
	LCD1602_write_com(0x38);			
	LCD1602_write_com(0x0c);			
	LCD1602_write_com(0x06);			
	LCD1602_write_com(0x01);			
	LCD1602_write_com(0x80);
}

2:LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__


#include <reg52.h>

//LCD1602 IO设置
#define LCD1602_PORT P0
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_EN = P2^7;

//函数或者变量申明
extern void LCD1602_delay_ms(unsigned int n);
extern void LCD1602_write_com(unsigned char com);
extern void LCD1602_write_data(unsigned char dat);
extern void LCD1602_write_word(unsigned char *s);
extern void Init_LCD1602();

#endif

如有错误的地方,还请前辈们指出来!感激不尽!

以下是一个基于C51单片机LCD1602和二氧化碳检测浓度的C语言代码,仅供参考: ```c #include <reg51.h> #include <intrins.h> #define LCD_DATA P0 sbit RS = P2^0; sbit RW = P2^1; sbit E = P2^2; sbit CO2_IN = P1^0; sbit CO2_OUT = P1^1; unsigned int CO2_value; void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 114; j++); } } void write_command(unsigned char com) { RS = 0; RW = 0; LCD_DATA = com; E = 1; _nop_(); _nop_(); E = 0; delay_ms(2); } void write_data(unsigned char dat) { RS = 1; RW = 0; LCD_DATA = dat; E = 1; _nop_(); _nop_(); E = 0; delay_ms(2); } void init_LCD() { write_command(0x38); // 8位数据,2行,5x7点阵字符 write_command(0x0c); // 关闭光标 write_command(0x06); // 光标右移 write_command(0x01); // 清除显示 } void display_CO2(unsigned int value) { unsigned char str[5]; sprintf(str, "%d", value); write_command(0x80); // 第一行显示 write_data('C'); write_data('O'); write_data('2'); write_data(':'); write_data(' '); write_data(str[0]); write_data(str[1]); write_data(str[2]); write_data(str[3]); } void main() { init_LCD(); while (1) { CO2_IN = 1; delay_ms(10); CO2_IN = 0; while (!CO2_OUT); while (CO2_OUT); CO2_value = (unsigned int)(ADC_RES / 2.048); display_CO2(CO2_value); delay_ms(1000); } } ``` 需要注意的是,以上代码仅供参考,具体实现需要根据你所使用的硬件和传感器进行相应的修改和调试。同时,在使用任何电子元器件和设备时,务必注意安全,避免意外事故的发生。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值