资深版主
- 积分
- 10541
- 金钱
- 10541
- 注册时间
- 2017-2-18
- 在线时间
- 1908 小时
|
本帖最后由 peng1554 于 2018-10-3 18:16 编辑
遇到网友问ATK-0.96'OLED模块怎么使用SPI方式驱动。开发板的例程支持了GPIO模拟SPI驱动ATK-0.96'OLED需要注意的是:
1.附件中MINIV3、战舰V3&精英、探索者F407测试程序基于标准库,阿波罗开发板测试程序是基于HAL库,号令者RT1052测试程序也是基于官方的库
2.OLED模块背面的BS1、BS2需要都接GND(见图2)
3.OLED模块接板子的接法请参考各开发板的OLED章节
4.提供的测试程序都是在OLED显示例程中将oled.h中的OLED_MODE这个宏修改为0
以战舰V3&精英开发板为例:
打开开发板OLED显示实验例程,找到oled.h中的OLED_MODE,并将该宏设置为0,设置为零后就只有OLED模块的RS、CS、D0、D1、RST起作用,对应32芯片的连接示意图如下:
RS------------------------------PD3
CS------------------------------PD6
D0------------------------------PC0
D1------------------------------PC1
RST-----------------------------PG15
[mw_shl_code=c,true]//OLED模式设置
//0: 4线串行模式 (模块的BS1,BS2均接GND)
//1: 并行8080模式 (模块的BS1,BS2均接VCC)
#define OLED_MODE 0 [/mw_shl_code]
设置该宏后,SSD1633_Init()函数依据该宏执行不同的初始化,OLED_WR_Byte()函数跟原例程不一样
[mw_shl_code=c,true]//初始化SSD1306
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); //使能PC,D,G端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_6; //PD3,PD6推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD3,6
GPIO_SetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_6); //PD3,PD6 输出高
#if OLED_MODE==1
GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 OUT推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,0xFF); //PC0~7输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //PG13,14,15 OUT推挽输出
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PG13,14,15 OUT 输出高
#else
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PC0,1 OUT推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1); //PC0,1 OUT 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PG15 OUT推挽输出 RST
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_15); //PG15 OUT 输出高
#endif
此处省略......
} [/mw_shl_code]
[mw_shl_code=c,true]#if OLED_MODE==1 //8080并口
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{
DATAOUT(dat);
OLED_RS=cmd;
OLED_CS=0;
OLED_WR=0;
OLED_WR=1;
OLED_CS=1;
OLED_RS=1;
}
#else
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
OLED_RS=cmd; //写命令
OLED_CS=0;
for(i=0;i<8;i++)
{
OLED_SCLK=0;
if(dat&0x80)OLED_SDIN=1;
else OLED_SDIN=0;
OLED_SCLK=1;
dat<<=1;
}
OLED_CS=1;
OLED_RS=1;
}
#endif[/mw_shl_code]
测试程序效果如图1
图1
图2
|
|