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

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值加1lcd1602_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.lryc.cn/news/471013.html

相关文章:

  • 【知识科普】今天聊聊前端打包工具webpack
  • 雷池社区版中升级雷池遇到问题
  • C++基础:constexpr,类型转换和选择语句
  • STM32 RTC时间无法设置和读取
  • go语言中defer用法详解
  • iOS 18.2开发者预览版 Beta 1版本发布,欧盟允许卸载应用商店
  • 【SQL】SQL函数
  • NSSCTF刷题篇web部分
  • 超子物联网HAL库笔记:准备篇
  • FoRAG:面向网络增强型长文本问答的事实优化检索增强生成方法
  • Android NSD局域网发现服务
  • 算法的学习笔记—左旋转字符串(牛客JZ58)
  • Mac 上无法烧录 ESP32C3 的问题记录:A fatal error occurred:Failed to write to target RAM
  • ios 项目升级极光SDK
  • 【Java】java | logback日志配置 | 按包配置级别
  • Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS
  • Spring框架原理面试题及参考答案
  • Java类的static成员以及代码块(详细版)
  • Opensearch集群部署【docker、服务器、Helm多种部署方式】
  • 本地Docker部署开源WAF雷池并实现异地远程登录管理界面
  • 性能需求笔记
  • ts:数组的常用方法(reduce累加)
  • Begin
  • 【实战案例】Django框架表单处理及数据库交互
  • python开发工具是选择vscode还是pycharm?两款软件优缺点对照!
  • 2025选题|基于Hadoop的物品租赁系统的设计与实现
  • 【Qt】QTableView添加下拉框过滤条件
  • 部署DNS主从服务器
  • 从可逆计算看低代码
  • 设计模式最佳实践代码总结 - 结构型设计模式篇 - 侨接设计模式最佳实践