Wordiansom · 2022年01月18日

《XR806开发板试用》SPI+0.96OLED滚动起来!

基于全志论坛里面各种小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.编译错误

出现它
image.png
执行下面命令:

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寸小显示屏的新世界,可以玩玩的。
上效果:
向左:
技术技术202211813512215.gif
向右:
技术技术202211813414314.gif
向上:
技术技术202211813531816.gif
左上:
技术技术20221181354017.gif
右上:
技术技术202211813552518.gif

推荐阅读
关注数
13823
内容数
139
全志XR806开发板相关的知识介绍以及应用专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息