打印
[应用方案]

【新定义MCU开发板测评】SPI+OLED显示

[复制链接]
465|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2022-12-17 09:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示 OLED 效果要来得好一些。0.96 寸 OLED 有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上 1/4 部分为黄光,下 3/4 为蓝;而且是 固定区域显示固定颜色,颜色和显示区域均不能修改;白光则为纯白,也就是黑底白字
对于双色的OLED用来做显示屏只最好的选择,他的驱动方式是一样的,代码都一样就是地测不一样而已。

这个就是看开发者自己的的选择了。我选择的是6PIN的OLED,使用SPI驱动的。
驱动芯片是SSD1306,使用的是中景园提供的代码。
这里直接定义使用的管脚,后面容易对代码进行移植操作。
使用的是P2的引脚
#define LCD_SCLK_GPIO_Port GPIO2
#define LCD_SCLK_Pin GPIO_PIN_0

#define LCD_SDIN_GPIO_Port GPIO2
#define LCD_SDIN_Pin  GPIO_PIN_1

#define LCD_RES_GPIO_Port GPIO2
#define LCD_RES_Pin   GPIO_PIN_2

#define LCD_DC_GPIO_Port GPIO2
#define LCD_DC_Pin GPIO_PIN_3
需要对每一个IO口进行操作,也是用的是宏定义。
#define OLED_SCL_Clr() GPIO_WriteLow(LCD_SCLK_GPIO_Port,LCD_SCLK_Pin)//SCL
#define OLED_SCL_Set() GPIO_WriteHigh(LCD_SCLK_GPIO_Port,LCD_SCLK_Pin)

#define OLED_SDA_Clr() GPIO_WriteLow(LCD_SDIN_GPIO_Port,LCD_SDIN_Pin)//SDA
#define OLED_SDA_Set() GPIO_WriteHigh(LCD_SDIN_GPIO_Port,LCD_SDIN_Pin)

#define OLED_RES_Clr() GPIO_WriteLow(LCD_RES_GPIO_Port,LCD_RES_Pin)//RES
#define OLED_RES_Set() GPIO_WriteHigh(LCD_RES_GPIO_Port,LCD_RES_Pin)

#define OLED_DC_Clr() GPIO_WriteLow(LCD_DC_GPIO_Port,LCD_DC_Pin)//DC
#define OLED_DC_Set() GPIO_WriteHigh(LCD_DC_GPIO_Port,LCD_DC_Pin)
还需要初始化IO口输出
 GPIO_Init(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_MODE_OUT_PP); //
        GPIO_Init(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_MODE_OUT_PP); //
        GPIO_Init(LCD_RES_GPIO_Port, LCD_RES_Pin, GPIO_MODE_OUT_PP); //
        GPIO_Init(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_MODE_OUT_PP); //
中景园提供的初始化寄存器的代码
OLED_RES_Clr();
    delay_ms(200);
    OLED_RES_Set();

    OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
    OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
    OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
    OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
    OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
    OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
    OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
    OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
    OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
    OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
    OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
    OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
    OLED_WR_Byte(0x00,OLED_CMD);//-not offset
    OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
    OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
    OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
    OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
    OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
    OLED_WR_Byte(0x12,OLED_CMD);
    OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
    OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
    OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
    OLED_WR_Byte(0x02,OLED_CMD);//
    OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
    OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
    OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
    OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
    OLED_Clear();
    OLED_WR_Byte(0xAF,OLED_CMD);
这里是main函数里面的代码
  OLED_Init();
        OLED_Clear();
        //OLED_ShowStringCN(0,20,"Redfine",1);
           OLED_ShowString(7,0,"Redfine",8,1); //表示x,y开始显示字符串
                 OLED_Refresh();
这是自己写的联合中英文混合显示
void OLED_ShowStringCN(u8 x,u8 y,u8 *chr,u8 mode)
{   unsigned short k,x0;
    unsigned char i,j;
    while(*chr) {
        if((*chr) < 128)
        {
            OLED_ShowChar(x,y,*chr,16,mode);
            x+=8;
            chr++;
        } else {

            for (k=0; k<hz16_num; k++)
            {
                if ((hz16[k].Index[0]==*(chr))&&(hz16[k].Index[1]==*(chr+1)))
                {
                    for(i=0; i<16; i++)
                    {
                        for(j=0; j<8; j++)
                        {
                            if(hz16[k].Msk[i*2]&(0x80>>j))        OLED_DrawPoint(x+j,y+i,mode);
                            else {
                                OLED_DrawPoint(x+j,y+i,!mode);;
                            }
                        }
                        for(j=0; j<8; j++)
                        {
                            if(hz16[k].Msk[i*2+1]&(0x80>>j))        OLED_DrawPoint(x+j+8,y+i,mode);
                            else
                            {
                                OLED_DrawPoint(x+j+8,y+i,!mode);;
                            }
                        }
                    }
                }
            }
            chr+=2;
            x+=16;
        }

    }
}


使用特权

评论回复
沙发
pixhw| | 2023-1-5 11:30 | 只看该作者
最大的刷新速度是多少?              

使用特权

评论回复
板凳
nomomy| | 2023-1-5 12:37 | 只看该作者
这个OLED是否自带字库呢?              

使用特权

评论回复
地板
mickit| | 2023-1-5 16:33 | 只看该作者
怎么显示汉字?              

使用特权

评论回复
5
janewood| | 2023-1-5 18:26 | 只看该作者
这个硬件spi吗?              

使用特权

评论回复
6
chenjun89| | 2023-1-5 23:19 | 只看该作者
OLED的显示看起来更自然些

使用特权

评论回复
7
olivem55arlowe| | 2023-2-2 10:47 | 只看该作者
怎么移植gui到oled上呢?              

使用特权

评论回复
8
burgessmaggie| | 2023-2-4 20:21 | 只看该作者
这个可以驱动彩色的屏幕的吗?              

使用特权

评论回复
9
sdlls| | 2023-2-4 22:24 | 只看该作者
宏定义实现的官方的代码吧?              

使用特权

评论回复
10
mnynt121| | 2023-2-5 13:29 | 只看该作者
这个有硬件的spi的吗?              

使用特权

评论回复
11
51xlf|  楼主 | 2023-2-5 14:26 | 只看该作者
SPI+OLED的驱动速度怎么样?

使用特权

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

本版积分规则

525

主题

9326

帖子

19

粉丝