TB作品】51单片机 Proteus仿真 51单片机SPI显示OLED字符驱动

在这里插入图片描述

// GND 电源地
// VCC 接5V或3.3v电源
// D0 P1^4(SCL)
// D1 P1^3(SDA)
// RES 接P12
// DC 接P11
// CS 接P10

OLED显示接口与控制实验报告

背景

OLED(有机发光二极管)显示器由于其高对比度、低功耗和快速响应时间,被广泛应用于各种电子设备。本实验旨在使用单片机接口和控制OLED显示器。所用的显示驱动器是SSD1306,这是小型OLED屏幕常用的控制器。

硬件组件

  1. OLED显示器:使用由SSD1306控制器驱动的显示模块。
  2. 单片机:使用基于8051的单片机来控制OLED显示器。
  3. 电源:需要3.3V或5V电源为OLED模块供电。
  4. 连接线:用于将OLED与单片机连接。

电路连接

  • GND:连接到电源地。
  • VCC:连接到3.3V或5V电源。
  • D0 (SCL):连接到P1^4(SCL)。
  • D1 (SDA):连接到P1^3(SDA)。
  • RES:连接到P12。
  • DC:连接到P11。
  • CS:连接到P10。

设计原理

显存结构

OLED的显存存放格式如下:

[0]0 1 2 3 ... 127
[1]0 1 2 3 ... 127
[2]0 1 2 3 ... 127
...
[7]0 1 2 3 ... 127

延时函数

void delay_ms1(unsigned int ms) {unsigned int a;while (ms) {a = 80;while (a--);ms--;}return;
}

该延时函数通过简单的循环实现毫秒级延时,用于在OLED初始化和控制过程中确保操作稳定。

写入字节

根据不同的OLED模式,通过并行或串行接口向SSD1306写入字节。以下代码展示了并行和串行模式下的写入操作:

#if OLED_MODE == 1
// 并行模式
void OLED_WR_Byte(u8 dat, u8 cmd) {DATAOUT(dat);if (cmd) OLED_DC_Set();else OLED_DC_Clr();OLED_CS_Clr();OLED_WR_Clr();OLED_WR_Set();OLED_CS_Set();OLED_DC_Set();
}
#else
// 串行模式
void OLED_WR_Byte(u8 dat, u8 cmd) {u8 i;if (cmd) OLED_DC_Set();else OLED_DC_Clr();OLED_CS_Clr();for (i = 0; i < 8; i++) {OLED_SCLK_Clr();if (dat & 0x80) OLED_SDIN_Set();else OLED_SDIN_Clr();OLED_SCLK_Set();dat <<= 1;}OLED_CS_Set();OLED_DC_Set();
}
#endif

主要功能实现

设置光标位置
void OLED_Set_Pos(unsigned char x, unsigned char y) {OLED_WR_Byte(0xb0 + y, OLED_CMD);OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);OLED_WR_Byte((x & 0x0f) | 0x01, OLED_CMD);
}
显示控制

开启和关闭OLED显示:

void OLED_Display_On(void) {OLED_WR_Byte(0X8D, OLED_CMD); // SET DCDC命令OLED_WR_Byte(0X14, OLED_CMD); // DCDC ONOLED_WR_Byte(0XAF, OLED_CMD); // DISPLAY ON
}void OLED_Display_Off(void) {OLED_WR_Byte(0X8D, OLED_CMD); // SET DCDC命令OLED_WR_Byte(0X10, OLED_CMD); // DCDC OFFOLED_WR_Byte(0XAE, OLED_CMD); // DISPLAY OFF
}
清屏
void OLED_Clear(void) {u8 i, n;for (i = 0; i < 8; i++) {OLED_WR_Byte(0xb0 + i, OLED_CMD); // 设置页地址(0~7)OLED_WR_Byte(0x00, OLED_CMD);     // 设置显示位置—列低地址OLED_WR_Byte(0x10, OLED_CMD);     // 设置显示位置—列高地址for (n = 0; n < 128; n++) OLED_WR_Byte(0, OLED_DATA);}
}
显示字符

在指定位置显示一个字符:

void OLED_ShowChar(u8 x, u8 y, u8 chr) {unsigned char c = 0, i = 0;c = chr - ' ';if (x > Max_Column - 1) {x = 0; y = y + 2;}if (SIZE == 16) {OLED_Set_Pos(x, y);for (i = 0; i < 8; i++) OLED_WR_Byte(F8X16[c * 16 + i], OLED_DATA);OLED_Set_Pos(x, y + 1);for (i = 0; i < 8; i++) OLED_WR_Byte(F8X16[c * 16 + i + 8], OLED_DATA);} else {OLED_Set_Pos(x, y + 1);for (i = 0; i < 6; i++) OLED_WR_Byte(F6x8[c][i], OLED_DATA);}
}
显示字符串
void OLED_ShowString(u8 x, u8 y, u8 *chr) {unsigned char j = 0;while (chr[j] != '\0') {OLED_ShowChar(x, y, chr[j]);x += 8;if (x > 120) {x = 0; y += 2;}j++;}
}

初始化

OLED的初始化过程涉及一系列的配置命令,以确保显示器正确工作:

void OLED_Init(void) {OLED_RST_Set();delay_ms1(100);OLED_RST_Clr();delay_ms1(100);OLED_RST_Set();OLED_WR_Byte(0xAE, OLED_CMD); // 关闭OLED面板OLED_WR_Byte(0x00, OLED_CMD); // 设置低列地址OLED_WR_Byte(0x10, OLED_CMD); // 设置高列地址OLED_WR_Byte(0x40, OLED_CMD); // 设置起始行地址OLED_WR_Byte(0x81, OLED_CMD); // 设置对比度控制寄存器OLED_WR_Byte(0xCF, OLED_CMD); // 设置SEG输出电流亮度OLED_WR_Byte(0xA1, OLED_CMD); // 设置段/列映射OLED_WR_Byte(0xC8, OLED_CMD); // 设置COM/行扫描方向OLED_WR_Byte(0xA6, OLED_CMD); // 设置正常显示OLED_WR_Byte(0xA8, OLED_CMD); // 设置多路复用比率OLED_WR_Byte(0x3f, OLED_CMD); // 1/64 dutyOLED_WR_Byte(0xD3, OLED_CMD); // 设置显示偏移OLED_WR_Byte(0x00, OLED_CMD); // 不偏移OLED_WR_Byte(0xd5, OLED_CMD); // 设置显示时钟分频比/振荡频率OLED_WR_Byte(0x80, OLED_CMD); // 设置时钟为100帧/秒OLED_WR_Byte(0xD9, OLED_CMD); // 设置预充电周期OLED_WR_Byte(0xF1, OLED_CMD); // 设置预充电为15时钟和放电为1时钟OLED_WR_Byte(0xDA, OLED_CMD); // 设置COM引脚硬件配置OLED_WR_Byte(0x12, OLED_CMD);OLED_WR_Byte(0xDB, OLED_CMD); // 设置VCOMHOLED_WR_Byte(0x40, OLED_CMD); // 设置VCOM解除电平OLED_WR_Byte(0x20, OLED_CMD); // 设置页地址模式OLED_WR_Byte(0x02, OLED_CMD);OLED_WR_Byte(0x8D, OLED_CMD); // 设置电荷泵使能/禁用OLED_WR_Byte(0x14, OLED_CMD); // 设置(0x10)禁用OLED_WR_Byte(0xA4, OLED_CMD); // 禁用整个显示OLED_WR_Byte(0xA6, OLED_CMD); // 禁用反向显示OLED_WR_Byte(0xAF, OLED_CMD); // 打开OLED面板OLED_Clear();OLED_Set_Pos(0, 0);
}

资料

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

最新版Python安装教程

一、安装Python 1.下载Python 访问Python官网&#xff1a; https:/www.oython.orgl 点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS./Linux等) 选择下载最新稳定版本的Python 以下内容以演示安装Windows操作系统64位的python 左边是稳定发布版本Stabl…

Linux权限概述

一、权限概述 1.权限的基本概念 2.为什么要设置权限 3.linux用户的身份类别 4.user文件的拥有者 5.group文件所属组内用户 6.other其他用户 7.特殊用户root 二、普通权限管理 1.ls -l查看文件权限 2.文件类型以及权限解析 3.文件或文件夹的权限设置 4.通过数字给文件…

CSRF verification failed. Request aborted.

最近在学习django&#xff0c;遇到这个问题。CSRF verification failed. Request aborted. 解决方案&#xff1a; 1、在Html template中加入csrf_token 2、在view.py中对应的view函数上加上装饰器 再启动运行&#xff0c;报错就解决了。

网页生成二维码、在线演示

https://andi.cn/page/621504.html

Zabbix监控软件

目录 一、什么是Zabbix 二、zabbix监控原理 三、zabbix 安装步骤 一、什么是Zabbix ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的…

通信协议_Modbus协议简介

概念介绍 Modbus协议&#xff1a;一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气Schneider Electric&#xff09;于1979年为使用可编程逻辑控制器&#xff08;PLC&#xff09;通信而发表。Modbus已经成为工业领域通信协议的业界标准&#xff08;De f…

ARM架构和Intel x86架构

文章目录 1. 处理器架构 2. ARM架构 3. Intel x86架构 4. 架构对比 5. 编译过程对比 1. 处理器架构 处理器架构是指计算机处理器的设计和组织方式&#xff0c;它决定了处理器的性能、功耗和功能特性。处理器架构影响着从计算机系统的硬件设计到软件开发的各个方面。在现代…

@[TOC](六、数据可视化—Echars(爬虫及数据可视化))

六、数据可视化—Echars&#xff08;爬虫及数据可视化&#xff09; Echarts应用 Echarts Echarts官网&#xff0c;很多图表等都是我们可以 https://echarts.apache.org/zh/index.html 是百度自己做的图表&#xff0c;后来用的人越来越多&#xff0c;捐给了orange组织&#xf…

【ROS2】初级:客户端-创建自定义 msg 和 srv 文件

目标&#xff1a;定义自定义接口文件&#xff08; .msg 和 .srv &#xff09;并将它们与 Python 和 C节点一起使用。 教程级别&#xff1a;初学者 时间&#xff1a;20 分钟 目录 背景 先决条件 任务 1. 创建一个新包2. 创建自定义定义3 CMakeLists.txt4 package.xml5. 构建 tut…

Vue3中生成本地pdf并下载

1. 前言 前端中经常会遇到在系统中根据数据导出一个pdf文件出来,一般都是后端来实现的,既然后端可以实现,前端为什么就不行呢,正好有一次也写了这个需求,就写了个小demo 示例图: 2. 实现步骤 首先下载html2pdf.js这个库yarn add html2pdf.js // 或 npm i html2pdf.js在项…

下载,连接mysql数据库驱动(最详细)

前言 本篇博客&#xff0c;我讲讲如何连接数据库&#xff1f;我使用mysql数据库举例。 目录 下载对应的数据库jar 包 百度网盘 存有8.4.0版本压缩包&#xff1a;链接&#xff1a;https://pan.baidu.com/s/13uZtXRmuewHRbXaaCU0Xsw?pwduipy 提取码&#xff1a;uipy 复制这…

数据结构--二叉树和堆

目录 1.基本概念 2.树的遍历方法 3.满二叉树&&完全二叉树 4.逻辑结构&&物理结构 5.推理公式 6.二叉树应用--堆 7.简单实现堆 1.基本概念 &#xff08;1&#xff09;这个里面的概念还是比较多的&#xff0c;但是大部分我们只需要了解即可&#xff0c;因为…

论文略读:Large Language Models Relearn Removed Concepts

通过神经元修剪在模型编辑方面取得的进展为从大型语言模型中去除不良概念提供了希望。 然而&#xff0c;目前尚不清楚在编辑后模型是否具有重新学习修剪概念的能力——>论文通过在重新训练期间跟踪修剪神经元中的概念显著性和相似性来评估模型中的概念重新学习 研究结果表明…

嵌入式C语言面试相关知识——内存管理(不定期更新)

嵌入式C语言面试相关知识——内存管理&#xff08;不定期更新&#xff09; 一、博客声明二、自问题目1、嵌入式系统的内存布局是怎么样的&#xff1f;2、动态内存分配在嵌入式系统中的使用有什么注意事项&#xff1f;3、什么是内存碎片&#xff0c;如何减少内存碎片&#xff1f…

论文复现-基于决策树算法构建银行贷款审批预测模型(金融风控场景)

作者Toby&#xff0c;来源公众号&#xff1a;Python风控模型&#xff0c;基于决策树算法构建银行贷款审批预测模型 目录 1.金融风控论文复现 2.项目背景介绍 3.决策树介绍 4.数据集介绍 5.合规风险提醒 6.技术工具 7.实验过程 7.1导入数据 7.2数据预处理 7.3数据可…

Linux muduo 网络库

主要记录示意图和知识点框架&#xff1a; 1、阻塞、非阻塞、同步、异步 在处理IO的时候&#xff0c;阻塞和非阻塞都是同步IO&#xff0c;只有使用了特殊的API才是异步IO。 2、五种IO模型&#xff1a; 阻塞、非阻塞、IO复用、信号驱动、异步IO 3、muduo网络库 muduo网络库给用…

搭建基础库~

前言 项目中会用到工具库、函数库以及一些跟框架绑定的组件&#xff0c;如果这些基础模块每个项目都实现一套&#xff0c;维护起来那真的头大&#xff0c;你说呢&#x1f609; 搭建流程 准备工作 创建文件夹myLib、安装Git以及pnpm 目录大概就系这样子&#xff1a; myLib ├…

哈希表——C语言

哈希表&#xff08;Hash Table&#xff09;是一种高效的数据结构&#xff0c;能够在平均情况下实现常数时间的查找、插入和删除操作。 哈希表的核心是哈希函数&#xff0c;哈希函数是一个将输入数据&#xff08;通常称为“键”或“key”&#xff09;转换为固定长度的整数的函数…

python操作SQLite3数据库进行增删改查

python操作SQLite3数据库进行增删改查 1、创建SQLite3数据库 可以通过Navicat图形化软件来创建: 2、创建表 利用Navicat图形化软件来创建: 存储在 SQLite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型: NULL. 值是空值。 INTEGER. 值是有符…

刷爆leetcode第十期

题目一 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 首先我们要来判断下它们的根是否相等 根相等的话是否它们的左子树相等 是否…