当前位置: 首页 > article >正文

51单片机完全学习——LCD1602液晶显示屏

一、数据手册解读

通过看数据手册我们需要知道,这个屏幕每个引脚的定义以及如何进行发送和接收。通过下面这张图我们就可以知道,这些引脚和我们的编程是有关的,需要注意的是,这里我们在接线的时候,一定要把DB0-DB7接到同一个端口,意思就是要接P0就都接P0。这样方便我们直接去处理。我们这里使用的是并行数据传输,也就是说并不像我们之前学习的I2C和SPI接口,需要一位一位的接收和发送。这里的8位数据是同时进行传输的。因此时序上也会有一些区别。

根据上面这张图片,我们需要知道我们要那些底层的函数,我们只想在LCD1602上进行显示,因此我们这次不需要读的一些函数,只需要一个写指令和一个写数据函数。因此具体的函数实现如下

void lcd1602_write_cmd(uchar cmd)
{
	LCD1602_DABUS = cmd;
	LCD1602_EN = 1;
	LCD1602_WR = 0;
	LCD1602_RS = 0;
	LCD1602_EN = 0;
	delay40us();
}

void lcd1602_write_date(uchar date)
{
	LCD1602_DABUS = date;
	LCD1602_EN = 1;
	LCD1602_WR = 0;
	LCD1602_RS = 1;
	LCD1602_EN = 0;
	delay40us();
}

相信大家看到了每个函数结束会有一个延时函数,这是因为不论是写指令还是写数据,LCD1602内部的芯片都需要一定的时间来进行处理,这里我们的延时就是让CPU等一等内部的芯片。

二、LCD1602常用指令集

我们需要注意的是,最后一个指令,判断忙碌信号,我的LCD1602忙信号老是过不去,因此我在前面使用了延时,而不是用这种检测方式。对于上面的指令你可以将它想象成为,你要使用一个东西之前,你需要先对他进行一些设置,也就是进行初始化。

三、LCD1602初始化及显示函数

void lcd1602_init(void)
{
	lcd1602_write_cmd(0x01);      //发送清屏指令
	delay2ms();                   //等待指令执行
	lcd1602_write_cmd(0x06);      //模式设置 写入数据后光标右移,写入数据后显示屏不移动
	lcd1602_write_cmd(0x0f);      //显示功能开 有光标 光标不闪烁
	lcd1602_write_cmd(0x14);      //设定显示屏或光标移动方向 设置为光标右移1格,且AC值加1
	lcd1602_write_cmd(0x38);      //数据总线位数为8位 显示2行 5*7点阵
}
//设置需要显示字符的坐标
//x取值0-15  y取值0-1
void lcd1602_setcoord(uchar x, uchar y)
{
	uchar addr = 0;
	if (y == 0)
	{
		addr = 0x80 + x;
	}
	else
	{
		addr = 0xc0 + x;
	}
	lcd1602_write_cmd(addr);
}
//在LCD1602上显示字符串,而且这个函数还可以实现,自动换行显示
void lcd1602_display_str(uchar x, uchar y, uchar *str)
{
	uchar i = 0;
	lcd1602_setcoord(x, y);
	while (str[i] != '\0')
	{
	  lcd1602_write_date(str[i]);
		if (((i + x) == 15) && y == 0)
		{
			lcd1602_setcoord(0, 1);
		}
		else if (((i + x) == 15) && y == 1)
		{
			lcd1602_setcoord(0, 0);
		}
		i++;
	}
}

这张图片就是DDRAM内存里面的地址,如果我们想要显示一个字符,我们首先需要发送,一个地址,也就是说我们需要告诉LCD1602在那个地方进行显示,然后发送我们需要显示的数据。因此在每次显示前都需要设置地址。但是我们需要注意的是同一个地址只能显示一个字符,不然的话就会进行覆盖。上面代码里面的第二个函数就是用来设置地址的,这个函数会将我们想要显示的坐标位置,转换成内部内存的地址,我们只需要告诉函数x,y的坐标函数就会自己转换。上面代码里面的最后一个函数就是用来显示字符串的。只需要给他传入起始坐标,和字符串的头指针就可以完成显示。


http://www.kler.cn/news/364161.html

相关文章:

  • 全面指南:在 Vue 中优雅封装 HTML <dialog> 组件
  • XML\XXE漏洞基本原理
  • Gitlab 完全卸载–亲测可行
  • 【华为HCIP实战课程十八】OSPF的外部路由类型,网络工程师
  • 我开源了Go语言连接数据库和一键生成结构体的包【实用】
  • 国产蓝牙耳机哪个品牌值得买?百元国产蓝牙耳机品牌排行榜
  • 负载均衡详解:背景、实现技术、作用范围与常用算法
  • 无人机和鸟数据集,无人机数据集+鸟数据集 yolo格式,可以直接用于模型的训练。7000张,图片自己打的标签 yolov5-yolov10通用
  • Echarts提示框(tooltip)浮层显示不全
  • mit6824-02-Lab1:MapReduce分布式实现
  • Spring--4
  • C++与现代开发实践第三节:多线程与并发编程
  • 充电器插拔引起电量跳变怎么办?
  • FPGA开发verilog语法基础1
  • springboot033小徐影城管理系统(论文+源码)_kaic
  • 【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题
  • 使用 Python 解析火狐浏览器的 SQLite3 数据库
  • C++,STL 047(24.10.24)
  • Mysql-count(1)、count(*)和count(列名)的区别?
  • Kafka Tool(Offset Explorer)在windows下配置访问kerberos认证Kafka
  • 【Ubuntu20.04 Visual Studio Code安装】【VSCODE】
  • 相对定位和绝对定位,使得图片在中间 ( html css )
  • Codeforces Round 981(Div. 3)
  • 【开源免费】基于SpringBoot+Vue.JS校园美食分享平台 (JAVA毕业设计)
  • [Python学习日记-53] Python 中的正则表达式模块 —— re
  • docker国内镜像仓库地址