依靠江科大的OLED驱动写了一个简单的UI,但是在使用我自己设计的二级菜单时发现IIC协议的函数和带有SPI的函数放在同一个switch判断的case中时,发生了冲突???这个错误还是我胡乱试出来的。出错代码片段代码如下:
void updatePage_secondpage(int page, int *currentPage, char *prefix, void (*updateLayer)(int)) {
OLED_Clear();
*currentPage += page;
if (*currentPage < 1) *currentPage = 8;
if (*currentPage > 8) *currentPage = 1;
OLED_ShowString(0, 0, prefix, OLED_6X8);
char pageNum[10];
sprintf(pageNum, "%d", *currentPage);
OLED_ShowString(40, 0, pageNum, OLED_6X8);
updateLayer(*currentPage);
OLED_Update();
}
// 处理子页面导航的函数
void handleSubPageNavigation(int *currentPage, void (*updateLayer)(int), int maxPage) {
int result;
while (Botton_Cycle() == 'T'); // 等待按钮释放
do {
result = Botton_Cycle();
switch (result) {
case 1: // 往前翻一页
updatePage_secondpage(-1, currentPage, "Page: ", updateLayer);
if (*currentPage < 1) *currentPage = maxPage;
break;
case 3: // 往下翻一页
updatePage_secondpage(1, currentPage, "Page: ", updateLayer);
if (*currentPage > maxPage) *currentPage = 1;
break;
case 'T': // 确认当前页面
return;
default:
break;
}
} while (result != 'T');
}
// 封装的子循环处理函数
void handlePage2Navigation(int *page_2, bool *Page_Loop) {
handleSubPageNavigation(page_2, OLED_Second_layer, MAX_SUBPAGE);
if (*page_2 == 1) {
// 执行IMU1的六轴校准
// 擦除第二扇区4k,并校准重新写入数据
Gyro_Calibration(&IMU_Input_1, IMU1_Channel);
Calculate_MPU9250_Mag(&IMU_Input_1,IMU2_Channel);
W25Q32_SectorErase(IMU1_storage_address);
EKF_Struct_Arry_Split(IMU_Input_1, IMU1_storage_address, 40);
在这里我用了一个函数指针静态页面函数的方式实现翻页和功能调用,但是当出现包含两个模拟协议出现的地方却发生了执行一个IIC协议后,后续包含IIC协议的函数和SPI协议的函数全都执行不了!解决办法也摸索出来了,就是把包含SPI协议的函数和IIC协议的函数分隔开,放在不同的case中执行就可以了!希望有懂得大哥给咱科普科普,感激不敬!!!