如何下載ppt模板免費(fèi)短視頻關(guān)鍵詞seo優(yōu)化
今日嘗試做一款有動(dòng)圖的OLED實(shí)時(shí)時(shí)鐘,本文需要現(xiàn)學(xué)一個(gè)OLED的GIF動(dòng)圖取模
其余需要的知識(shí)點(diǎn)有不會(huì)的可以去我? STM32 F103C8T6學(xué)習(xí)筆記? 系列專欄自己查閱把,閑話不多,直接開肝~~~
文章提供源碼,測(cè)試工程下載,測(cè)試效果圖。
做個(gè)簡易的時(shí)鐘,就不把RTC實(shí)時(shí)時(shí)鐘放進(jìn)來學(xué)了,用定時(shí)器簡單代替了~~
目錄
原圖GIF:
程序顯示時(shí)間的問題:
簡單版定時(shí)器2時(shí)間計(jì)數(shù):
字符串給OLED打印函數(shù):
?十進(jìn)制數(shù)字轉(zhuǎn)字符串:
下載程序測(cè)試:
?GIF取模問題:
程序貼出:
測(cè)試效果圖:
工程下載:
原圖GIF:
這里先提示一下,工程會(huì)提供原圖GIF(原圖像素64*64):
程序顯示時(shí)間的問題:
首先解決一下程序顯示時(shí)間的問題:
簡單版定時(shí)器2時(shí)間計(jì)數(shù):
這里初始化定時(shí)器2 是10ms周期,然后定義變量在定時(shí)器2中斷服務(wù)函數(shù)刷新1s使得SECOND秒加一:
uint16_t YEAR,HOUR,MINUTE,SECOND;
uint16_t TimeDisplay_cnt,TimeDisplay;//定時(shí)器2中斷服務(wù)函數(shù)
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ if(++TimeDisplay_cnt==100){TimeDisplay_cnt=0;SECOND++;}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中斷寄存器標(biāo)志位,用于退出中斷}
}
別忘了時(shí)分秒之間的邏輯:
if(SECOND==60){SECOND=0;MINUTE++;}if(MINUTE==60){MINUTE=0;HOUR++;}if(HOUR==12) {HOUR=0;}
字符串給OLED打印函數(shù):
?然后就是轉(zhuǎn)化數(shù)字字符串給OLED打印的函數(shù):
//顯示一個(gè)字符號(hào)串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{unsigned char j=0;while (chr[j]!='\0'){ OLED_ShowChar(x,y,chr[j],Char_Size);x+=8;if(x>120){x=0;y+=2;}j++;}
}
?十進(jìn)制數(shù)字轉(zhuǎn)字符串:
?主函數(shù)使用??? sprintf(? );? 函數(shù) ? 把十進(jìn)制數(shù)字處理轉(zhuǎn)化到字符串?dāng)?shù)組中
#include "main.h"uint16_t YEAR,HOUR,MINUTE,SECOND;
uint16_t TimeDisplay_cnt,TimeDisplay;
uint16_t BMP_cnt,BMP_FLAG;
char buf[10]; //用于存儲(chǔ)oled數(shù)據(jù)int main(void)
{ init_ALL(); //初始化所有函數(shù)while(1){if(SECOND==60){SECOND=0;MINUTE++;}if(MINUTE==60){MINUTE=0;HOUR++;}if(HOUR==12) {HOUR=0;}sprintf(buf,"%d",YEAR);OLED_ShowString(80,0,(u8 *)buf,16);sprintf(buf,"%d-",HOUR);OLED_ShowString(70,3,(u8 *)buf,12);sprintf(buf,"%d-",MINUTE);OLED_ShowString(70+15,3,(u8 *)buf,12);sprintf(buf,"%d",SECOND);OLED_ShowString(70+38,3,(u8 *)buf,12);}
}//初始化所有函數(shù):
void init_ALL(void)
{SysTick_Init(72); //初始化滴答計(jì)時(shí)器Timer2_Init(); //初始化定時(shí)器2i2c_GPIO_Config(); //IIC初始化OLED_Init(); //初始化OLED屏幕OLED_Clear(); //清空屏幕數(shù)據(jù)YEAR=2023;HOUR=8;MINUTE=22;
}//定時(shí)器2中斷服務(wù)函數(shù)
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ if(++TimeDisplay_cnt==100){TimeDisplay_cnt=0;SECOND++;}if(++BMP_cnt==10) //定時(shí)器 刷新太空人圖片{BMP_cnt=0;BMP_FLAG++;if(BMP_FLAG==8){BMP_FLAG=0;}}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中斷寄存器標(biāo)志位,用于退出中斷}
}
下載程序測(cè)試:
?
?
?GIF取模問題:
?動(dòng)圖本質(zhì)是一幀一幀的圖片,因此我們先要將動(dòng)圖分解,在逐個(gè)取模....這是個(gè)龐大的工程~~
?然后就是每個(gè)圖片調(diào)整大小,像素,取模:
?
程序貼出:
#include "main.h"uint16_t YEAR,HOUR,MINUTE,SECOND;
uint16_t TimeDisplay_cnt,TimeDisplay;
uint16_t BMP_cnt,BMP_FLAG;
char buf[10]; //用于存儲(chǔ)oled數(shù)據(jù)int main(void)
{ init_ALL(); //初始化所有函數(shù)while(1){if(SECOND==60){SECOND=0;MINUTE++;}if(MINUTE==60){MINUTE=0;HOUR++;}if(HOUR==12) {HOUR=0;}sprintf(buf,"%d",YEAR);OLED_ShowString(80,0,(u8 *)buf,16);sprintf(buf,"%02d-",HOUR);OLED_ShowString(65,3,(u8 *)buf,12);sprintf(buf,"%02d-",MINUTE);OLED_ShowString(65+24,3,(u8 *)buf,12);sprintf(buf,"%02d",SECOND);OLED_ShowString(65+45,3,(u8 *)buf,12);OLED_ShowChar(70,5,'N',12);OLED_ShowChar(70+8,5,'U',12); OLED_ShowChar(70+16,5,'L',12); OLED_ShowChar(70+24,5,'L',12); OLED_ShowCHinese(70,6,0);OLED_ShowCHinese(70+16,6,1); OLED_ShowCHinese(70+32,6,2);switch(BMP_FLAG){case 1:OLED_DrawBMP(0,0,64,8,BMP1); break;case 2:OLED_DrawBMP(0,0,64,8,BMP2); break;case 3:OLED_DrawBMP(0,0,64,8,BMP3); break;case 4:OLED_DrawBMP(0,0,64,8,BMP4); break;case 5:OLED_DrawBMP(0,0,64,8,BMP5); break;case 6:OLED_DrawBMP(0,0,64,8,BMP6); break;case 7:OLED_DrawBMP(0,0,64,8,BMP7); break;case 8:OLED_DrawBMP(0,0,64,8,BMP8); break;case 9:OLED_DrawBMP(0,0,64,8,BMP9); break;case 10:OLED_DrawBMP(0,0,64,8,BMP10); break;case 11:OLED_DrawBMP(0,0,64,8,BMP11); break;case 12:OLED_DrawBMP(0,0,64,8,BMP12); break;case 13:OLED_DrawBMP(0,0,64,8,BMP13); break;case 14:OLED_DrawBMP(0,0,64,8,BMP14); break;case 15:OLED_DrawBMP(0,0,64,8,BMP15); break;case 16:OLED_DrawBMP(0,0,64,8,BMP16); break;case 17:OLED_DrawBMP(0,0,64,8,BMP17); break;case 18:OLED_DrawBMP(0,0,64,8,BMP18); break;case 19:OLED_DrawBMP(0,0,64,8,BMP19); break;case 20:OLED_DrawBMP(0,0,64,8,BMP20); break; case 21:OLED_DrawBMP(0,0,64,8,BMP21); break;case 22:OLED_DrawBMP(0,0,64,8,BMP22); break;case 23:OLED_DrawBMP(0,0,64,8,BMP23); break;case 24:OLED_DrawBMP(0,0,64,8,BMP24); break;case 25:OLED_DrawBMP(0,0,64,8,BMP25); break;case 26:OLED_DrawBMP(0,0,64,8,BMP26); break;case 27:OLED_DrawBMP(0,0,64,8,BMP27); break;case 28:OLED_DrawBMP(0,0,64,8,BMP28); break;}}
}//初始化所有函數(shù):
void init_ALL(void)
{SysTick_Init(72); //初始化滴答計(jì)時(shí)器Timer2_Init(); //初始化定時(shí)器2i2c_GPIO_Config(); //IIC初始化OLED_Init(); //初始化OLED屏幕OLED_Clear(); //清空屏幕數(shù)據(jù)YEAR=2023;HOUR=8;MINUTE=22;SECOND=55;
}//定時(shí)器2中斷服務(wù)函數(shù)
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ if(++TimeDisplay_cnt==100){TimeDisplay_cnt=0;SECOND++; if(SECOND==60){SECOND=0;MINUTE++;}}if(++BMP_cnt==10) //定時(shí)器 刷新太空人圖片{BMP_cnt=0;BMP_FLAG++;if(BMP_FLAG==29){BMP_FLAG=1;}}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中斷寄存器標(biāo)志位,用于退出中斷}
}
測(cè)試效果圖:
?
工程下載:
https://download.csdn.net/download/qq_64257614/88232446?spm=1001.2014.3001.5503