话不多说,先上代码。
#include "spi.h"
#include "gpio.h"
#include "oled0.h"
#include "GPIO_MK60DZ10.h"
//写命令函数
void writecmd(unsigned char cmd)
{
spi_writebyte(cmd,0);//DC 0 CMD 1 DATA
return;
}
//写数据函数
void writedata(unsigned char data)
{
spi_writebyte(data,1);//DC 0 CMD 1 DATA
return;
}
//向模块(SSD1306)写入一个字节 8 bit
void spi_writebyte(unsigned char data,unsigned char DC)
{
GPIO_ctrl(PTC,14,1);//RST高电平
oled_delay_ms(1);
GPIO_ctrl(PTC,10,0);//cs 低电平
oled_delay_ms(1);
GPIO_ctrl(PTC,18,1);//SCLK高电平
oled_delay_ms(1);
if(DC==1)
{
GPIO_ctrl(PTC,12,1);
}
if(DC==0)
{
GPIO_ctrl(PTC,12,0);
}
oled_delay_ms(1);
//8 bit
for(unsigned char i=0;i<8;i++)
{
oled_delay_ms(1);
GPIO_ctrl(PTC,18,0);
oled_delay_ms(1);
//判断最高位
if(data&0x80)
{
GPIO_ctrl(PTC,16,1);//SDA置高
oled_delay_ms(1);
}
else
{
GPIO_ctrl(PTC,16,0);//SDA置低
oled_delay_ms(1);
}
GPIO_ctrl(PTC,18,1);//SCLK高电平
oled_delay_ms(1);
data<<=1; //传送下一比特
}
return;
}
对于OLED的驱动,各个论坛上都有大佬进行了详细的分析,今天我要说的重点在于SPI时序的GPIO模拟,作为一个新手,我在做这个模块时费了很多时间在调试上。刚开始做的时候,仅仅是想把显示屏执行clear的功能,然而程序没有报错,但运行起来,却只能清除page0的内容(或其它单独一页,就是无法一次操作多页),一开始以为是writecmd()写命令太快导致的,于是在oled_fill()函数里加了许多延时如下
//填充屏幕 b=0xff 全亮 b=0x00全暗
void oled_fill(unsigned char b)
{
for(unsigned char y=0xb0;y<0xb8;y++)//page 0-7
{
//oled_delay_ms(1000);
writecmd(y);
//oled_delay_ms(100);
writecmd(0x00);
//oled_delay_ms(100);
writecmd(0x10);
// oled_delay_ms(100);
for(unsigned char i=0;i<128;i++)//128列
{
writedata(b);//写入一个字节
}
}
return;
}
结果然并卵,经过一波查询,最终在spi_writebyte()里加上了延时。才算是大功告成。
原因分析:让我们回到手册,结合下图可以看出,约定的时间参数都是最小值,对应的都是频率的最大值,那么就需要ARM发过来的数据慢一些,太快的话就会处理不过来,数据就会执行混乱。所以就应该加上适当延时。
今天就先更到这里,也在学习K60的小伙伴可关注一下,一起交流。新手刚上路,写的不好请多批评[汪柴汪柴].