51单片机4线并发IO口控制1602LCD

51单片机4线并发IO口控制1602LCD

1.概述

这篇文章介绍单片机使用4个并发IO口数据线控制LCD显示字符,为单片机节省了4个IO口。
单片机4个IO口控制LCD原理就是将原来1个字节8位数据拆分2次读写,首先读取高4位数据,然后再读低4位数据,实现了4个IO口读取1个字节数据,控制1602LCD显示屏显示字符。

2. 4个IO口控制LCD

2.1.原理

4个IO口控制LCD需要修改如下几个位置的代码即可实现。

  • 忙检测函数
    LCD1602_DB4_DB7 引脚赋值只需要讲高4位置为1即可,低4位位置原有状态。
void LCD1602_TestBusy(void){LCD1602_DB4_DB7 = 0xf0;	//高4位IO口设置为1,低4位IO口保持原态LCD1602_RS = 0; // 指令状态LCD1602_RW = 1;	// 读状态LCD1602_E = 1;while(LCD1602_Busy);	//读取LCD1602_Busy(P1.7)为低电平则结束循环LCD1602_E = 0;	// 关闭LCD显示器读指令
}
  • 写指令函数
    用4根数据线写入8位指令,需要分成两次写入。第一次默认写入高4位指令,第二次将低4位指令移到高4位再次写入,两次完成了一个字节的写入。
void LCD1602_WriteCMD(uint8 LCD1602_command) { LCD1602_TestBusy();LCD1602_RS = 0;LCD1602_RW = 0;//输入的命令高4位赋值给LCD1602_DB4_DB7LCD1602_DB4_DB7 = LCD1602_command;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;//将命令低4位移到高四位供IO口读取LCD1602_DB4_DB7 = LCD1602_command << 4;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;
}
  • 写数据函数
    用4根数据线写入8位数据,需要分成两次写入。第一次默认写入高4位数据,第二次将低4位数据移到高4位再次写入,两次完成了一个字节的写入。
void LCD1602_WriteData(uint8 LCD1602_data){ LCD1602_TestBusy();LCD1602_RS = 1;LCD1602_RW = 0;//写入高4位数据LCD1602_DB4_DB7 = LCD1602_data;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;//将低4位数据移到高4位IO口写入LCD1602_DB4_DB7 = LCD1602_data << 4;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;
}
  • 初始化函数
    LCD1602_WriteCMD(LCD_MODE_PIN4); 设置为4线模式
void LCD1602_Init(void){// 设置4线并行口LCD1602_WriteCMD(LCD_MODE_PIN4);	// 显示模式设置:显示2行,每个字符为5*7个像素LCD1602_WriteCMD(LCD_DIS_ON); 	// 显示开及光标设置:显示开,光标关LCD1602_WriteCMD(LCD_CURSOR_RIGHT);		//显示光标移动设置:文字不动,光标右移LCD1602_WriteCMD(LCD_SCREEN_CLR);	// 显示清屏
}

2.2.源码

#include <STC12C2052AD.H>
#include <string.h> 
typedef unsigned char uint8;
// 定义引脚
#define	LCD1602_DB4_DB7	P1		// 定义高4位LCD1602的数据总线
sbit LCD1602_RS = P3 ^ 2;					// 定义LCD1602的RS控制线
sbit LCD1602_RW = P3 ^ 3;					// 定义LCD1602的RW控制线
sbit LCD1602_E  = P3 ^ 4;					// 定义LCD1602的E控制线
sbit LCD1602_Busy = P1 ^ 7;					// 定义LCD1602的测忙线(与LCD1602_DB4_DB7关联)// 定义指令集
/*设置显示模式*/
#define LCD_MODE_PIN8 0x38	// 8位数据线,两行显示
#define LCD_MODE_PIN4 0x28	// 4位数据线,两个显示
#define LCD_SCREEN_CLR 0x01	// 清屏
#define LCD_CURSOR_RET 0x02	// 光标复位
#define LCD_CURSOR_RIGHT 0x06	// 光标右移,显示不移动
#define LCD_CURSOR_LEFT 0x04	// 光标左移,显示不移动
#define LCD_DIS_MODE_LEFT 0x07 	// AC自增,画面左移
#define LCD_DIS_MODE_RIGHT 0X05	// AC自增,画面右移/*光标开关控制*/
#define LCD_DIS_CUR_BLK_ON 0x0f	// 显示开,光标开,光标闪烁
#define LCD_DIS_CUR_ON 0x0e	// 显示开,光标开,光标不闪烁
#define LCD_DIS_ON 0x0c	// 显示开,光标关,光标不闪烁
#define LCD_DIS_OFF 0x08	// 显示关,光标关,光标不闪烁/*光标、显示移动*/
#define LCD_CUR_MOVE_LEFT 0x10	// 光标左移
#define LCD_CUR_MOVE_RIGHT 0x14	// 光标右移
#define LCD_DIS_MOVE_LEFT 0x18	// 显示左移
#define LCD_DIS_MOVE_RIGHT 0x1c	// 显示右移void DELAY_MS (unsigned int a){unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}
}/**
LCD1602忙碌状态不会接收新指令,因此在发送新指令前先检测是否忙碌。
判断LCD1602_Busy变量的值为低电平则为不忙。
*/
void LCD1602_TestBusy(void){LCD1602_DB4_DB7 = 0xf0;	//高4位IO口设置为1,低4位IO口保持原态LCD1602_RS = 0; // 指令状态LCD1602_RW = 1;	// 读状态LCD1602_E = 1;while(LCD1602_Busy);	//读取LCD1602_Busy(P1.7)为低电平则结束循环LCD1602_E = 0;	// 关闭LCD显示器读指令
}/********************************************************************************************
// 写指令程序 //
// 向LCD1602写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) { LCD1602_TestBusy();LCD1602_RS = 0;LCD1602_RW = 0;//输入的命令高4位赋值给LCD1602_DB4_DB7LCD1602_DB4_DB7 = LCD1602_command;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;//将命令低4位移到高四位供IO口读取LCD1602_DB4_DB7 = LCD1602_command << 4;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCD1602写数据 //
/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){ LCD1602_TestBusy();LCD1602_RS = 1;LCD1602_RW = 0;//写入高4位数据LCD1602_DB4_DB7 = LCD1602_data;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;//将低4位数据移到高4位IO口写入LCD1602_DB4_DB7 = LCD1602_data << 4;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;
}// LCD1602初始化
void LCD1602_Init(void){// 设置4线并行口LCD1602_WriteCMD(LCD_MODE_PIN4);	// 显示模式设置:显示2行,每个字符为5*7个像素LCD1602_WriteCMD(LCD_DIS_ON); 	// 显示开及光标设置:显示开,光标关LCD1602_WriteCMD(LCD_CURSOR_RIGHT);		//显示光标移动设置:文字不动,光标右移LCD1602_WriteCMD(LCD_SCREEN_CLR);	// 显示清屏
}/*
输出字符串
x:数据地址
y:输出的行位置,第一行和第二行
str:输入字符串
*/
void print(uint8 x, uint8 y, uint8 *str){if(0 == y){LCD1602_WriteCMD(0x80 | x);}else{// 第二行起始位置是0x40LCD1602_WriteCMD(0x80 | (0x40+x));}while(*str != '\0'){LCD1602_WriteData(*str++);}}void main(){unsigned char code str[] = "Hello LCD 1602";unsigned char code str1[] = "ABCDEFGHIGKLMNOP";LCD1602_Init();print(0,0,str);print(0,1,str1);while(1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7.9源码编译rtpproxy2.2

升级到gcc9&#xff0c;不然make会报错 yum install centos-release-scl -y yum install devtoolset-9 -y #临时覆盖系统原有的gcc引用 scl enable devtoolset-9 bash # 查看gcc版本 gcc -v 下载和编译rtpproxy cd /usr/src git clone -b rtpp-2.2 https://github.com/sippy/rt…

DDD架构实践

ddd架构浅析 背景介绍 什么是ddd架构&#xff0c;是以ddd思想为参考&#xff0c;做出一份符合ddd思想的框架。 随着技术的迭代升级&#xff0c;越来越多的瓶颈暴露出来&#xff0c;性能瓶颈&#xff0c;系统复杂度瓶颈&#xff0c;这些都逐一被迭代出的技术产物解决。最终的…

SE-Net:Squeeze-and-Excitation Networks(CVPR2018)

文章目录 AbstractIntroduction表征的重要性以前的方向本文提出 Related WorkDeeper ArchitectureAlgorithmic Architecture SearchAttention and gating mechanisms Squeeze-and-Excitation BlocksSqueeze: Global Information EmbeddingExcitation: Adaptive RecalibrationIn…

Python的魔术方法

什么是魔术方法 魔法方法(Magic Method)是python内置方法&#xff0c;格式为&#xff1a;“方法名”&#xff0c;不需要主动调用&#xff0c;存在的目的是为了给python的解释器进行调用&#xff0c;几乎每个魔法方法都有一个对应的内置函数&#xff0c;或者运算符&#xff0c;…

高中信息技术教资科目三

第一章-课程理论知识 学科核心素养 信息意识计算思维数字化学习与创新信息社会责任 教学环节 新课导入新课讲授巩固提高小结作业 第二章-教学实施类 第一节-新课导入 导入原则 针对性原则趣味性原则简洁性原则启发性原则 导入方法 开门见山温故知新生活情境作品情境活…

2023长三角(芜湖)人工智能数字生态峰会成功召开!

聚焦当下&#xff0c;共议数字时代发展&#xff1b;瞩目未来&#xff0c;共谋数字生态蓝图。12月11日&#xff0c;2023长三角&#xff08;芜湖&#xff09;人工智能数字生态峰会暨2023长三角&#xff08;芜湖&#xff09;人工智能视觉算法大赛颁奖典礼在芜湖宜居国际博览中心盛…

如何使用AnyTXT Searcher实现远程办公速查异地电脑文件提升工作效率

如何使用AnyTXT Searcher实现远程办公速查异地电脑文件提升工作效率 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过…

飞速(FS)100G ZR4 光模块80km长距离传输

如今&#xff0c;100G QSFP28光模块已经被广泛部署在100m到40km的范围内。然而&#xff0c;传统的100G QSFP28模块面临一个挑战&#xff0c;因为它们的设计仅限于不超过40km的距离。超出此范围&#xff0c;色散、光衰减等问题就会增加&#xff0c;导致信噪比&#xff08;SNR&am…

八股文打卡day3——计算机网络(3)

面试题&#xff1a;请讲一下四次挥手的过程&#xff1f; 1.客户端发送FIN数据包给服务器&#xff0c;表示客户端不再发送数据给服务器&#xff0c;想要断开这个方向的连接。 2.服务器收到客户端的FIN包之后&#xff0c;发送ACK包给客户端&#xff0c;对收到的FIN包进行收到确认…

Vue3 Element Plus WindiCSS 项目开发环境搭建

一 概述 MVVM 是 Model-View-ViewModel 的简写&#xff0c;它本质上是 MVC 的改进版。MVVM 将其中的 View 的状态和行为抽象化&#xff0c;并且将视图 UI 和业务逻辑分开。 &#xff08;1&#xff09;M&#xff1a;即 Model&#xff08;模型&#xff09;&#xff0c;包括数据和…

13. 从零用Rust编写正反向代理, HTTP中的压缩gzip,deflate,brotli算法

wmproxy wmproxy是由Rust编写&#xff0c;已实现http/https代理&#xff0c;socks5代理&#xff0c; 反向代理&#xff0c;静态文件服务器&#xff0c;内网穿透&#xff0c;配置热更新等&#xff0c; 后续将实现websocket代理等&#xff0c;同时会将实现过程分享出来&#xff…

mysql的索引约束检查触发器

索引&#xff1a; MySQL 索引是一种用于提高查询性能的关键数据库特性。通过在表上创建索引&#xff0c;MySQL 可以更有效地定位和检索数据&#xff0c;从而加速查询操作。以下是关于 MySQL 索引的一些基本信息&#xff1a; 1. **索引类型&#xff1a;** - **单列索引&…

构建智慧储能物联网,4G工业路由器远程监测在线管理

物联网技术的发展为智慧储能管理带来了革命性的变化。其中&#xff0c;4G工业路由器IR5000通过丰富的连接能力如串口RS485/232或网口的方式&#xff0c;实现了与储能现场各设备的连接&#xff0c;包括电表、电能检测器、防孤岛装置、BMS电池管理系统、监控服务器、储能控制器、…

WEB渗透—PHP反序列化(五)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

xcrun: error: invalid active developer path

macOS升级完成后出现 xcrun: error: invalid active developer path问题。 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun这是由于 Xcode command line tools 丢…

Python-Selenium-使用 pywinauto 实现 Input 上传文件

当前环境&#xff1a;Win10 Python3.7 pywinauto0.6.8&#xff0c;selenium3.14.1 示例代码 from pywinauto import Desktop import osapp Desktop() dialog app[打开] dialog[Edit].set_edit_text(os.getcwd() .\\example-01.jpg) dialog[Button].click() 其他方法&…

LINUX SD卡备份的镜像+烧录启动时自动扩展最后一个分区

在开发到生产过程中,对系统镜像的备份及再烧录过程是必不可少的。经常看到烧录官方镜像的时候,我们会发现当镜像第一次启动后,磁盘空间会自动扩充到整个TF/SD卡。那么当我们自己制作镜像的时候,能不能去除未使用的空间,制作体积较小的镜像,并在该镜像启动时自动扩展,从而…

【影像组学入门百问】#29---#31

#29-影像组学研究中&#xff0c;消除不同影像间因设备和扫 描参数引起的差异的方法有哪些&#xff1f; 在影像组学研究中&#xff0c;消除不同影像间因设备和扫描参数引起的差异至关重要。以下是一些常用的方法&#xff1a; 1.归一化&#xff08;Normalization&#xff09;&a…

喜报|棱镜七彩获评江苏省专精特新中小企业

近日&#xff0c;江苏省工业和信息化厅发布《关于江苏省2023年专精特新中小企业和2020年度专精特新企业复核通过企业名单的公示》&#xff0c;棱镜七彩成功入选2023年江苏省省级专精特新中小企业名单。 图 2023年省级专精特新中小企业公式名单节选 “专精特新”是国家为鼓励中…

Python纯净式下载与安装

1. 下载 Download Python | Python.org 建议下老版本些的&#xff0c;毕竟求稳。 点击需要的版本&#xff0c;然后滑倒最下面&#xff0c;可以看到不同系统对应的下载选项&#xff1a; 2. 安装 如果下载慢的话&#xff0c;可以复制链接到迅雷下载&#xff0c;下载完成后&…