[活动专区] 【AT-START-F425测评】+ 驱动SSD1306

[复制链接]
1297|4
 楼主| yinwuqing110 发表于 2022-3-7 22:45 | 显示全部楼层 |阅读模式
本帖最后由 yinwuqing110 于 2022-3-7 23:05 编辑

      相信大家对SSD1306并不陌生,它在嵌入式产品应用比较广泛。SSD1306是一个单片CMOS OLED/PLED驱动芯片可以驱动有机/聚合发光二极管点阵图形显示系统。该芯片专为共阴极OLED面板设计。SSD1306中嵌入了对比控制器、显示RAM和晶振,并因此减少了外部器件和功耗。有256级亮度控制。数据/命令的发送有三种接口可选择:6800/8000串口,IIC接口或SPI接口。适用于多数简介的应用,可应用在录音笔,MP3播放器和计算器等产品上。
      在AT-START-F425 V1.0的开发板上,有一处管脚的布局可以与IIC接口型的OLED模块无缝连接,无需通过杜邦线连接。从顶层点位图及原理图可知,J3的第9脚连接着GPIOB9,为SDA信号引脚;J3的第10脚连接着GPIOB8,为SCL信号引脚。
管脚位置.png
Arduino UNO R3扩展接口.png
       而我们常用的IIC接口型的OLED模块,引脚从左至右的封装为SDA、SCL、VCC、GND,因此在代码中只需将SDA与SCL的管脚定义调换过来即可正常驱动。接下来在昨天创建的点灯工程中,添加驱动SSD1306的应用代码。在OLED屏上显示中文字符或者BMP图片,这里需要借助“PCtoLCD2002”取字模软件,见如下附件。
OLE显示屏专用取模工具_PCtoLCD2002.rar (701.79 KB, 下载次数: 2)
部分参考代码如下:
  1. #ifndef __OLED_H
  2. #define __OLED_H

  3. #include "at32f425_board.h"
  4. #include "stdlib.h"         
  5. #include "stdint.h"

  6. #define OLED_MODE 0
  7. #define SIZE 8
  8. #define XLevelL                0x00
  9. #define XLevelH                0x10
  10. #define Max_Column        128
  11. #define Max_Row                64
  12. #define        Brightness        0xFF
  13. #define X_WIDTH         128
  14. #define Y_WIDTH         64                                                              

  15. #define OLED_SCLK_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_9)//SCL
  16. #define OLED_SCLK_Set() gpio_bits_set(GPIOB,GPIO_PINS_9)

  17. #define OLED_SDIN_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_8)//SDA
  18. #define OLED_SDIN_Set() gpio_bits_set(GPIOB,GPIO_PINS_8)
  19.                      
  20. #define OLED_CMD  0
  21. #define OLED_DATA 1

  22. typedef uint32_t  u32;
  23. typedef uint16_t u16;
  24. typedef uint8_t  u8;

  25. void OLED_Init(void);
  26. void OLED_Clear(void);
  27. void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);        
  28. void OLED_ShowCHinese(u8 x,u8 y,u8 no);
  29. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
  30. #endif  
  31.          
  1. #include "oled.h"
  2. #include "stdlib.h"
  3. #include "at32f425.h"
  4. #include "oledfont.h"           

  5. void IIC_Start()
  6. {
  7.         OLED_SCLK_Set();
  8.         OLED_SDIN_Set();
  9.         OLED_SDIN_Clr();
  10.         OLED_SCLK_Clr();
  11. }

  12. void IIC_Stop()
  13. {
  14.         OLED_SCLK_Set() ;
  15.         OLED_SCLK_Clr();
  16.         OLED_SDIN_Clr();
  17.         OLED_SDIN_Set();
  18. }

  19. void IIC_Wait_Ack()
  20. {
  21.         OLED_SCLK_Set() ;
  22.         OLED_SCLK_Clr();
  23. }

  24. void Write_IIC_Byte(unsigned char IIC_Byte)
  25. {
  26.         unsigned char i;
  27.         unsigned char m,da;
  28.         da=IIC_Byte;
  29.         OLED_SCLK_Clr();
  30.         for(i=0;i<8;i++)               
  31.         {
  32.                         m=da;
  33.                 m=m&0x80;
  34.                 if(m==0x80)
  35.                 {OLED_SDIN_Set();}
  36.                 else OLED_SDIN_Clr();
  37.                         da=da<<1;
  38.                 OLED_SCLK_Set();
  39.                 OLED_SCLK_Clr();
  40.                 }
  41. }

  42. void Write_IIC_Command(unsigned char IIC_Command)
  43. {
  44.    IIC_Start();
  45.    Write_IIC_Byte(0x78);
  46.    IIC_Wait_Ack();        
  47.    Write_IIC_Byte(0x00);
  48.    IIC_Wait_Ack();        
  49.    Write_IIC_Byte(IIC_Command);
  50.    IIC_Wait_Ack();        
  51.    IIC_Stop();
  52. }

  53. void Write_IIC_Data(unsigned char IIC_Data)
  54. {
  55.    IIC_Start();
  56.    Write_IIC_Byte(0x78);
  57.    IIC_Wait_Ack();        
  58.    Write_IIC_Byte(0x40);
  59.    IIC_Wait_Ack();        
  60.    Write_IIC_Byte(IIC_Data);
  61.    IIC_Wait_Ack();        
  62.    IIC_Stop();
  63. }
  1. #include "at32f425_board.h"
  2. #include "oled.h"
  3. #include "bmp.h"

  4. int main(void)
  5. {
  6.         int i = 0;
  7.         at32_board_init();  
  8.         OLED_Init();                        
  9.         OLED_Clear();
  10.         while(1)
  11.   {
  12.                 OLED_Clear();
  13.                 OLED_ShowCHinese(6,0,20);//欢
  14.                 OLED_ShowCHinese(14+10,0,21);//迎
  15.                 OLED_ShowCHinese(32+10,0,22);//使
  16.                 OLED_ShowCHinese(50+10,0,23);//用
  17.                 OLED_ShowCHinese(68+10,0,24);//雅
  18.                 OLED_ShowCHinese(86+10,0,25);//特
  19.                 OLED_ShowCHinese(104+10,0,26);//力
  20.                 OLED_ShowString(16,3,"AT-START-F425",16);
  21.                 OLED_ShowString(26,6,"2022-03-06",16);
  22.                 for(i = 0; i < 3; i++)
  23.                 {
  24.                         gpio_bits_reset(GPIOC,GPIO_PINS_2);
  25.                         delay_ms(200);
  26.                         gpio_bits_set(GPIOC,GPIO_PINS_2);
  27.                         delay_ms(200);
  28.                         gpio_bits_reset(GPIOC,GPIO_PINS_3);
  29.                         delay_ms(200);
  30.                         gpio_bits_set(GPIOC,GPIO_PINS_3);
  31.                         delay_ms(200);
  32.                         gpio_bits_reset(GPIOC,GPIO_PINS_5);
  33.                         delay_ms(200);
  34.                         gpio_bits_set(GPIOC,GPIO_PINS_5);
  35.                         delay_ms(200);
  36.                 }
  37.                 for(i = 0; i < 8; i++)
  38.                 {
  39.                         gpio_bits_set(GPIOC,GPIO_PINS_2);
  40.                         gpio_bits_set(GPIOC,GPIO_PINS_3);
  41.                         gpio_bits_set(GPIOC,GPIO_PINS_5);
  42.                         delay_ms(100);
  43.                         gpio_bits_reset(GPIOC,GPIO_PINS_2);
  44.                         gpio_bits_reset(GPIOC,GPIO_PINS_3);
  45.                         gpio_bits_reset(GPIOC,GPIO_PINS_5);
  46.                         delay_ms(100);
  47.                 }
  48.                 OLED_Clear();
  49.                 OLED_DrawBMP(0,0,128,8,BMP3);  
  50.                 delay_ms(1200);
  51.    }
  52. }
      将OLED模块直接与板上相对应的排针孔位相连,编译工程无误,点击下载按钮,便可观察到代码中所设置的中文字符与绘画的BMP图片了,如下图所示。此次分享就告一段落,咱们下期再会。
驱动OLED屏.gif
 楼主| yinwuqing110 发表于 2022-3-7 23:09 | 显示全部楼层
21ic论坛发帖功能有这么多问题呀,上传的部分代码直接给截断了,再次重新编辑也无用,后台需要维护呀!@21ic小跑堂
huquanz711 发表于 2022-3-8 08:00 来自手机 | 显示全部楼层
编辑栏有个粘贴代码选项
 楼主| yinwuqing110 发表于 2022-3-8 09:21 | 显示全部楼层
huquanz711 发表于 2022-3-8 08:00
编辑栏有个粘贴代码选项

是在编辑栏进行粘贴的呀,粘贴后不能在写字板栏中进行修改了吗?代码直接截掉说明后台有bug
cr315 发表于 2022-3-8 10:14 | 显示全部楼层
yinwuqing110 发表于 2022-3-8 09:21
是在编辑栏进行粘贴的呀,粘贴后不能在写字板栏中进行修改了吗?代码直接截掉说明后台有bug ...

我也一直感觉后台有BUG,21IC还需要继续完善论坛啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

1102

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部