10.lcd1602显示屏显示字符和字符串

lcd1602

概述

LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两
行。

在这里插入图片描述

引脚说明

在这里插入图片描述

第 1 脚: VSS 为电源地

第 2 脚: VDD 接 5V 正电源

第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。

第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W 为低电平时可以写入数据。

第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。

第 7-14 脚:D0~D7 为 8 位双向数据线。

第 15 脚:背光源正极。

第 16 脚:背光源负极。

接线说明

和上官一号的接线
电源
VSS – GND
VDD – 5V

对比度
VO – GND

控制线
RS – P1.0
RW – P1.1
E – P1.4

背光灯
A – 5V
K – GDN

数据
D0到D7 – P0.0 到 P0.7

LCD1602 内部显示地址

在这里插入图片描述

例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第
一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实
际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)。

读写操作时序

读操作时序

在这里插入图片描述

写操作

在这里插入图片描述

数序参数

在这里插入图片描述

LCD1602 的一般初始化(复位)过程

在这里插入图片描述

代码

写指令函数

void write_cmd(char cmd)
{
	check_busy();
	
	RS = 0;
	RW = 0;
	E  = 0;
	
	_nop_();
	
	databuf = cmd;
	
	_nop_();
	
	E = 1;
	
	_nop_();
	_nop_();
		
	E = 0;
	
	_nop_();
}

写数据函数

void write_data (char data1)
{
	check_busy();
	
	RS = 1;
	RW = 0;
	E  = 0;
	
	_nop_();
	
	databuf = data1;
	
	_nop_();
	
	E = 1;
	
	_nop_();
	_nop_();
	
	E = 0;
	
	_nop_();
}

lcd1602初始化

void lcd_init()
{
	Delay15ms();
	write_cmd(0x38);
	Delay5ms();
	check_busy();
	write_cmd(0x38);
	write_cmd(0x08);
	write_cmd(0x01);
	write_cmd(0x06);
	write_cmd(0x0c);
}

检查忙信号函数

这段代码看起来是用于检查LCD(液晶显示器)是否忙碌的函数。让我来解释一下它的工作原理:

首先,将一个值 0x80 存储到 tmp 变量中,并将其赋值给 databuf 变量。这是一个用于控制LCD的命令码。

进入一个 while 循环,条件是 tmp & 0x80,即检查 tmp 的最高位是否为 1。这是因为在LCD忙碌时,它的最高位(bit 7)会被置为 1。

在循环中,首先将 RS(寄存器选择)置为 0,表示发送的是命令,而不是数据。将 RW(读/写选择)置为 1,表示要从LCD读取数据。

将 E(使能端)置为 0,然后延时一段时间,接着将 E 置为 1。这个操作产生一个脉冲,告诉LCD有命令要接收。

接着延时一段时间,然后读取 databuf 变量的值,即从LCD读取状态。

将 E 置为 0,再次产生一个脉冲,结束这次通信。

继续循环,直到 tmp & 0x80 不再为真,也就是LCD不再忙碌为止。

总的来说,这段代码是用于等待LCD完成前一条命令的执行,一旦LCD不再忙碌,函数就会返回。

void check_busy()
{
	char tmp = 0x80;
	databuf = 0x80;
	
	while(tmp & 0x80)
	{
		RS = 0;
		RW = 1;
		E = 0;
		
		_nop_();
		
		E = 1;
		
		_nop_();
		_nop_();
		
		tmp = databuf();
		
		E = 0;
		
		_nop_();	
	}
}

显示字符串函数

void show_string(char row, char column, char *string)
{
	switch(row)
	{
		case 1:
			write_cmd(0x80 + column);
			while(*string)
			{
				write_data(*string++);
			}
			break;
			
		case 2:
			write_cmd(0x40 + 0x80 + column);
			while(*string)
			{
				write_data(*string++);
			}
			break;
	}
}

显示字符C源码

#include "reg52.h"
#include "intrins.h"

#define databuf P0

sbit RS = P1^0;
sbit RW = P1^1;
sbit E  = P1^4;

void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 9;
	j = 244;
	do
	{
		while (--j);
	} while (--i);
}

void Delay15ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 27;
	j = 226;
	do
	{
		while (--j);
	} while (--i);
}

void check_busy()
{
	char tmp = 0x80;
	databuf = 0x80;
	
	while(tmp & 0x80)
	{
		RS = 0;
		RW = 1;
		E  = 0;
		
		_nop_();
		
		E = 1;
		
		_nop_();
		_nop_();
		
		tmp = databuf;
		
		E = 0;
		
		_nop_();
	}
}

void write_cmd(char cmd)
{
	check_busy();
	
	RS = 0;
	RW = 0;
	E  = 0;
	
	_nop_();
	
	databuf = cmd;
	
	_nop_();
	
	E  = 1;
	
	_nop_();
	_nop_();
	
	E  = 0;

	_nop_();
}

void write_data(char data1)
{
	check_busy();
	
	RS = 1;
	RW = 0;
	E  = 0;
	
	_nop_();
	databuf = data1;
	
	_nop_();
	
	E  = 1;
	
	_nop_();
	_nop_();
	
	E  = 0;
	
	_nop_();
}

void lcd_init()
{
	Delay15ms();
	write_cmd(0x38);
	Delay5ms();
	check_busy();
	write_cmd(0x38);
	write_cmd(0x08);
	write_cmd(0x01);
	write_cmd(0x06);
	write_cmd(0x0c);
}

void main()
{
	char position = 0x05 + 0x80;
	char data1 = 'C';
	
	lcd_init();
	
	write_cmd(position);
	
	write_data(data1);
}

在这里插入图片描述

显示字符串源码

#include "reg52.h"
#include "intrins.h"

#define databuf P0

sbit RS = P1^0;
sbit RW = P1^1;
sbit E  = P1^4;

void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 9;
	j = 244;
	do
	{
		while (--j);
	} while (--i);
}

void Delay15ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 27;
	j = 226;
	do
	{
		while (--j);
	} while (--i);
}

void check_busy()
{
	char tmp = 0x80;
	databuf = 0x80;
	
	while(tmp & 0x80)
	{
		RS = 0;
		RW = 1;
		E  = 0;
		
		_nop_();
		
		E = 1;
		
		_nop_();
		_nop_();
		
		tmp = databuf;
		
		E = 0;
		
		_nop_();
	}
}

void write_cmd(char cmd)
{
	check_busy();
	
	RS = 0;
	RW = 0;
	E  = 0;
	
	_nop_();
	
	databuf = cmd;
	
	_nop_();
	
	E  = 1;
	
	_nop_();
	_nop_();
	
	E  = 0;

	_nop_();
}

void write_data(char data1)
{
	check_busy();
	
	RS = 1;
	RW = 0;
	E  = 0;
	
	_nop_();
	databuf = data1;
	
	_nop_();
	
	E  = 1;
	
	_nop_();
	_nop_();
	
	E  = 0;
	
	_nop_();
}

void lcd_init()
{
	Delay15ms();
	write_cmd(0x38);
	Delay5ms();
	check_busy();
	write_cmd(0x38);
	write_cmd(0x08);
	write_cmd(0x01);
	write_cmd(0x06);
	write_cmd(0x0c);
}

void show_string(char row, char column, char *string)
{
		switch(row)
		{
			case 1:
				write_cmd(0x80 + column);
				while(*string)
				{
					write_data(*string++);
//					string++;
				}
				break;
				
			case 2:
				write_cmd(0x80 + 0x40 + column);
				while(*string)
				{
					write_data(*string++);
//					string++;
				}
				break;
		}
}

void main()
{
//	char opposition = 0x05 + 0x80;
//	char data1 = 'C';
	
	lcd_init();
	
//	write_cmd(opposition);
//	write_data(data1);
	

	show_string(1,0,"Zillion hansome!");
	show_string(2,6,"NO.1");
}

在这里插入图片描述

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在LCD1602上显示字符串和汉字,需要先初始化LCD1602,然后将字符和汉字转换为相应的ASCII码并发送到LCD1602的数据端口。以下是一个简单的例子: ```c #include <reg51.h> //定义LCD1602的I/O端口 sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2; //向LCD发送一个指令 void LcdWriteCmd(unsigned char cmd) { RS=0; //选择命令模式 RW=0; //选择写入模式 EN=1; //打开使能 P0=cmd; //发送指令 EN=0; //关闭使能 } //向LCD发送一个字符 void LcdWriteData(unsigned char dat) { RS=1; //选择数据模式 RW=0; //选择写入模式 EN=1; //打开使能 P0=dat; //发送数据 EN=0; //关闭使能 } //初始化LCD1602 void InitLcd() { LcdWriteCmd(0x38); //设置16*2显示,5*7点阵,8位数据接口 LcdWriteCmd(0x0c); //设置显示开,光标关,闪烁关 LcdWriteCmd(0x06); //设置文字在显示器上的移动方向,每次写入后光标加1,整屏不移动 LcdWriteCmd(0x01); //清屏 } //显示字符串 void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str) { unsigned char i; if(y==0) LcdWriteCmd(0x80+x); //在第一行显示 else LcdWriteCmd(0xc0+x); //在第二行显示 for (i=0;str[i]!=0;i++) //逐个发送字符 { LcdWriteData(str[i]); } } //显示汉字 void LcdShowChinese(unsigned char x, unsigned char y, unsigned char *str) { unsigned char i; if(y==0) LcdWriteCmd(0x80+x); //在第一行显示 else LcdWriteCmd(0xc0+x); //在第二行显示 for (i=0;str[i]!=0;i+=2) //逐个发送汉字 { LcdWriteData(str[i]); //发送高字节 LcdWriteData(str[i+1]); //发送低字节 } } void main() { InitLcd(); //初始化LCD1602 LcdShowStr(0, 0, "Hello, world!"); //显示字符串 LcdShowChinese(0, 1, "\xba\xba\xd7\xd6\xce\xf6\xb2\xe5\xd0\xde\xcf\xf1"); //显示汉字 while(1); } ``` 在上面的代码中,`\xba\xba\xd7\xd6\xce\xf6\xb2\xe5\xd0\xde\xcf\xf1` 是“你好世界”的ASCII码,需要先将其转换为相应的汉字再发送到LCD1602上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值