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

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 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.kler.cn/a/107447.html

相关文章:

  • ES6字符串的新增方法
  • ESLint 使用教程(五):ESLint 和 Prettier 的结合使用与冲突解决
  • python解析网页上的json数据落地到EXCEL
  • Android 10 默认授权安装app运行时权限(去掉运行时所有权限授权弹窗)
  • redis bind 127.0.0.1和bind 10.34.56.78的区别
  • HBase使用create创建表时报错ERROR: KeeperErrorCode = NoNode for /hbase/master
  • verilog vscode linux
  • 用示例和应用程序了解必要的Golang库
  • 浅谈分布式系统
  • 城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研
  • spring boot利用redis作为缓存
  • ArcGIS中批量mxd高版本转低版本
  • 自定义命名并将文件扩展名改为大写字母,轻松掌握文件管理!
  • S7-200 SMART与ABB ACS580变频器进行MODBUS RTU通信的具体方法示例
  • 三篇论文:速览GPT在网络安全最新论文中的应用案例
  • Debezium日常分享系列之:Debezium2.4版本之用于 MongoDB的Debezium 连接器
  • 【C++初阶(三)】引用内联函数auto关键字
  • 我的创作纪念日 - 2048
  • 基础课11——数据来源
  • MyBatisPlus创建新的Mapper.xml映射文件而不使用框架自带的?
  • 【axios】axios的基本使用
  • Ubuntu 22.04 安装 Terraform
  • 嵌入式1.1 单片机基础总结
  • iphone备份后怎么转到新手机,iphone备份在哪里查看
  • 【MATLAB源码-第59期】基于matlab的QPSK,16QAM164QAM等调制方式误码率对比,调制解调函数均是手动实现未调用内置函数。
  • 设计模式(19)命令模式