软件模拟8080通信
8080 接口也叫 I8080是一种并行、异步、半双工总线常见于 LCD/TFT 屏驱动如 ILI9341、ILI9488、NT35510核心是WR 上升沿写、RD 上升沿读。一、接口信号8/16/24 位CS片选低有效CS0 时芯片被选中。RS / DC命令 / 数据选择0 命令1 数据。WR写信号低有效上升沿锁存数据。RD读信号低有效上升沿读取数据。D[7:0] / D[15:0] / D[23:0]双向并行数据线。要注意的是WR、RD 不能同时为低。二、基本时序1.写命令CS 0片选选中RS 0命令RD 1 (WR、RD 不能同时为低因为是写所以禁止读)D [X:0] 命令值WR 0开始写WR 1从机读CS 1释放2.写数据时序同上仅需将RS改为1写的是数据3.读数据CS 0选中RS 1数据WR 1禁止写RD 0开始读data D [X:0]读取各个数据线的电平状态RD 1CS 1三、完整代码my8080.h#ifndef __MY_8080_H #define __MY_8080_H #include stm32f10x.h // 引脚初始化 void my8080_pinInit(void); // 写命令 void my8080_writeCommand(uint16_t command); // 写数据 void my8080_writeData(uint16_t data); // 读数据 uint16_t my8080_readData(void); #endifmy8080.c#include my_8080.h #define D0_pin GPIO_Pin_14 #define D0_port GPIOD #define D1_pin GPIO_Pin_15 #define D1_port GPIOD #define D2_pin GPIO_Pin_0 #define D2_port GPIOD #define D3_pin GPIO_Pin_1 #define D3_port GPIOD #define D4_pin GPIO_Pin_7 #define D4_port GPIOE #define D5_pin GPIO_Pin_8 #define D5_port GPIOE #define D6_pin GPIO_Pin_9 #define D6_port GPIOE #define D7_pin GPIO_Pin_10 #define D7_port GPIOE #define D8_pin GPIO_Pin_11 #define D8_port GPIOE #define D9_pin GPIO_Pin_12 #define D9_port GPIOE #define D10_pin GPIO_Pin_13 #define D10_port GPIOE #define D11_pin GPIO_Pin_14 #define D11_port GPIOE #define D12_pin GPIO_Pin_15 #define D12_port GPIOE #define D13_pin GPIO_Pin_8 #define D13_port GPIOD #define D14_pin GPIO_Pin_9 #define D14_port GPIOD #define D15_pin GPIO_Pin_10 #define D15_port GPIOD // 写信号 #define WR_pin GPIO_Pin_5 #define WR_port GPIOD // 读信号 #define RD_pin GPIO_Pin_4 #define RD_port GPIOD // 片选 #define CS_pin GPIO_Pin_12 #define CS_port GPIOG // 数据or命令选择 #define DC_pin GPIO_Pin_0 #define DC_port GPIOG // 片选 #define CS(x) GPIO_WriteBit(CS_port, CS_pin, (x) ? Bit_SET : Bit_RESET) // 数据or命令选择 #define DC(x) GPIO_WriteBit(DC_port, DC_pin, (x) ? Bit_SET : Bit_RESET) // 写信号 #define WR(x) GPIO_WriteBit(WR_port, WR_pin, (x) ? Bit_SET : Bit_RESET) // 读信号 #define RD(x) GPIO_WriteBit(RD_port, RD_pin, (x) ? Bit_SET : Bit_RESET) // 设置数据引脚为输出模式 static void setDataPinMode_Output(void) { GPIO_InitTypeDef GPIO_InitStructure {0}; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin D0_pin | D1_pin | D2_pin | D3_pin | D13_pin|D14_pin|D15_pin; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GPIOD, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin D4_pin | D5_pin | D6_pin | D7_pin | D8_pin|D9_pin|D10_pin|D11_pin|D12_pin; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOE, GPIO_InitStructure); } // 设置数据引脚为输入模式 static void setDataPinMode_Input(void) { GPIO_InitTypeDef GPIO_InitStructure {0}; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin D0_pin | D1_pin | D2_pin | D3_pin | D13_pin|D14_pin|D15_pin; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin D4_pin | D5_pin | D6_pin | D7_pin | D8_pin|D9_pin|D10_pin|D11_pin|D12_pin; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOE, GPIO_InitStructure); } // 引脚初始化 void my8080_pinInit(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); GPIO_InitTypeDef GPIO_InitStructure {0}; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // WR GPIO_InitStructure.GPIO_Pin WR_pin; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(WR_port, GPIO_InitStructure); // RD GPIO_InitStructure.GPIO_Pin RD_pin; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(RD_port, GPIO_InitStructure); // CS GPIO_InitStructure.GPIO_Pin CS_pin; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(CS_port, GPIO_InitStructure); // DC GPIO_InitStructure.GPIO_Pin DC_pin; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(DC_port, GPIO_InitStructure); // CS、WR、RD 初始化为高电平 WR(1); RD(1); CS(1); // 设置数据引脚为输入模式 setDataPinMode_Input(); } // 往数据总线写入数据 static void putData(uint16_t data) { setDataPinMode_Output(); // 设置数据引脚为输出模式 GPIO_WriteBit(D0_port, D0_pin, (data 0x0001 0) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D1_port, D1_pin, (data 0x0001 1) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D2_port, D2_pin, (data 0x0001 2) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D3_port, D3_pin, (data 0x0001 3) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D4_port, D4_pin, (data 0x0001 4) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D5_port, D5_pin, (data 0x0001 5) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D6_port, D6_pin, (data 0x0001 6) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D7_port, D7_pin, (data 0x0001 7) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D8_port, D8_pin, (data 0x0001 8) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D9_port, D9_pin, (data 0x0001 9) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D10_port, D10_pin, (data 0x0001 10) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D11_port, D11_pin, (data 0x0001 11) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D12_port, D12_pin, (data 0x0001 12) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D13_port, D13_pin, (data 0x0001 13) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D14_port, D14_pin, (data 0x0001 14) ? Bit_SET : Bit_RESET); GPIO_WriteBit(D15_port, D15_pin, (data 0x0001 15) ? Bit_SET : Bit_RESET); } // 从数据总线读取数据 static uint16_t getData(void) { setDataPinMode_Input(); // 设置数据引脚为输入模式 uint16_t data 0; data | GPIO_ReadInputDataBit(D0_port, D0_pin) 0; data | GPIO_ReadInputDataBit(D1_port, D1_pin) 1; data | GPIO_ReadInputDataBit(D2_port, D2_pin) 2; data | GPIO_ReadInputDataBit(D3_port, D3_pin) 3; data | GPIO_ReadInputDataBit(D4_port, D4_pin) 4; data | GPIO_ReadInputDataBit(D5_port, D5_pin) 5; data | GPIO_ReadInputDataBit(D6_port, D6_pin) 6; data | GPIO_ReadInputDataBit(D7_port, D7_pin) 7; data | GPIO_ReadInputDataBit(D8_port, D8_pin) 8; data | GPIO_ReadInputDataBit(D9_port, D9_pin) 9; data | GPIO_ReadInputDataBit(D10_port, D10_pin) 10; data | GPIO_ReadInputDataBit(D11_port, D11_pin) 11; data | GPIO_ReadInputDataBit(D12_port, D12_pin) 12; data | GPIO_ReadInputDataBit(D13_port, D13_pin) 13; data | GPIO_ReadInputDataBit(D14_port, D14_pin) 14; data | GPIO_ReadInputDataBit(D15_port, D15_pin) 15; return data; } // 写命令 void my8080_writeCommand(uint16_t command) { CS(0); // 拉低片选 DC(0); // 拉低表示写命令 RD(1); // 确保释放读信号 读和写不能同时拉低 putData(command); // 写入命令数据 WR(0); // 拉低写信号 开始写 WR(1); // 拉高写信号 从机读 CS(1); // 拉高片选 } // 写数据 void my8080_writeData(uint16_t data) { CS(0); // 拉低片选 DC(1); // 拉高表示写数据 RD(1); // 确保释放读信号 读和写不能同时拉低 putData(data); // 写入数据 WR(0); // 拉低写信号 开始写 WR(1); // 拉高写信号 从机读 CS(1); // 拉高片选 } // 读数据 uint16_t my8080_readData(void) { uint16_t data; CS(0); // 拉低片选 DC(1); // 拉高表示读数据 WR(1); // 确保释放写信号 读和写不能同时拉低 RD(0); // 拉低读信号 从机放数据 data getData(); // 主机读 RD(1); // 拉高读信号 从机释放数据总线 CS(1); // 拉高片选 return data; }

相关新闻

批量生产技术博客实测,墨衍 AI 如何让内容矩阵效率翻倍

批量生产技术博客实测,墨衍 AI 如何让内容矩阵效率翻倍

从选题荒到一键分发:墨衍 AI 批量生产实测复盘 对于负责技术博客矩阵的运营人员或中小团队来说,最头疼的往往不是“写不出”,而是“写不完”。面对 SEO 对内容规模和更新频率的硬性要求,人工逐篇构思选题、调整排版、多平台分发&a…

2026/7/9 5:45:07阅读更多 →
告别 AI 味太重,用墨衍 MoGrow 四种策略写出像人写的技术文

告别 AI 味太重,用墨衍 MoGrow 四种策略写出像人写的技术文

为什么你的 AI 文章总差那么一口气 做过技术内容创作的人,大多有过这种“食之无味”的体验:用 AI 生成的文章,语法通顺、术语准确,但读起来就是不对劲。它们要么像冷冰冰的产品说明书,堆砌了一堆专业名词却缺乏人味&am…

2026/7/9 5:45:07阅读更多 →
Adaptive-RAG 效率对比:3种策略在 SQuAD/HotpotQA 上的耗时与 F1 评测

Adaptive-RAG 效率对比:3种策略在 SQuAD/HotpotQA 上的耗时与 F1 评测

Adaptive-RAG 效率对比:三种策略在单跳与多跳问答场景下的性能权衡当企业考虑将RAG系统投入生产环境时,一个关键问题往往被忽视:是否所有查询都需要相同的处理强度?我们团队在金融、医疗和电商领域的实践表明,约78%的日…

2026/7/9 5:40:06阅读更多 →
CubeSandbox:面向 AI Agent 的即时、并发、安全轻量沙箱服务

CubeSandbox:面向 AI Agent 的即时、并发、安全轻量沙箱服务

CubeSandbox:面向 AI Agent 的即时、并发、安全轻量沙箱服务 📌 核心观点 CubeSandbox 是腾讯云开源的高性能沙箱服务,专为 AI Agent 代码执行场景设计。它基于 RustVMM KVM 构建,在安全性(硬件级隔离)与…

2026/7/9 8:05:18阅读更多 →
创业自动化平台怎么选

创业自动化平台怎么选

一、一人创业,最容易卡在任务切换与推进节奏 一人创业或独立开发,最大的痛点不是缺想法,而是缺人手、缺时间、缺连贯的推进节奏。从产品想法梳理、原型开发、客户沟通,到内容产出、数据复盘,所有环节都要自己扛。频繁…

2026/7/9 8:05:18阅读更多 →
V93000 WSMX板卡实战:16单元混合信号测试配置与4类测试头选型指南

V93000 WSMX板卡实战:16单元混合信号测试配置与4类测试头选型指南

V93000 WSMX板卡实战:16单元混合信号测试配置与4类测试头选型指南在半导体测试领域,V93000测试平台凭借其卓越的灵活性和扩展性,已成为众多芯片设计公司和测试厂商的首选。作为该平台的核心组件之一,Wave Scale MX(WSM…

2026/7/9 8:05:18阅读更多 →
自动化设备企业采购配件如何摆脱单一供货模式实现降本?2026 供应链管理参考

自动化设备企业采购配件如何摆脱单一供货模式实现降本?2026 供应链管理参考

在自动化设备制造和工厂运维领域,采购工程师和技术负责人常常被一个矛盾困扰:既要控制采购成本,又要保证多品种、小批量配件的及时供应。传统的单一供货模式,往往让你在“低价捆绑”和“灵活补货”之间进退两难。本文将拆解2026年…

2026/7/9 8:05:18阅读更多 →
3个常见场景:如何用Reset Windows Update Tool彻底解决Windows更新问题

3个常见场景:如何用Reset Windows Update Tool彻底解决Windows更新问题

3个常见场景:如何用Reset Windows Update Tool彻底解决Windows更新问题 【免费下载链接】Script-Reset-Windows-Update-Tool This script reset the Windows Update Components. 项目地址: https://gitcode.com/gh_mirrors/sc/Script-Reset-Windows-Update-Tool …

2026/7/9 8:05:18阅读更多 →
计算机毕业设计之吕梁学院校园一卡通系统的设计与实现

计算机毕业设计之吕梁学院校园一卡通系统的设计与实现

本论文主要论述了如何使用JSP技术开发一个吕梁学院校园一卡通系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述吕梁学院校园一卡通系统的当前背景以及系统开…

2026/7/9 8:00:18阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/8 7:00:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

2026/7/9 0:04:37阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/8 6:59:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/8 13:42:39阅读更多 →