• 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.示例代码:

    1. //接线引脚 MOSI PA5 SCK PA6 DC PA3 CS PA2
    2. #define CS_PIN 2
    3. #define CS_GPIO_PIN gpio_pin_2
    4. #define DC_PIN 3
    5. #define DC_GPIO_PIN gpio_pin_3
    6. #define RST_PIN 1
    7. #define RST_GPIO_PIN gpio_pin_1
    8. // #define SCK_PIN 5
    9. // #define MOSI_PIN 6
    10. #define SCK_PIN 6
    11. #define MOSI_PIN 5
    12. //#define SCK_GPIO_PIN gpio_pin_5
    13. //#define MOSI_GPIO_PIN gpio_pin_6
    14. /* 宏定义 --------------------------------------------------------------------*/
    15. #define MOSI MOSI_PIN
    16. #define SCK SCK_PIN
    17. #define DC DC_PIN
    18. #define CS CS_PIN
    19. #include "asr.h"
    20. extern "C"{ void * __dso_handle = 0 ;}
    21. #include "setup.h"
    22. #include "myLib/luxiaoban.h"
    23. #include "HardwareSerial.h"
    24. #include "../U8G2/u8g2.h"
    25. void hardware_init();
    26. void emo_class();
    27. void weather_class();
    28. //u8g2_t u8g2;
    29. /my init
    30. void ssd1306_spi_init()
    31. {
    32. pinMode(CS,output);
    33. pinMode(DC,output);
    34. //pinMode(RST_PIN,output);
    35. pinMode(SCK,output);
    36. pinMode(MOSI,output);
    37. }
    38. uint8_t u8x8_avr_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
    39. {
    40. // Re-use library for delays
    41. switch(msg)
    42. {
    43. //ms
    44. case U8X8_MSG_DELAY_MILLI:
    45. delay(1);
    46. break;
    47. //10 us
    48. case U8X8_MSG_DELAY_10MICRO:
    49. delay10us();
    50. break;
    51. //1 ns
    52. case U8X8_MSG_DELAY_NANO:
    53. delay1us();
    54. break;
    55. case U8X8_MSG_DELAY_100NANO:
    56. delay1us();
    57. break;
    58. case U8X8_MSG_GPIO_AND_DELAY_INIT: // called once during init phase of u8g2/u8x8
    59. ssd1306_spi_init();
    60. break; // can be used to setup pins
    61. case U8X8_MSG_GPIO_SPI_CLOCK: // Clock pin: Output level in arg_int
    62. if(arg_int)
    63. digitalWrite(SCK,1);
    64. else
    65. digitalWrite(SCK,0);
    66. break;
    67. case U8X8_MSG_GPIO_SPI_DATA: // MOSI pin: Output level in arg_int
    68. if(arg_int)
    69. digitalWrite(MOSI,1);
    70. else
    71. digitalWrite(MOSI,0);
    72. break;
    73. case U8X8_MSG_GPIO_CS: // CS (chip select) pin: Output level in arg_int
    74. if(arg_int)
    75. digitalWrite(CS,1);
    76. else
    77. digitalWrite(CS,0);
    78. break;
    79. case U8X8_MSG_GPIO_DC: // DC (data/cmd, A0, register select) pin: Output level in arg_int
    80. if(arg_int)
    81. digitalWrite(DC,1);
    82. else
    83. digitalWrite(DC,0);
    84. break;
    85. case U8X8_MSG_GPIO_RESET: // Reset pin: Output level in arg_int
    86. default:
    87. break;
    88. }
    89. return 1;
    90. }
    91. void u8g2Init(u8g2_t *u8g2)
    92. {
    93. u8g2_Setup_ssd1306_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_avr_gpio_and_delay);
    94. u8g2_InitDisplay(u8g2);
    95. u8g2_SetPowerSave(u8g2, 0);
    96. u8g2_ClearBuffer(u8g2);
    97. }
    98. class u8g2_class
    99. {
    100. public:
    101. u8g2_t u8g2;
    102. void u8g2_init()
    103. {
    104. u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_avr_gpio_and_delay);
    105. u8g2_InitDisplay(&u8g2);
    106. u8g2_SetPowerSave(&u8g2, 0);
    107. u8g2_ClearBuffer(&u8g2);
    108. }
    109. void sendBuffer(void) { u8g2_SendBuffer(&u8g2); }
    110. void clearBuffer(void) { u8g2_ClearBuffer(&u8g2); }
    111. u8g2_uint_t drawGlyph(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding) { return u8g2_DrawGlyph(&u8g2, x, y, encoding); }
    112. u8g2_uint_t drawGlyphX2(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding) { return u8g2_DrawGlyphX2(&u8g2, x, y, encoding); }
    113. void setColorIndex(uint8_t color_index) { u8g2_SetDrawColor(&u8g2, color_index); }
    114. void setFont(const uint8_t *font) {u8g2_SetFont(&u8g2, font); }
    115. void setFontMode(uint8_t is_transparent) {u8g2_SetFontMode(&u8g2, is_transparent); }
    116. void setBitmapMode(uint8_t is_transparent)
    117. { u8g2_SetBitmapMode(&u8g2, is_transparent); }
    118. void drawBitmap(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t cnt, u8g2_uint_t h, const uint8_t *bitmap)
    119. { u8g2_DrawBitmap(&u8g2, x, y, cnt, h, bitmap); }
    120. void drawXBM(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap)
    121. { u8g2_DrawXBM(&u8g2, x, y, w, h, bitmap); }
    122. void drawXBMP(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap)
    123. { u8g2_DrawXBMP(&u8g2, x, y, w, h, bitmap); }
    124. };

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

  • 相关阅读:
    【C++笔试强训】第二十三天
    消息中间件(MQ)
    使用QT的QML实时显示海康威视网络摄像头的视频数据
    JS测试出最小支持字体,以及修复PDFJS的文本错误偏移
    【MySql】Mysql之备份与恢复
    图解网络(三)——TCP篇04
    金仓数据库KingbaseES数据库管理员指南--15.1. 管理视图
    C++--智能指针--1123
    说说你对事件委托的理解?
    【编译原理】LL(1)文法
  • 原文地址:https://blog.csdn.net/qq_39239990/article/details/134094234