打印
[活动专区]

【AT-START-F435测评】F435 OLED显示驱动

[复制链接]
737|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hanter|  楼主 | 2023-1-4 17:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hanter 于 2023-1-5 09:11 编辑

分享一个我在项目中使用到的oled显示驱动,拓扑微CUG-2864ASWPG14  128*64的oled,使用IO口模拟实现并口驱动。
#define E_H()                        (gpio_bits_set(LCD_RD_GPIO_Port,LCD_RD_Pin)) //(LCD_RD_GPIO_Port->BSRRL = LCD_RD_Pin )//RD
#define E_L()                        (gpio_bits_reset(LCD_RD_GPIO_Port,LCD_RD_Pin)) //(LCD_RD_GPIO_Port->BSRRH = LCD_RD_Pin )
#define A0_H()                        (gpio_bits_set(LCD_RS_GPIO_Port,LCD_RS_Pin)) //(LCD_RS_GPIO_Port->BSRRL = LCD_RS_Pin ) //H数据/L指令 RS
#define A0_L()                        (gpio_bits_reset(LCD_RS_GPIO_Port,LCD_RS_Pin)) //(LCD_RS_GPIO_Port->BSRRH = LCD_RS_Pin )
#define RW_H()                        (gpio_bits_set(LCD_WR_GPIO_Port,LCD_WR_Pin)) //(LCD_WR_GPIO_Port->BSRRL = LCD_WR_Pin ) //RW
#define RW_L()                        (gpio_bits_reset(LCD_WR_GPIO_Port,LCD_WR_Pin)) //(LCD_WR_GPIO_Port->BSRRH = LCD_WR_Pin )
#define CS_H()                        (gpio_bits_set(LCD_CSE1_GPIO_Port,LCD_CSE1_Pin)) //(LCD_CSE1_GPIO_Port->BSRRL = LCD_CSE1_Pin ) //CSE1
#define CS_L()                        (gpio_bits_reset(LCD_CSE1_GPIO_Port,LCD_CSE1_Pin)) //(LCD_CSE1_GPIO_Port->BSRRH = LCD_CSE1_Pin )
#define RST_H()                        (gpio_bits_set(LCD_RST_GPIO_Port,LCD_RST_Pin)) //(LCD_RST_GPIO_Port->BSRRL = LCD_RST_Pin ) //RST
#define RST_L()                        (gpio_bits_reset(LCD_RST_GPIO_Port,LCD_RST_Pin)) //(LCD_RST_GPIO_Port->BSRRH = LCD_RST_Pin )
#define BLA_H()                        (gpio_bits_set(LCD_LED_GPIO_Port,LCD_LED_Pin)) //(LCD_LED_GPIO_Port->BSRRL = LCD_LED_Pin ) //LCDLED
#define BLA_L()                        (gpio_bits_reset(LCD_LED_GPIO_Port,LCD_LED_Pin)) //(LCD_LED_GPIO_Port->BSRRH = LCD_LED_Pin )

#define ADC_L()                        //(GPIOA->BRR  = GPIO_Pin_7 )

void DBOUT(BYTE data)
{
        if (data & 0x80)
                (gpio_bits_set(LCD_DB7_GPIO_Port, LCD_DB7_Pin)); //LCD_DB7_GPIO_Port->BSRRL = LCD_DB7_Pin;
        else
                (gpio_bits_reset(LCD_DB7_GPIO_Port, LCD_DB7_Pin)); //LCD_DB7_GPIO_Port->BSRRH = LCD_DB7_Pin;

        if (data & 0x40)
                (gpio_bits_set(LCD_DB6_GPIO_Port, LCD_DB6_Pin)); //LCD_DB6_GPIO_Port->BSRRL = LCD_DB6_Pin;
        else
                (gpio_bits_reset(LCD_DB6_GPIO_Port, LCD_DB6_Pin)); //LCD_DB6_GPIO_Port->BSRRH = LCD_DB6_Pin;

        if (data & 0x20)
                (gpio_bits_set(LCD_DB5_GPIO_Port, LCD_DB5_Pin)); //LCD_DB5_GPIO_Port->BSRRL = LCD_DB5_Pin;
        else
                (gpio_bits_reset(LCD_DB5_GPIO_Port, LCD_DB5_Pin)); //LCD_DB5_GPIO_Port->BSRRH = LCD_DB5_Pin;

        if (data & 0x10)
                (gpio_bits_set(LCD_DB4_GPIO_Port, LCD_DB4_Pin)); //LCD_DB4_GPIO_Port->BSRRL = LCD_DB4_Pin;
        else
                (gpio_bits_reset(LCD_DB4_GPIO_Port, LCD_DB4_Pin)); //LCD_DB4_GPIO_Port->BSRRH = LCD_DB4_Pin;

        if (data & 0x08)
                (gpio_bits_set(LCD_DB3_GPIO_Port, LCD_DB3_Pin)); //LCD_DB3_GPIO_Port->BSRRL = LCD_DB3_Pin;
        else
                (gpio_bits_reset(LCD_DB3_GPIO_Port, LCD_DB3_Pin)); //LCD_DB3_GPIO_Port->BSRRH = LCD_DB3_Pin;

        if (data & 0x04)
                (gpio_bits_set(LCD_DB2_GPIO_Port, LCD_DB2_Pin)); //LCD_DB2_GPIO_Port->BSRRL = LCD_DB2_Pin;
        else
                (gpio_bits_reset(LCD_DB2_GPIO_Port, LCD_DB2_Pin)); //LCD_DB2_GPIO_Port->BSRRH = LCD_DB2_Pin;

        if (data & 0x02)
                (gpio_bits_set(LCD_DB1_GPIO_Port, LCD_DB1_Pin)); //LCD_DB1_GPIO_Port->BSRRL = LCD_DB1_Pin;
        else
                (gpio_bits_reset(LCD_DB1_GPIO_Port, LCD_DB1_Pin)); //LCD_DB1_GPIO_Port->BSRRH = LCD_DB1_Pin;

        if (data & 0x01)
                (gpio_bits_set(LCD_DB0_GPIO_Port, LCD_DB0_Pin)); //LCD_DB0_GPIO_Port->BSRRL = LCD_DB0_Pin;
        else
                (gpio_bits_reset(LCD_DB0_GPIO_Port, LCD_DB0_Pin)); //LCD_DB0_GPIO_Port->BSRRH = LCD_DB0_Pin;
}


static void delay(int16 n)
{
        int8 i;

        for(; n>0; n--)
        {
                for(i=3; i>0; i--);
        }
}

static void WriteData(unsigned char DATA)
{
        //CheckBusy();
        CS_L();        
        E_H();
        A0_H();
        DBOUT(DATA);        
        RW_L();        
        delay(1);
        RW_H();
        CS_H();
}

static void WriteCommand(unsigned char command)
{
        //CheckBusy();
        CS_L();        
        E_H();        
        A0_L();
        DBOUT(command);
        RW_L();        
        delay(1);
        RW_H();        
        CS_H();
}

void Lcd_Init_RST(void)
{
        //WriteCommand(0xae); /* set  display off */
        WriteCommand(0x00); /* set  lower column start address */
        WriteCommand(0x10); /* set  higher column start address */
        WriteCommand(0xD5); /* set  display clock divide/oscillator frequency */
        WriteCommand(0xA0);
        WriteCommand(0xA8); /* set  multiplex ratio */
        WriteCommand(0x3F);
        //         WriteCommand(0xD3);  /* set  display offset  */
        //         WriteCommand(0x00);   
        WriteCommand(0x40);  /* set  display start line */
        WriteCommand(0x00);
        WriteCommand(0x20); /* set  Memory  Addressing Mode  */
        WriteCommand(0x02);
        WriteCommand(0xa0); /* set  segment remap  */
        WriteCommand(0xC8); /* Set COM Output Scan Direction */
        WriteCommand(0xDA); /* Set COM Pins Hardware Configuration */
        WriteCommand(0x12);
        WriteCommand(0xc0); /* set  com scan direction */
        WriteCommand(0xd3); /* set  display offset  */
        WriteCommand(0x40);
        WriteCommand(0x81); /* set contrast control */
        WriteCommand(0xBF);
        WriteCommand(0xD9); /* set Pre-charge Period */
        WriteCommand(0x25);
        WriteCommand(0xA4); /* entire display on */
        WriteCommand(0xA6); /* set normal/inverse display */
        WriteCommand(0xaf); /* set  display on */
}










使用特权

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

本版积分规则

4

主题

22

帖子

0

粉丝