每当我想搞个屏显示的时候我就会找一个管脚少且容易驱动的屏,本来想用真的SPI驱动。但没有管脚来得快。
我想分两步走吧,以后再搞硬件的。。。。。。也不知何时,反正,大约在冬季。
先说说我的屏吧。
SPI的规格书传一下:
怎么加不进来应在附件里边吧。
然后就加上要用的几个管脚:我用的是PA11、PA12、 PB11、PB12,电源和地不算,只要插上就行
然后,反整个OLED文件作为一个OLED子目录的东东,考到本程序根目录下
在oled.h文件中,改管脚的定义,初始化在STM32CUBEMX中自动完成
//-----------------OLED端口定义----------------
#define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);//GPIO_ResetBits(GPIOB,GPIO_Pins_12)//CLK
#define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);//GPIO_SetBits(GPIOB,GPIO_Pins_12)
#define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//GPIO_ResetBits(GPIOB,GPIO_Pins_13)//DIN
#define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);//GPIO_SetBits(GPIOB,GPIO_Pins_13)
#define OLED_RST_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);//GPIO_ResetBits(GPIOB,GPIO_Pins_14)//RES
#define OLED_RST_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);//GPIO_SetBits(GPIOB,GPIO_Pins_14)
#define OLED_DC_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);//GPIO_ResetBits(GPIOB,GPIO_Pins_15)//DC
#define OLED_DC_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);//GPIO_SetBits(GPIOB,GPIO_Pins_15)
然后在主函数中包含这个头文件,在初始化时一定要注意,就是各管脚初始化完了后,一下要接高。这个让我费了半天的时间。
//OLED_CS_Clr(); //打开片选使能
OLED_SCLK_Set()
OLED_SDIN_Set()
OLED_RST_Set();
HAL_Delay(1);
OLED_RST_Clr();
HAL_Delay(20);
OLED_RST_Set();
HAL_Delay(20);
//OLED_BLK_Set();
//************* Start Initial Sequence **********//
LCD_WR_REG(0x36);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x19);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x12);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x54);
LCD_WR_DATA8(0x4C);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x23);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x44);
LCD_WR_DATA8(0x51);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x20);
LCD_WR_DATA8(0x23);
LCD_WR_REG(0x21);
LCD_WR_REG(0x11);
//Delay (120);
LCD_WR_REG(0x29);
开始,没有给个管脚的初始值置位,这样就驱动不起来。我搞了半天也没有搞明白,我从管脚定义都改了,把时钟也改成除4后的时钟还是不行。
最后加了个初始值搞定了。
在默认任务里加个变量,然后显示。没有什么意义,就是显示。
再有STM32CUBEMX 有一点不好,一复位以前定义的就没有了。
现在我想要以前的任务还得对照以前的贴子,慢慢建立。
以下是照片:
怎么说呢,以后的贴子就用显示部的的FREERTOS了。这次OLED打包传了,省得下次找不到。