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

SSD1306 oled显示屏的驱动SPI接口

有IIC接口 和SPI接口 还有8080,6080接口等

arduino SPI接口

直接使用u8g2库实现

//U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

asrpro(SPI接口按下方修改,IIC接口官方有驱动)

1.下载U8g2库文件 GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2在D:\天问Block\asrpro\asr_pro_sdk\下新建  U8G2目录  将csrc目录下的所有文件复制到 U8G2目录下

2.将U8G2源文件与头文件添加到 d:\天问Block\asrpro\asr_pro_sdk\projects\offline_asr_sample\project_file\source_file.prj

使用source-file:U8G2/xx.c 添加U8G2下的所有c文件

include-path:U8G2 //添加头文件

3.示例代码:

//接线引脚  MOSI PA5    SCK PA6     DC PA3    CS PA2#define CS_PIN 2
#define CS_GPIO_PIN gpio_pin_2
#define DC_PIN 3
#define DC_GPIO_PIN gpio_pin_3
#define RST_PIN 1
#define RST_GPIO_PIN gpio_pin_1
// #define SCK_PIN 5
// #define MOSI_PIN 6
#define SCK_PIN 6
#define MOSI_PIN 5//#define SCK_GPIO_PIN gpio_pin_5
//#define MOSI_GPIO_PIN gpio_pin_6/* 宏定义 --------------------------------------------------------------------*/#define MOSI  MOSI_PIN
#define SCK SCK_PIN
#define DC DC_PIN
#define CS CS_PIN#include "asr.h"
extern "C"{ void * __dso_handle = 0 ;}
#include "setup.h"
#include "myLib/luxiaoban.h"
#include "HardwareSerial.h"
#include "../U8G2/u8g2.h"void hardware_init();
void emo_class();
void weather_class();//u8g2_t u8g2;/my initvoid ssd1306_spi_init(){pinMode(CS,output);pinMode(DC,output);//pinMode(RST_PIN,output);pinMode(SCK,output);pinMode(MOSI,output);}uint8_t u8x8_avr_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr){// Re-use library for delaysswitch(msg){//mscase U8X8_MSG_DELAY_MILLI:delay(1);break;//10 uscase U8X8_MSG_DELAY_10MICRO:delay10us();break;//1 nscase U8X8_MSG_DELAY_NANO:delay1us();break;case U8X8_MSG_DELAY_100NANO:delay1us();break;case U8X8_MSG_GPIO_AND_DELAY_INIT:  // called once during init phase of u8g2/u8x8ssd1306_spi_init();break;              // can be used to setup pinscase U8X8_MSG_GPIO_SPI_CLOCK:        // Clock pin: Output level in arg_intif(arg_int)digitalWrite(SCK,1);elsedigitalWrite(SCK,0);break;case U8X8_MSG_GPIO_SPI_DATA:        // MOSI pin: Output level in arg_intif(arg_int)digitalWrite(MOSI,1);elsedigitalWrite(MOSI,0);break;case U8X8_MSG_GPIO_CS:        // CS (chip select) pin: Output level in arg_intif(arg_int)digitalWrite(CS,1);elsedigitalWrite(CS,0);break;case U8X8_MSG_GPIO_DC:        // DC (data/cmd, A0, register select) pin: Output level in arg_intif(arg_int)digitalWrite(DC,1);elsedigitalWrite(DC,0);break;case U8X8_MSG_GPIO_RESET:     // Reset pin: Output level in arg_intdefault:break;}return 1;
}void u8g2Init(u8g2_t *u8g2)
{u8g2_Setup_ssd1306_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_avr_gpio_and_delay);u8g2_InitDisplay(u8g2);u8g2_SetPowerSave(u8g2, 0);u8g2_ClearBuffer(u8g2);
}class u8g2_class
{public:u8g2_t u8g2;void u8g2_init(){u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_avr_gpio_and_delay);u8g2_InitDisplay(&u8g2);u8g2_SetPowerSave(&u8g2, 0);u8g2_ClearBuffer(&u8g2);}void sendBuffer(void) { u8g2_SendBuffer(&u8g2); }void clearBuffer(void) { u8g2_ClearBuffer(&u8g2); }   u8g2_uint_t drawGlyph(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding) { return u8g2_DrawGlyph(&u8g2, x, y, encoding); }   u8g2_uint_t drawGlyphX2(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding) { return u8g2_DrawGlyphX2(&u8g2, x, y, encoding); }   void setColorIndex(uint8_t color_index) { u8g2_SetDrawColor(&u8g2, color_index); }void setFont(const uint8_t  *font) {u8g2_SetFont(&u8g2, font); }void setFontMode(uint8_t  is_transparent) {u8g2_SetFontMode(&u8g2, is_transparent); }void setBitmapMode(uint8_t is_transparent){ u8g2_SetBitmapMode(&u8g2, is_transparent); }void drawBitmap(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t cnt, u8g2_uint_t h, const uint8_t *bitmap){ u8g2_DrawBitmap(&u8g2, x, y, cnt, h, bitmap); }void drawXBM(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap){ u8g2_DrawXBM(&u8g2, x, y, w, h, bitmap); }void drawXBMP(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap){ u8g2_DrawXBMP(&u8g2, x, y, w, h, bitmap); }};

stm32arduino

stm32f103xx系列 arduino 下直接使用u8g2示列,不需设置引脚与时钟

添加:U8X8_SSD1306_128X64_NONAME_4W_SW_SPI u8x8(/* clock=*/ PA5, /* data=*/ PA7, /* cs=*/ PA4, /* dc=*/ PA6, /* reset=*/ PA3);

ESP32

未试验,应是同的

树莓派

使用luma.oled 库或是adafruit_ssd1306(python) adafruit_circuitpython_ssd1306

u8g2在树莓派中支持并不好,不推荐使用(暂时无办法)

https://github.com/rm-hull/luma.oled oled驱动程序

https://github.com/rm-hull/luma.examples 示列

详细介绍在文件目录下的README.rst中

执行以下命令进行安装

 1.$ sudo usermod -a -G i2c,spi,gpio pi  //【好像没什么用】
 2.$ sudo apt install python3-dev python3-pip python3-numpy libfreetype6-dev libjpeg-dev build-essential  //【安装依赖包,树莓派中好像已经有了】
 3.$ sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libportmidi-dev  //【安装依赖包,树莓派中好像已经有了】
 
 4.Log out and in again and clone this repository:: //【退出,重新进入】
 
 5.$ git clone https://github.com/rm-hull/luma.examples.git  //【在树莓中下载代码包】
 6.$ cd luma.examples 
 
 7.$ sudo -H pip install -e .  //【上述步骤完成后,执行些程序(跳过上面步骤直接执行此好像也可以,会出现下载错误,多次执行(注意 -e . 后面的点)】
运行方式: 进入luma.examples目录下 执行选择下列进行执行

使用SPI接口

python3 animated_gif.py --interface spi 或 -i spi

使用I2C 接口

python3 animated_gif.py --interface i2c 或 -i i2c

使用pygame 在桌面上显示

python3 tv_snow.py -d pygame

示列:

python3 3d_box.py -d pygame

luckfox

官方有驱动程序,使用oled示列修改

相关文章:

SSD1306 oled显示屏的驱动SPI接口

有IIC接口 和SPI接口 还有8080,6080接口等 arduino SPI接口 直接使用u8g2库实现 //U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock*/ 13, /* data*/ 11, /* cs*/ 10, /* dc*/ 9, /* reset*/ 8); asrpro(SPI接口按下方修改,IIC接口官方有驱动&…...

RSA:基于小加密指数的攻击方式与思维技巧

目录 目录 目录 零、前言 一、小加密指数爆破 [FSCTF]RSA签到 思路: 二、基于小加密指数的有限域开根 [NCTF 2019]easyRSA 思路: 三、基于小加密指数的CRT [0CTF 2016] rsa 思路: 零、前言 最近,发现自己做题思路比较…...

Vuex 和 Redux 的区别?

Vuex和Redux是两个流行的JavaScript状态管理库,它们有一些相似之处,但也有一些区别。 区别: 语言:Vuex是为Vue.js框架设计的,而Redux是一个独立的库,可用于多种JavaScript框架或库。生态系统:…...

软考高级系统架构师冲关预测

[ – 2023年10月27日 – ] 去年11月通过了软考高级系统架构师的考试,原本想立即分享下过关的总结回顾,但是随着软考新版大纲及教程的发布,也意味着题目及内容的复盘总结经验便不那么适用。在即将迎来今年的软考高架的时候,想着透…...

华为实验基础(1):交换机基础

一、交换机的分类 1、 根据交换方式划分: 存储转发式交换 (Store and Forward) 直通式交换 (Cut-through) 碎片过滤式交换 (Fragment Free) 2、 根据交换的协议层划分: 第二层交换:根据 MAC 地址进行交换 第三层交换&…...

bitlocker 加密锁定的固态硬盘,更换到别的电脑上,怎么把原密钥写进新电脑TPM芯片内,开启无需手动填密钥

环境: Win11 专业版 联想E14笔记本 512G ssd 问题描述: 一台笔记本因充电故障,需要拿去维修,不想重装系统,将bitlocker 加密锁定的固态硬盘拆下更换到别的笔记本电脑上,现在开机要手动填密钥,怎么把原密钥写进新电脑TPM芯片内,开启无需手动填密钥和之前那台电脑一…...

C语言之错误处理

在C语言中,错误处理是一种重要的编程技术,用于处理程序运行过程中可能出现的错误情况。C语言提供了几种处理错误的机制,包括返回错误码、使用全局变量、异常处理等。 1、返回错误码: 在函数执行过程中,如果发生错误&a…...

IO流框架,缓冲流

一.缓冲流有什么优点 Java中的缓冲流(Buffered Stream)具有以下优势: 提高效率:缓冲流通过在内存中缓存一部分数据,减少了直接从内存到磁盘或从磁盘到内存的频繁IO操作,从而提高了读写效率。缓冲区大小调整…...

数字音频工作站软件 Ableton Live 11 mac中文软件特点与功能

Ableton Live 11 mac是一款数字音频工作站软件,用于音乐制作、录音、混音和现场演出。它由Ableton公司开发,是一款极其流行的音乐制作软件之一。 Ableton Live 11 mac软件特点和功能 Comping功能:Live 11增加了Comping功能,允许用…...

【PyQt】调整子控件的层级以调整绘制的先后顺序

简述 qt中貌似没有直接设置z序的函数,但对应的有其他调整z序的方法: QWidget.raise_():置顶 QWidget.lower():置底 QWidget.stackUnder(wid):置于指定控件之下 其中关键函数是QWidget.stackUnder(wid),利…...

js中数组的相关方法

引言: 数组(Array)是有序的元素序列。 [1]若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量 方法: push()…...

深入浅出排序算法之直接插入排序(拓展:折半插入排序)

目录 1. 图示解析 2. 原理解析 3. 代码实现 4. 性能分析 5. 折半插入排序(拓展) 直接插入排序和选择排序的第一趟就是第一个关键字 ! 1. 图示解析 2. 原理解析 整个区间被分为:① 有序区间;② 无序区间 每次选…...

皮卡丘RCE靶场通关攻略

皮卡丘RCE靶场通关攻略 文章目录 皮卡丘RCE靶场通关攻略RCE(remote command/code execute)概述远程系统命令执行启动环境漏洞练习第一关exec "ping"第二关 exec "eval" RCE(remote command/code execute)概述 RCE漏洞,可以让攻击者直接向后台服…...

Mysql binlog日志功能使用,简单易懂

一、简单了解binlog MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select)。因此binlog日志文件我们用cat等查看文件的命令是打不开的,但是mysql提供了专门看binlog文件的命令…...

计算机视觉-光源的目的和作用

光源的目的 机器视觉系统的核心是图像采集和图像处理,而光源则是影响图像水平的重要因素,通过适当的光源照明,使图像中的目标信息与背景信息得到更好的分离,可大大降低图像识别难度,提高系统的精度和可靠性。 对于机器…...

源码角度分析Java 循环中删除数据为什么会报异常

一、源码角度分析Java 循环中删除数据为什么会报异常 相信大家在之前或多或少都知道 Java 中在增强 for中删除数据会抛出:java.util.ConcurrentModificationException 异常,例如:如下所示程序: public class RmTest {public sta…...

leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间

229. 多数元素 II - 力扣(LeetCode) 给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。 (1)哈希表 class …...

5 个编写高效 Makefile 文件的最佳实践

在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署。然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高我们的开发…...

20231028刷题记录

P3381 【模板】最小费用最大流 Portal. sol. 注意 SPFA 找最小费用增广路时不要到终点就返回,因为到终点的路径可能有多条不能确定哪条是费用最小的。 P2740 [USACO4.2] 草地排水Drainage Ditches Portal. 最大流模板。 注意区分 N , M N,M N,M。 CF609D G…...

39 深度学习(三):tensorflow.data模块的使用(基础,可跳)

文章目录 data模块的使用基础api的介绍csv文件tfrecord data模块的使用 在训练的过程中,当数据量一大的时候,我们纯读取一个文件,然后每次训练都调用相同的文件,然后进行处理是很不科学的,或者说,当我们需…...

实时控制系统中VoU传输优化框架的设计与实践

1. 实时控制系统的网络传输挑战 在工业物联网和网络化控制系统中,传感器、控制器和执行器之间的实时数据传输质量直接影响整个系统的控制性能。传统控制系统通常假设通信链路是理想的——零延迟、无丢包且带宽无限。然而在实际无线多跳网络环境中,这种假…...

结构可识别性映射:破解模型不可识别下的时间序列分类难题

1. 项目概述:当模型“看不清”时,如何让分类器“看得清”?在生物医学、工业过程监控等领域,我们常常面对这样的场景:你有一堆传感器记录下的时间序列数据,比如病人的心率变化、反应器内的温度波动&#xff…...

聚合芘环石墨炔:机器学习模拟揭示新型二维碳负极材料的储锂潜力

1. 项目概述:从石墨烯到PolyPyGY,二维碳负极材料的进阶之路在锂离子电池这个已经相当成熟的领域里,负极材料的创新一直是推动能量密度和功率密度突破的关键。从早期的石墨,到后来的硅基材料,再到如今备受瞩目的二维材料…...

从博弈论到可解释AI:Shapley值及其交互指数的原理与应用

1. 从博弈论到可解释AI:理解Shapley值的核心思想在机器学习模型日益复杂的今天,理解一个模型为何做出某个预测,其重要性不亚于模型本身的性能。想象一下,你训练了一个精准的房价预测模型,当它判断某套房子价值500万时&…...

从哈密顿量到李代数:对称性识别与结构常数计算实践

1. 从哈密顿量到李代数:物理学家工具箱里的对称性语言在理论物理和数学物理的日常工作中,我们常常面对一个核心问题:如何从一堆看似复杂的运动方程或一个写出来的哈密顿量中,快速识别出系统隐藏的“灵魂”?这个灵魂&am…...

健身行业AI Agent部署失败率高达68%?(2024真实数据复盘与5步合规上线法)

更多请点击: https://intelliparadigm.com 第一章:健身行业AI Agent部署失败率高达68%?——2024真实数据复盘与5步合规上线法 2024年Q2《中国智能健身系统落地白皮书》抽样调研覆盖全国137家连锁健身房及SaaS服务商,结果显示&…...

准最优最小二乘框架:破解PDE非齐次边界数值求解难题

1. 项目概述:当最小二乘遇上非齐次边界——一个准最优框架的构建在偏微分方程(PDE)的数值求解领域,最小二乘法一直以其数学上的优雅和稳定性吸引着研究者。其核心思想直白而有力:将微分方程问题转化为一个最小化残差范…...

Keil µVision项目复制后构建失败的诊断与解决

1. 问题现象与背景解析最近在Keil Vision开发环境中遇到一个典型的"项目复制后构建失败"问题:将一个原本正常编译的C语言项目复制到新目录后,仅做了少量修改,却突然出现error (40): expected an identifier or (的语法错误。这种情…...

《Java 基础必学:ArrayList、HashMap 和泛型详解》

一、引言 1.为什么这些是 Java 基础的重点? ArrayList、HashMap 和泛型是Java集合框架的核心组成部分,广泛应用于实际开发中。 ArrayList:基于动态数组实现,支持快速随机访问,适合频繁查询和遍历的场景。HashMap&…...

数据可视化:交互式图表与大屏展示

数据可视化:交互式图表与大屏展示 大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊数据可视化这个重要话题。作为一个全栈开发者,数据可视化是将数据转化为有意义信息的关键。今天就来分享一下交互式图表和大屏展示的实…...