C51 LCD1602的使用

本文详细介绍LCD1602液晶显示屏的工作原理和技术细节,包括其内部结构、控制指令、操作流程以及如何显示字符和字符串等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LCD1602介绍

LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCLL码的标准字符和其他的一些内置特殊符号,还可以有8个自定义中文信息。
显示容量:16×2,即最多只能显示32个字符,每个字符为5*7点阵。
在这里插入图片描述

引脚及应用电路

在这里插入图片描述

引脚功能
VSS
VDD电源正极(4.5~5.5V)
VO对比度调节电压
RS数据/指令选择,1为数据,0为指令
RW读/写选择,1读,0写
E使能,1为数据有效,下降沿执行命令
D0~D7数据输入/输出
A背光灯电源正极
K背光灯电源负极

内部结构单元

在这里插入图片描述
在这里插入图片描述

存储器结构

DDRAM(数据显示区)

在这里插入图片描述

CGRAM+CGROM(字模库)

拿A举例,纵向0100横向0001 合起来就是0100 0001
在这里插入图片描述
在这里插入图片描述

时序结构

RS:设置指令/数据 , 数据 - 高,指令 - 低
R/W:读写 , 写 - 低 ,读 - 高
E:使能高电平有效
DB0~DB7:数据

读操作时序

在这里插入图片描述

写操作时序

在这里插入图片描述

LCD1602显示模块控制指令

在这里插入图片描述
在这里插入图片描述

LCD1602操作流程

  1. 初始化
    发送指令0X38 八位数据接口,两行显示,5*7点阵(指令6)
    发送指令0X0C 显示开,光标关,闪烁关(指令4)
    发送指令0X06 数据读写操作后,光标自动加一,画面不动(指令3)
    发送指令0X01 清屏(指令1)
  2. 显示字符
    发送指令0X80|AC 设置光标位置
    发送数据 发送要显示的字符数据
    发送数据 发送要显示的字符数据
    ……

LCD1602字符和字符串

1.字符:根据一定规则建立的数字到字符的映射(ASCII码表)
例如:0x21 = ‘!’,0x41 = ‘A’,0x00 = ‘\0’
定义方法:char x = ‘A’;(等效于char x = 0x41;)

2.字符数组:存储字符变量非一个数组
定义方法:char y[] = {‘A’,‘B’,‘C’};(等效于char y[] = {0x41,0x42,0x43};)

3.字符串:在字符数组后加一个字符串结束标志,本质上是字符数组
定义方法:char z[] = “ABC”;(等效于char z[] = {‘A’,‘B’,‘C’,’\0’};)

LCD显示字符

LCD1602.h

#ifndef _LCD1602_H_
#define _LCD1602_H_

void LCD_WriteCommand(unsigned char Command);
void LCD_WriteDate(unsigned char Date);
void LCD_Init(void);
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char);


#endif

LCD1602.c

#include <REGX52.h>
#include "LCD1602.h"
#include <INTRINS.H>

sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_E  = P2^7;

#define LCD_DataPort P0

/**
 *¹¦ÄÜ£ºÑÓʱ1ms
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void LCD_Delay1ms(void)		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

/**
 *¹¦ÄÜ£ºÐ´Ö¸ÁÊý
 *²ÎÊý£ºCommand Ö¸Áî
 *·µ»ØÖµ£ºvoid
 *²ÎÕÕ£ºÐ´²Ù×÷ʱÐòͼ
 */
void LCD_WriteCommand(unsigned char Command)
{
		LCD_RS = 0;							//ÉèÖÃÖ¸Áîģʽ
		LCD_RW = 0;							//ÉèÖÃдģʽ 
		LCD_DataPort = Command; //дָÁî
	  LCD_E  = 1;
		LCD_Delay1ms();
		LCD_E  = 0;
		LCD_Delay1ms();

}

/**
 *¹¦ÄÜ£ºÐ´Êý¾Ýº¯Êý
 *²ÎÊý£ºDate Êý¾Ý
 *·µ»ØÖµ£ºvoid
 *²ÎÕÕ£ºÐ´²Ù×÷ʱÐòͼ
 */
void LCD_WriteDate(unsigned char Date)
{
		LCD_RS = 1;							//ÉèÖÃÊý¾Ýģʽ
		LCD_RW = 0;							//ÉèÖÃдģʽ 
		LCD_DataPort = Date;    //дָÁî
	  LCD_E  = 1;
		LCD_Delay1ms();
		LCD_E  = 0;
		LCD_Delay1ms();

}

/**
 *¹¦ÄÜ£ºLCD³õʼ»¯º¯Êý
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void LCD_Init(void)
{
		LCD_WriteCommand(0x38);//ÅäÖðËλÊý¾Ý½Ó¿Ú
		LCD_WriteCommand(0X0c);//ÏÔʾ¿ª£¬¹â±ê¹Ø£¬ÉÁ˸¿ª
		LCD_WriteCommand(0X06);//¹â±ê+1£¬»­Ãæ²»¶¯
		LCD_WriteCommand(0X01);//ÇåÆÁ

}

/**
 *¹¦ÄÜ£ºÏÔʾ×Ö·ûº¯Êý
 *²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ £¬Char ÒªÏÔʾµÄ×Ö·û
 *·µ»ØÖµ£ºvoid
 */
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char)
{
		if(Line == 1){
				//µÚÒ»ÐеØÖ·
				LCD_WriteCommand(0x80 | (Columu - 1));
		
		}else{
				//µÚ¶þÐеØÖ·
				LCD_WriteCommand(0x80 | (Columu - 1) + 0x40);

		
		}
		LCD_WriteDate(Char);

}


main.c

#include <REGX52.h>
#include <INTRINS.H>
#include "Timer0.h"
#include "uart.h"
#include "LCD1602.h"

/**
 *¹¦ÄÜ£ºÑÓʱ500ms
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void Delay500ms(void)		//@11.0592MHz
{
	unsigned char i, j, k;
	
	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

int main()
{
		LCD_Init();
		LCD_Showchar(1,2,'A');

	while(1)
	{
	}
}


LCD显示字符串和数字

为什么LCD1602.c中有个for循环用的char,如果定义个变量只是为了循环,char和int的效果一样,并且char占一个字节,int占4个字节。

LCD1602.h

#ifndef _LCD1602_H_
#define _LCD1602_H_

void LCD_WriteCommand(unsigned char Command);
void LCD_WriteDate(unsigned char Date);
void LCD_Init(void);
void LCD_SetCursor(unsigned char Line,unsigned char Columu);
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char *String);
int LCD_Pow(int x,int y);
int LCD_getNumberSize(int Number);
void LCD_ShowNumber(unsigned char Line,unsigned char Columu,unsigned int Number);

#endif

LCD1602.c

#include <REGX52.h>
#include "LCD1602.h"
#include <INTRINS.H>

sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_E  = P2^7;

#define LCD_DataPort P0

/**
 *¹¦ÄÜ£ºÑÓʱ1ms
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void LCD_Delay1ms(void)		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

/**
 *¹¦ÄÜ£ºÐ´Ö¸ÁÊý
 *²ÎÊý£ºCommand Ö¸Áî
 *·µ»ØÖµ£ºvoid
 *²ÎÕÕ£ºÐ´²Ù×÷ʱÐòͼ
 */
void LCD_WriteCommand(unsigned char Command)
{
		LCD_RS = 0;							//ÉèÖÃÖ¸Áîģʽ
		LCD_RW = 0;							//ÉèÖÃдģʽ 
		LCD_DataPort = Command; //дָÁî
	  LCD_E  = 1;
		LCD_Delay1ms();
		LCD_E  = 0;
		LCD_Delay1ms();

}

/**
 *¹¦ÄÜ£ºÐ´Êý¾Ýº¯Êý
 *²ÎÊý£ºDate Êý¾Ý
 *·µ»ØÖµ£ºvoid
 *²ÎÕÕ£ºÐ´²Ù×÷ʱÐòͼ
 */
void LCD_WriteDate(unsigned char Date)
{
		LCD_RS = 1;							//ÉèÖÃÊý¾Ýģʽ
		LCD_RW = 0;							//ÉèÖÃдģʽ 
		LCD_DataPort = Date;    //дָÁî
	  LCD_E  = 1;
		LCD_Delay1ms();
		LCD_E  = 0;
		LCD_Delay1ms();

}

/**
 *¹¦ÄÜ£ºLCD³õʼ»¯º¯Êý
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void LCD_Init(void)
{
		LCD_WriteCommand(0x38);//ÅäÖðËλÊý¾Ý½Ó¿Ú
		LCD_WriteCommand(0X0c);//ÏÔʾ¿ª£¬¹â±ê¹Ø£¬ÉÁ˸¿ª
		LCD_WriteCommand(0X06);//¹â±ê+1£¬»­Ãæ²»¶¯
		LCD_WriteCommand(0X01);//ÇåÆÁ

}

/**
 *¹¦ÄÜ£ºÏÔʾ¹â±ê
 *²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ
 *·µ»ØÖµ£ºvoid
 */
void LCD_SetCursor(unsigned char Line,unsigned char Columu)
{
		if(Line == 1){
				//µÚÒ»ÐеØÖ·
				LCD_WriteCommand(0x80 | (Columu - 1));
		
		}else{
				//µÚ¶þÐеØÖ·
				LCD_WriteCommand(0x80 | (Columu - 1) + 0x40);

		}

}

/**
 *¹¦ÄÜ£ºÏÔʾ×Ö·ûº¯Êý
 *²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ £¬Char ÒªÏÔʾµÄ×Ö·û
 *·µ»ØÖµ£ºvoid
 */
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char)
{
		LCD_SetCursor(Line,Columu);
	
		LCD_WriteDate(Char);

}

/**
 *¹¦ÄÜ£ºÏÔʾ×Ö·û´®º¯Êý
 *²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ £¬String ÒªÏÔʾµÄ×Ö·û´®
 *·µ»ØÖµ£ºvoid
 */
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char *String)
{
		unsigned char i;
	
		LCD_SetCursor(Line,Columu);
	
		for(i=0;String[i]!='\0';i++)
		{
			LCD_WriteDate(String[i]);
		}

}

/**
 *¹¦ÄÜ£ºÏÔʾ´Î·½º¯Êý(xµÄy´Î·½)
 *²ÎÊý£ºx µ×Êý y ´Î·½
 *·µ»ØÖµ£ºResult  xµÄy´Î·½½á¹û
 */
int LCD_Pow(int x,int y)
{
		unsigned char i;
		int Result = 1;
	
		for(i=0;i<y;i++)
		{
				Result *=x;
		
		}
		return Result;

}

/**
 *¹¦ÄÜ£º»ñÈ¡Êý×Ö³¤¶È
 *²ÎÊý£ºNumber ÐèÒª»ñÈ¡³¤¶ÈµÄÊý×Ö
 *·µ»ØÖµ£ºSize Êý×ÖNumberµÄ³¤¶È
 */
int LCD_getNumberSize(int Number)
{
		unsigned int Size = 0;
	
		while(Number > 0)
		{
				Number /= 10;
				Size++;
		}
		return Size;
}

/**
 *¹¦ÄÜ£ºÏÔʾÊý×Öº¯Êý
 *²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ £¬Number ÒªÏÔʾµÄÊý×Ö
 *·µ»ØÖµ£ºvoid
 */
void LCD_ShowNumber(unsigned char Line,unsigned char Columu,unsigned int Number)
{
		unsigned int i;
		LCD_SetCursor(Line,Columu);

		for(i=LCD_getNumberSize(Number);i>0;i--)
		{
				LCD_WriteDate('0'+Number/LCD_Pow(10,i-1)%10);
		}

}

main.c

#include <REGX52.h>
#include <INTRINS.H>
#include "Timer0.h"
#include "uart.h"
#include "LCD1602.h"

/**
 *¹¦ÄÜ£ºÑÓʱ500ms
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void Delay500ms(void)		//@11.0592MHz
{
	unsigned char i, j, k;
	
	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

int main()
{
		LCD_Init();
		LCD_Showchar(1,1,'A');
		LCD_ShowString(1,3,"Finny");
		LCD_ShowNumber(2,3,789);

		while(1)
		{
		
		}
}

C51LCD1602滚动显示是指在C51单片机使用LCD1602显示屏进行滚动显示内容的功能。LCD1602是一种常见的字符型液晶显示屏,可以显示16个字符,每行2行。通过编程控制,可以实现文字的滚动显示效果。以下是实现C51LCD1602滚动显示的基本步骤: 1. **初始化LCD1602**: - 设置数据线和控制端口。 - 初始化LCD1602的模式(如显示模式、光标位置等)。 2. **定义显示内容**: - 定义要显示的字符串。 - 将字符串存储在数组中。 3. **实现滚动显示**: - 通过定时器中断或延时函数控制滚动速度。 - 每次中断或延时后,更新显示内容的位置,将字符串向左或向右移动一个字符。 4. **刷新LCD显示**: - 每次更新位置后,重新写入LCD1602显示内容。 以下是一个简单的示例代码,演示如何在C51单片机上实现LCD1602的滚动显示: ```c #include <reg52.h> #include <intrins.h> #define LCD_DATA P0 sbit LCD_RS = P2^6; sbit LCD_RW = P2^5; sbit LCD_E = P2^7; void Delay(unsigned int ms) { unsigned int i, j; for(i = ms; i > 0; i--) for(j = 110; j > 0; j--); } void LCD_WriteCommand(unsigned char command) { LCD_RS = 0; LCD_RW = 0; LCD_DATA = command; LCD_E = 1; Delay(1); LCD_E = 0; Delay(5); } void LCD_WriteData(unsigned char dat) { LCD_RS = 1; LCD_RW = 0; LCD_DATA = dat; LCD_E = 1; Delay(1); LCD_E = 0; Delay(5); } void LCD_Init() { LCD_WriteCommand(0x38); // 8位数据接口,2行显示,5x7点阵 LCD_WriteCommand(0x0C); // 显示开,光标关,闪烁关 LCD_WriteCommand(0x06); // 写入新数据后光标自动加1 LCD_WriteCommand(0x01); // 清屏 Delay(5); } void LCD_ShowString(unsigned char x, unsigned char y, unsigned char *str) { unsigned char address; if(y == 0) address = 0x80 + x; else address = 0xC0 + x; LCD_WriteCommand(address); while(*str != '\0') { LCD_WriteData(*str++); } } void main() { unsigned char message[] = "Hello, C51LCD1602!"; unsigned char i; LCD_Init(); LCD_ShowString(0, 0, message); while(1) { for(i = 0; i < 16; i++) { LCD_WriteCommand(0x18); // 左移 Delay(500); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小阿大:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值