基于全志论坛里面各种小bug大家都已经帮忙解决了,大家有问题就多逛逛论坛看看里面的反馈,可以解决很多问题,我这里就是弄弄0.96寸OLED小屏幕,然他跑起来。
1.OLED循环显示线程
static void MainThread(void *arg)
{
printf("spi demo started.\n");
uint8_t i = 0;
spi0_init();
spi0_set();
spi0_open();
OLED_Init();
OLED_Clear();
while (1)
{
OLED_Clear();
OLED_Horizen_Roll(0);//向右
for ( i = 0; i < 4; i++)
{
OLED_ShowChinese(i*16,3,i);
}
OS_Sleep(1);
OLED_Start_Roll();
OS_Sleep(5);
OLED_Clear();
OLED_Horizen_Roll(1);//向左
for ( i = 0; i < 4; i++)
{
OLED_ShowChinese(i*16,3,i);
}
OS_Sleep(1);
OLED_Start_Roll();
OS_Sleep(5);
OLED_Clear();
OLED_Vertical_Roll();//向上
for ( i = 0; i < 4; i++)
{
OLED_ShowChinese(i*16,3,i);
}
OS_Sleep(1);
OLED_Start_Roll();
OS_Sleep(5);
OLED_Clear();
OLED_Tilt_Roll(0);//向左上
for ( i = 0; i < 4; i++)
{
OLED_ShowChinese(i*16,3,i);
}
OS_Sleep(1);
OLED_Start_Roll();
OS_Sleep(5);
OLED_Clear();
OLED_Tilt_Roll(1);//向右上
for ( i = 0; i < 4; i++)
{
OLED_ShowChinese(i*16,3,i);
}
OS_Sleep(1);
OLED_Start_Roll();
OS_Sleep(5);
}
}
2.单独的功能函数详细
//OLED左右水平滚动,mode =0 向右,mode =1 向左
void OLED_Horizen_Roll(uint8_t mode)
{
uint8_t flag = 0;
if (mode)
{
flag = 0x27;
}
else if(mode == 0)
flag = 0x26;
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(flag,OLED_CMD); //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 7
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
}
//OLED水平和垂直滚动,mode =0 向左上,mode =1 向右上
void OLED_Tilt_Roll(uint8_t mode)
{
uint8_t flag = 0;
if (mode)
{
flag = 0x29;
}
else if(mode == 0)
flag = 0x2a;
OLED_WR_Byte(0x2e,OLED_CMD); //关闭滚动
OLED_WR_Byte(flag,OLED_CMD); //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 1
OLED_WR_Byte(0x01,OLED_CMD); //垂直滚动偏移量
}
//OLED垂直滚动
void OLED_Vertical_Roll()
{
/*垂直滚动*/
OLED_WR_Byte(0x2e,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD); //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x01,OLED_CMD); //终止页 1
OLED_WR_Byte(0x01,OLED_CMD); //垂直滚动偏移量
}
void OLED_Start_Roll()
{
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
}
3.编译错误
出现它
执行下面命令:
cp device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image_auto_cal.cfg device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image.cfg
在编译就没错误了,这个问题在很多地方(SPI,IIC,MQTT等)都会出现,也有官方教程提示的,可以打开/device/xradio/xr806/xr_shylark/project/image_cfg/readme.md
查看解决教程。
4.总结
这些小指令还挺复杂的,但是看懂了。可以打开对0.96寸小显示屏的新世界,可以玩玩的。
上效果:
向左:
向右:
向上:
左上:
右上: