本帖最后由 wind_west 于 2023-6-17 17:21 编辑

视频效果-按键滤波15ms:



任务之间传递变量:

发现当硬件I2C的不同的外设放到不同的任务的时候,会引发未知错误,外设不能正常工作,暂时放弃。

移植U8g2-硬件IIC

移植完成:

参考链接:STM32 U8g2 spi软件驱动,spi硬件驱动_u8g2 驱动_weixin_58595117的博客-CSDN博客

主要修改函数:

uint8_t u8x8_byte_3wire_hw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
uint8_t *p = (uint8_t*) arg_ptr;
static _Bool flagCmdData = 0;
switch (msg)
{
/*通过SPI发送arg_int个字节数据*/
case U8X8_MSG_BYTE_SEND:

for (int i = 0; i < arg_int; i++)
{
if (flagCmdData)
{
OLED_WR_DATA ((uint8_t) *(p + i));
}
else
{
OLED_WR_CMD ((uint8_t) *(p + i));
}
}

break;

/*设置DC引脚,DC引脚控制发送的是数据还是命令*/
case U8X8_MSG_BYTE_SET_DC:
if (arg_int)
{
flagCmdData = 1;
}
else
{
flagCmdData = 0;
}

break;

/*初始化函数*/
case U8X8_MSG_BYTE_INIT:
// SPI_OLED_Init ();
break;

/* 下面功能无需定义 */

/*开始传输前会进行的操作,如果使用软件片选可以在这里进行控制*/
case U8X8_MSG_BYTE_START_TRANSFER:
break;

/*传输后进行的操作,如果使用软件片选可以在这里进行控制*/
case U8X8_MSG_BYTE_END_TRANSFER:
break;
default:
return 0;
}
return 1;
}


画图

使用普通软件取模生成的数组,u8g2_DrawGlyph(&u8g2, 112, 56, _air_conditioner_4x_t ); 不能显示,需要使用函数 u8g2_DrawXBM(&u8g2, 13,23, 30, 23, _air_conditioner_4x_t)。


生成bmp文件

使用画图软件调整大小:

forum.jpg


生成数组
使用取模软件 -PCtoLCD2022:

forum.jpg


代码
const uint8_t _clock_4x_t[ ] ={

0x00,0xFC,0x07,0x00,0x00,0xFF,0x1F,0x00,0xC0,0xFF,0x7F,0x00,0xE0,0x03,0xF8,0x00,
0xF0,0xE0,0xE0,0x01,0x78,0xE0,0xC0,0x03,0x3C,0xE0,0x80,0x07,0x1C,0xE0,0x00,0x07,
0x0E,0xE0,0x00,0x0E,0x0E,0xE0,0x00,0x0E,0x07,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,
0x07,0xE0,0x00,0x1C,0x07,0xF0,0x01,0x1C,0x07,0xF0,0x01,0x18,0x07,0xF0,0x01,0x1C,
0x07,0xE0,0x03,0x1C,0x07,0x80,0x07,0x1C,0x07,0x00,0x0F,0x1C,0x0E,0x00,0x1E,0x0E,
0x0E,0x00,0x1C,0x0E,0x1C,0x00,0x00,0x0F,0x3C,0x00,0x00,0x07,0x78,0x00,0x80,0x03,
0xF0,0x00,0xE0,0x01,0xE0,0x03,0xF8,0x00,0xC0,0xBF,0x7F,0x00,0x00,0xFF,0x3F,0x00,
0x00,0xFC,0x07,0x00,0x00,0x00,0x00,0x00,/*"D:\BaiduNetdiskDownload\图标\时钟.bmp",0*/
/* (30 X 30 )*/
};

显示图片:u8g2_DrawXBM(&u8g2, 13,23, 30, 30, _clock_4x_t);

C

需要注意的问题:u8g2_NextPage

u8g2_NextPage()的返回值一直为1,所以菜单页面不会更新。

forum.jpg

修改 to_right( )函数:

forum.jpg

当前显示温度需要关闭显示才能采集,因为温度采集和OLED显示都是使用硬件IIC,会产生冲突,所以这里针对U8G2做了一点改动,采集温度的时候关闭显示。底层代码逻辑:

forum.jpg

关键变量:u8x8_d_ssd1306_128x64_noname_powersave0_seq、u8x8_d_ssd1306_128x64_noname_powersave1_seq。

详细显示如下:

static const uint8_t u8x8_d_ssd1306_128x64_noname_powersave0_seq[] = {
U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
U8X8_C(0x0af), /* display on */
U8X8_END_TRANSFER(), /* disable chip */
U8X8_END() /* end of sequence */
};

static const uint8_t u8x8_d_ssd1306_128x64_noname_powersave1_seq[] = {
U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
U8X8_C(0x0ae), /* display off */
U8X8_END_TRANSFER(), /* disable chip */
U8X8_END() /* end of sequence */
};

C

实际上调用display off会导致屏幕熄灭,体验不好,所以,将display off 的寄存器进行修改:0x0ae → 0x0af 。骗过U8G2驱动,关闭U8G2不会真的关闭OLED的显示。

按键驱动
按键驱动做的比较粗糙,只有几个状态:短按、短按释放、长按、长按释放。菜单的显示框架参考RTT。

参考:

RTT-thread进行按键驱动的移植:https://packages.rt-thread.org/index.html

关于按键消抖的时间描述:https://packages.rt-thread.org/detail.html?package=agile_button

基于RTT的例子:https://gitee.com/RT-Thread-Mirror/rt-u8g2/

如图:

微信图片_20230608143912.jpg



相关链接:
【瑞萨 RA2E1】+ 点亮LED(1)
【瑞萨 RA2E1】+ 硬件IIC驱动LCD和LM75温度传感器(2)
【瑞萨 RA2E1】+ 基于U8G2显示菜单(3)
【瑞萨 RA2E1】+ 红外解码(4)
【瑞萨 RA2E1】+ 红外发射(5)
【瑞萨 RA2E1】+ 空调控制项目-总结帖(6)