void OLED_DrawWaveuint8_t xuint8_t y int8_t page_sub; uint8_t page_buffij; Current_State_Updatey;根据Y值求出当前数据的有关参数 page_sub=Bef0-Cur0;当前值与前一个值的页数相比较 确定当前列每一页应该写什么数据 ifpage_sub0 page_buff=Bef0; OLED_S
/**
-
@brief 在OLED屏幕上绘制波形
-
@param x 波形的起始列
-
@param y 波形的Y值 */ void OLED_DrawWave(uint8_t x, uint8_t y) { int8_t page_sub; // 当前值与前一个值的页数差 uint8_t page_buff, i, j; // page_buff表示当前页数,i和j为循环计数器 Current_State_Update(y); // 根据Y值,求出当前数据的有关参数 page_sub = Bef[0] - Cur[0]; // 当前值与前一个值的页数相比较
// 确定当前列,每一页应该写什么数据 if (page_sub > 0) // 当前值所在的页数比前一个值的页数大 { page_buff = Bef[0]; OLED_SetPos(page_buff, x); WriteDat(Bef[2] - 0x01); // 在前一个值所在的页上,写入该页的最大值 page_buff--; for (i = 0; i < page_sub - 1; i++) { OLED_SetPos(page_buff, x); WriteDat(0xff); // 在中间的页上,写入全1 page_buff--; } OLED_SetPos(page_buff, x); WriteDat(0xff << Cur[1]); // 在当前值所在的页上,写入该页的值 } else if (page_sub == 0) // 当前值所在的页数与前一个值所在的页数相同 { if (Cur[1] == Bef[1]) // 当前值所在的页内的位置与前一个值所在的页内的位置相同 { OLED_SetPos(Cur[0], x); WriteDat(Cur[2]); // 直接在当前值所在的页上,写入该页的值 } else if (Cur[1] > Bef[1]) // 当前值所在的页内的位置比前一个值所在的页内的位置大 { OLED_SetPos(Cur[0], x); WriteDat((Cur[2] - Bef[2]) | Cur[2]); // 在当前值所在的页上,写入差值 } else if (Cur[1] < Bef[1]) // 当前值所在的页内的位置比前一个值所在的页内的位置小 { OLED_SetPos(Cur[0], x); WriteDat(Bef[2] - Cur[2]); // 在当前值所在的页上,写入差值 } } else if (page_sub < 0) // 当前值所在的页数比前一个值的页数小 { page_buff = Cur[0]; OLED_SetPos(page_buff, x); WriteDat((Cur[2] << 1) - 0x01); // 在当前值所在的页上,写入该页的最大值 page_buff--; for (i = 0; i < 0 - page_sub - 1; i++) { OLED_SetPos(page_buff, x); WriteDat(0xff); // 在中间的页上,写入全1 page_buff--; } OLED_SetPos(page_buff, x); WriteDat(0xff << (Bef[1] + 1)); // 在前一个值所在的页上,写入该页的值 } Before_State_Update(y); // 更新前一个状态 // 把下一列,每一页的数据清除掉 for (i = 0; i < 8; i++) { OLED_SetPos(i, x + 1); for (j = 0; j < 1; j++) WriteDat(0x00); }
原文地址: http://www.cveoy.top/t/topic/djvK 著作权归作者所有。请勿转载和采集!