今日嘗試做一款有動圖的OLED實時時鐘,本文需要現(xiàn)學一個OLED的GIF動圖取模
其余需要的知識點有不會的可以去我? STM32 F103C8T6學習筆記? 系列專欄自己查閱把,閑話不多,直接開肝~~~
文章提供源碼,測試工程下載,測試效果圖。
做個簡易的時鐘,就不把RTC實時時鐘放進來學了,用定時器簡單代替了~~
目錄
原圖GIF:
程序顯示時間的問題:
簡單版定時器2時間計數(shù):
字符串給OLED打印函數(shù):
?十進制數(shù)字轉字符串:
下載程序測試:
?GIF取模問題:
程序貼出:
測試效果圖:
工程下載:
原圖GIF:
這里先提示一下,工程會提供原圖GIF(原圖像素64*64):
程序顯示時間的問題:
首先解決一下程序顯示時間的問題:
簡單版定時器2時間計數(shù):
這里初始化定時器2 是10ms周期,然后定義變量在定時器2中斷服務函數(shù)刷新1s使得SECOND秒加一:
uint16_t YEAR,HOUR,MINUTE,SECOND;
uint16_t TimeDisplay_cnt,TimeDisplay;
//定時器2中斷服務函數(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);//清出中斷寄存器標志位,用于退出中斷
}
}
別忘了時分秒之間的邏輯:
if(SECOND==60){SECOND=0;MINUTE++;}
if(MINUTE==60){MINUTE=0;HOUR++;}
if(HOUR==12) {HOUR=0;}
字符串給OLED打印函數(shù):
?然后就是轉化數(shù)字字符串給OLED打印的函數(shù):
//顯示一個字符號串
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++;
}
}
?十進制數(shù)字轉字符串:
?主函數(shù)使用??? sprintf(? );? 函數(shù) ? 把十進制數(shù)字處理轉化到字符串數(shù)組中
#include "main.h"
uint16_t YEAR,HOUR,MINUTE,SECOND;
uint16_t TimeDisplay_cnt,TimeDisplay;
uint16_t BMP_cnt,BMP_FLAG;
char buf[10]; //用于存儲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); //初始化滴答計時器
Timer2_Init(); //初始化定時器2
i2c_GPIO_Config(); //IIC初始化
OLED_Init(); //初始化OLED屏幕
OLED_Clear(); //清空屏幕數(shù)據(jù)
YEAR=2023;
HOUR=8;
MINUTE=22;
}
//定時器2中斷服務函數(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) //定時器 刷新太空人圖片
{
BMP_cnt=0;BMP_FLAG++;
if(BMP_FLAG==8){BMP_FLAG=0;}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中斷寄存器標志位,用于退出中斷
}
}
下載程序測試:
?文章來源:http://www.zghlxwxcb.cn/news/detail-660921.html
?
?GIF取模問題:
?動圖本質是一幀一幀的圖片,因此我們先要將動圖分解,在逐個取模....這是個龐大的工程~~
?然后就是每個圖片調整大小,像素,取模:
?
程序貼出:
#include "main.h"
uint16_t YEAR,HOUR,MINUTE,SECOND;
uint16_t TimeDisplay_cnt,TimeDisplay;
uint16_t BMP_cnt,BMP_FLAG;
char buf[10]; //用于存儲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); //初始化滴答計時器
Timer2_Init(); //初始化定時器2
i2c_GPIO_Config(); //IIC初始化
OLED_Init(); //初始化OLED屏幕
OLED_Clear(); //清空屏幕數(shù)據(jù)
YEAR=2023;
HOUR=8;
MINUTE=22;
SECOND=55;
}
//定時器2中斷服務函數(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) //定時器 刷新太空人圖片
{
BMP_cnt=0;BMP_FLAG++;
if(BMP_FLAG==29){BMP_FLAG=1;}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中斷寄存器標志位,用于退出中斷
}
}
測試效果圖:
?
工程下載:
https://download.csdn.net/download/qq_64257614/88232446?spm=1001.2014.3001.5503文章來源地址http://www.zghlxwxcb.cn/news/detail-660921.html
到了這里,關于STM32 F103C8T6學習筆記10:OLED顯示屏GIF動圖取?!喴讜r鐘—動圖手表的制作~的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!