打印
[活动专区]

【AT-START-F425测评】+ 驱动SSD1306

[复制链接]
934|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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信号引脚。


       而我们常用的IIC接口型的OLED模块,引脚从左至右的封装为SDA、SCL、VCC、GND,因此在代码中只需将SDA与SCL的管脚定义调换过来即可正常驱动。接下来在昨天创建的点灯工程中,添加驱动SSD1306的应用代码。在OLED屏上显示中文字符或者BMP图片,这里需要借助“PCtoLCD2002”取字模软件,见如下附件。
OLE显示屏专用取模工具_PCtoLCD2002.rar (701.79 KB)
部分参考代码如下:
#ifndef __OLED_H
#define __OLED_H

#include "at32f425_board.h"
#include "stdlib.h"         
#include "stdint.h"

#define OLED_MODE 0
#define SIZE 8
#define XLevelL                0x00
#define XLevelH                0x10
#define Max_Column        128
#define Max_Row                64
#define        Brightness        0xFF
#define X_WIDTH         128
#define Y_WIDTH         64                                                              

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

#define OLED_SDIN_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_8)//SDA
#define OLED_SDIN_Set() gpio_bits_set(GPIOB,GPIO_PINS_8)
                     
#define OLED_CMD  0
#define OLED_DATA 1

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;

void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);        
void OLED_ShowCHinese(u8 x,u8 y,u8 no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
#endif  
         
#include "oled.h"
#include "stdlib.h"
#include "at32f425.h"
#include "oledfont.h"           

void IIC_Start()
{
        OLED_SCLK_Set();
        OLED_SDIN_Set();
        OLED_SDIN_Clr();
        OLED_SCLK_Clr();
}

void IIC_Stop()
{
        OLED_SCLK_Set() ;
        OLED_SCLK_Clr();
        OLED_SDIN_Clr();
        OLED_SDIN_Set();
}

void IIC_Wait_Ack()
{
        OLED_SCLK_Set() ;
        OLED_SCLK_Clr();
}

void Write_IIC_Byte(unsigned char IIC_Byte)
{
        unsigned char i;
        unsigned char m,da;
        da=IIC_Byte;
        OLED_SCLK_Clr();
        for(i=0;i<8;i++)               
        {
                        m=da;
                m=m&0x80;
                if(m==0x80)
                {OLED_SDIN_Set();}
                else OLED_SDIN_Clr();
                        da=da<<1;
                OLED_SCLK_Set();
                OLED_SCLK_Clr();
                }
}

void Write_IIC_Command(unsigned char IIC_Command)
{
   IIC_Start();
   Write_IIC_Byte(0x78);
   IIC_Wait_Ack();        
   Write_IIC_Byte(0x00);
   IIC_Wait_Ack();        
   Write_IIC_Byte(IIC_Command);
   IIC_Wait_Ack();        
   IIC_Stop();
}

void Write_IIC_Data(unsigned char IIC_Data)
{
   IIC_Start();
   Write_IIC_Byte(0x78);
   IIC_Wait_Ack();        
   Write_IIC_Byte(0x40);
   IIC_Wait_Ack();        
   Write_IIC_Byte(IIC_Data);
   IIC_Wait_Ack();        
   IIC_Stop();
}
#include "at32f425_board.h"
#include "oled.h"
#include "bmp.h"

int main(void)
{
        int i = 0;
        at32_board_init();  
        OLED_Init();                        
        OLED_Clear();
        while(1)
  {
                OLED_Clear();
                OLED_ShowCHinese(6,0,20);//欢
                OLED_ShowCHinese(14+10,0,21);//迎
                OLED_ShowCHinese(32+10,0,22);//使
                OLED_ShowCHinese(50+10,0,23);//用
                OLED_ShowCHinese(68+10,0,24);//雅
                OLED_ShowCHinese(86+10,0,25);//特
                OLED_ShowCHinese(104+10,0,26);//力
                OLED_ShowString(16,3,"AT-START-F425",16);
                OLED_ShowString(26,6,"2022-03-06",16);
                for(i = 0; i < 3; i++)
                {
                        gpio_bits_reset(GPIOC,GPIO_PINS_2);
                        delay_ms(200);
                        gpio_bits_set(GPIOC,GPIO_PINS_2);
                        delay_ms(200);
                        gpio_bits_reset(GPIOC,GPIO_PINS_3);
                        delay_ms(200);
                        gpio_bits_set(GPIOC,GPIO_PINS_3);
                        delay_ms(200);
                        gpio_bits_reset(GPIOC,GPIO_PINS_5);
                        delay_ms(200);
                        gpio_bits_set(GPIOC,GPIO_PINS_5);
                        delay_ms(200);
                }
                for(i = 0; i < 8; i++)
                {
                        gpio_bits_set(GPIOC,GPIO_PINS_2);
                        gpio_bits_set(GPIOC,GPIO_PINS_3);
                        gpio_bits_set(GPIOC,GPIO_PINS_5);
                        delay_ms(100);
                        gpio_bits_reset(GPIOC,GPIO_PINS_2);
                        gpio_bits_reset(GPIOC,GPIO_PINS_3);
                        gpio_bits_reset(GPIOC,GPIO_PINS_5);
                        delay_ms(100);
                }
                OLED_Clear();
                OLED_DrawBMP(0,0,128,8,BMP3);  
                delay_ms(1200);
   }
}
      将OLED模块直接与板上相对应的排针孔位相连,编译工程无误,点击下载按钮,便可观察到代码中所设置的中文字符与绘画的BMP图片了,如下图所示。此次分享就告一段落,咱们下期再会。

使用特权

评论回复
沙发
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

使用特权

评论回复
5
cr315| | 2022-3-8 10:14 | 只看该作者
yinwuqing110 发表于 2022-3-8 09:21
是在编辑栏进行粘贴的呀,粘贴后不能在写字板栏中进行修改了吗?代码直接截掉说明后台有bug ...

我也一直感觉后台有BUG,21IC还需要继续完善论坛啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

1029

帖子

7

粉丝