SSD1306 oled显示屏的驱动SPI接口

news2024/12/23 14:57:21

有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 init
  void 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 delays

        switch(msg)
        {
          //ms
                case U8X8_MSG_DELAY_MILLI:
        delay(1);
      break;
     
      //10 us
      case U8X8_MSG_DELAY_10MICRO:
        delay10us();
      break;
     
      //1 ns
           case 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/u8x8
        ssd1306_spi_init();
                       break;              // can be used to setup pins
               case U8X8_MSG_GPIO_SPI_CLOCK:        // Clock pin: Output level in arg_int
                       if(arg_int)
                               digitalWrite(SCK,1);
                       else
                               digitalWrite(SCK,0);
                       break;
               case U8X8_MSG_GPIO_SPI_DATA:        // MOSI pin: Output level in arg_int
                       if(arg_int)
                               digitalWrite(MOSI,1);
                       else
                               digitalWrite(MOSI,0);
                       break;
               case U8X8_MSG_GPIO_CS:        // CS (chip select) pin: Output level in arg_int
                       if(arg_int)
                               digitalWrite(CS,1);
                       else
                               digitalWrite(CS,0);
                       break;
               case U8X8_MSG_GPIO_DC:        // DC (data/cmd, A0, register select) pin: Output level in arg_int
      if(arg_int)
                               digitalWrite(DC,1);
                       else
                               digitalWrite(DC,0);
                       break;
              
               case U8X8_MSG_GPIO_RESET:     // Reset pin: Output level in arg_int

               default:
                 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示列修改

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

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

相关文章

环形链表(C++解法)

题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

Vmware下的虚拟机NAT连接后仍然木有网络

问题描述 出现在主机能ping通,互联网ping不通的情况。 废话 假设已经设置了网络配置文件IPADDR。 那么,NAT后可以访问互联网的前提是:这个IPADDR的网段在Vmware软件设置的网段内。 解决 在Vmware虚拟网络设置选项卡中,进NAT配…

10000字!图解机器学习特征工程

文章目录 引言特征工程1.特征类型1.1 结构化 vs 非结构化数据1.2 定量 vs 定性数据 2.数据清洗2.1 数据对齐2.2 缺失值处理 原文链接:https://www.showmeai.tech/article-detail/208 作者:showmeAI 引言 上图为大家熟悉的机器学习建模流程图,…

TYWZOJ 礼品配对包装 题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示思路与部分实现完整代码 题目描述 爱与愁大神在这家目标店买了 2 x 2x 2x 份礼物,打算分给班级同学。其中有 x x x 份黑礼品, x x x 份白礼品, 2 x 2 2x2 2x2 个空…

计网小题题库整理第一轮(面向期末基础)(3)

基础选择题的最后一章更新,看完期末75至少没问题~ 前情提要: 计网小题题库整理第一轮(12期) 一.选择题 1、 目前,最流行的以太网组网的拓扑结构是( C )。 A) 总线结构 B) 环…

如何能够在发现问题和提问的时候一并带出自己的解决方案

1. 充分理解问题: 在提出问题之前,确保你已经完全理解了问题的本质。从不同的角度分析问题,确保没有遗漏任何重要的信息或者上下文。 2. 进行自我调查和研究: 在向他人寻求帮助之前,尝试自己解决问题。利用网络资源…

Go学习第十三章——Gin(入门与路由)

Go web框架——Gin(入门与路由) 1 Gin框架介绍1.1 基础介绍1.2 安装Gin1.3 快速使用 2 路由2.1 基本路由GET请求POST请求 2.2 路由参数2.3 路由分组基本分组带中间件的分组 2.4 重定向 1 Gin框架介绍 github链接:https://github.com/gin-gon…

从零开始搭建Prometheus+grafana服务器组件监控系统

服务器及相关组件监控 本文档主要记录了常用企业级服务器及各种组件的监控手段和监控部署方案,使企业可以实时感知服务器组件的健康状态,并在服务器或组件出现异常时及时做出反应。 本方案采用的Prometheusgrafana的方式实现对服务器及各种组件的监控&am…

【前端】NodeJS核心知识点整理

1.Node.js入门案例 1.1.什么是Node.js JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。 每一种解析器都是一个运行环境,不但…

C/C++数据结构之深入了解线性表:顺序表、单链表、循环链表和双向链表

线性表是一种基本的数据结构,它在计算机科学中起着至关重要的作用。线性表用于存储一系列具有相同数据类型的元素,这些元素之间存在顺序关系。在C/C中,我们可以使用各种方式来实现线性表,其中包括顺序表、单链表、循环链表和双向链…

基于白鲸优化算法BWO优化的VMD-KELM光伏发电短期功率预测MATLAB代码(含详细算法介绍)

微❤关注“电气仔推送”获得资料(专享优惠) VMD适用于处理非线性和非平稳信号,例如振动信号、生物信号、地震信号、图像信号等。它在信号处理、振动分析、图像处理等领域有广泛的应用,特别是在提取信号中的隐含信息和去除噪声方面…

无头浏览器自动化:Puppeteer 帮你释放效能 | 开源日报 No.64

facebook/react Stars: 209.5k License: MIT React是一个用于构建用户界面的JavaScript库。它具有以下优势和特点: 声明式:React使得创建交互式UI变得轻松。您可以为应用程序中的每个状态设计简单视图,当数据发生更改时,React会…

Postman日常操作

一.Postman介绍 1.1第一个简单的demo 路特斯(英国汽车品牌)_百度百科 (baidu.com) 1.2 cookie 用postman测试需要登录权限的接口时,会被拦截,解决办法就是每次请求接口前,先执行登录,然后记住cookie或者to…

ChineseChess5 2023.10.28

中国象棋残局:黑双卒单车压境解棋

iphone备份后怎么转到新手机,iphone备份在哪里查看

iphone备份会备份哪些东西?iphone可根据需要备份设备数据、应用数据、苹果系统等。根据不同的备份数据,可备份的数据类型不同,有些工具可整机备份,有些工具可单项数据备份。本文会详细讲解苹果手机备份可以备份哪些东西。 一、ip…

婚礼的魅力

昨日有幸被邀请去当伴郎,虽然是替补,即别人鸽了,过去救急,但总归是去起作用。 婚礼的魅力,感受到了,满满的仪式感,紧凑的流程,还有不断的拍照,做视频,留下美好…

接口测试到底怎么做,5分钟时间看完这篇文章彻底搞清楚

01、通用的项目架构 02、什么是接口 接口:服务端程序对外提供的一种统一的访问方式,通常采用HTTP协议,通过不同的url,不同的请求类型(GET、POST),不同的参数,来执行不同的业务逻辑。…

2.Vue — 模板语法、数据绑定、el与data的写法、数据代理

文章目录 一、模板语法1.1 插值语法1.2指令语法 二、数据绑定语法2.1 单向数据绑定2.2 双向数据绑定 三、el与data的两种写法3.1 el3.2 data 四、数据代理4.1 Object.defineProperty4.2 Vue数据代理4.2.1 展示数据代理4.2.2 Vue数据代理 一、模板语法 root容器里面的代码被称为…

Ajax学习笔记第二天

喜欢的东西太贵了,我一咬牙,狠下心决定不喜欢了! 【一.GET请求】 【1.1 URL即信息】 我们知道php的相关运算都是在服务器端进行的,此时我们要考虑一个问题,如何将要计算的数字带给服务器?我们可以通过UR…

如何能在项目具体编码实现之前能尽可能早的发现问题并解决问题

在项目的具体编码实现之前尽可能早地发现并解决问题,可以大大节省时间和资源,提高项目的成功率。以下是一些策略和方法: 1. 明确需求和预期: 确保所有的项目需求都是清晰和明确的。需求模糊不清是项目失败的常见原因之一。与利益…