主要任務為
1,oled顯示秒錶時間,當前模式
2,秒錶模式可以記錄幾個時間
3,秒錶模式下10ms傳送串列埠資料,當前時間和模式
4,通過按鍵更改,轉換成定時器模式
5,定時器模式下可以自行設定初始時間,並倒計時
6,倒計時情況下燈逐漸熄滅
秒錶部分
if (!flag)}//ks0作為開始按鈕,點選後啟動程式unsigned ti=0
;//用於記錄當前儲存了多少資料
hal_tim_base_start_it(&htim2);//啟動定時器二while (1
)
i++;//i為i*100mswhile(1)if(i<10)//由於個位特殊性,單獨判斷
else
for(j=cnt;j>=2;j--)oled_shownum((cnt-j)*10,0,num[j],1,1
); oled_showchar((cnt-1)*10,0,'
,',1);oled_shownum(cnt*10,0,num[1],1,1
); }
ks0 =hal_gpio_readpin(k0_gpio_port,k0_pin);//按鈕判斷區域
if(ks0!=gpio_pin_set)//重置
if(ks1!=gpio_pin_set)//繼續
ks4=hal_gpio_readpin(k4_gpio_port,k4_pin);//記錄資料
if(ks4!=gpio_pin_set)
else
for(j=cnt;j>=2;j--)oled_shownum((cnt-j)*10,ti*2,num[j],1,1
); oled_showchar((cnt-1)*10,ti*2,'
,',1);oled_shownum(cnt*10,ti*2,num[1],1,1
); }
}}}}
}
}
定時器部分
//初始化,k這裡是作為k*1000ms,因為設定時是1s為精度,開啟時將k乘十作為k*100ms即可
if(flag)
ks0 =hal_gpio_readpin(k0_gpio_port,k0_pin);
ks1 =hal_gpio_readpin(k1_gpio_port,k1_pin);
ks3 =hal_gpio_readpin(k3_gpio_port,k3_pin);
if(ks0!=gpio_pin_set)
for(j=cnt;j>=1;j--)oled_shownum((cnt-j)*10,0,num[j],1,1
); }}
if(ks1!=gpio_pin_set)
for(j=cnt;j>=1;j--)oled_shownum((cnt-j)*10,0,num[j],1,1
); }}
if(ks3!=gpio_pin_set)
//pwm設為初始低電平
if(k<10)
else
for(j=cnt;j>=2;j--)oled_shownum((cnt-j)*10,0,num[j],1,1
); oled_showchar((cnt-1)*10,0,'
,',1);oled_shownum(cnt*10,0,num[1],1,1
); }
dutycycle=k*1000/maxx;//將當前k與總時間的關係轉化成占空比,達到逐漸熄滅的效果
__hal_tim_set_compare(&htim8, tim_channel_1, 1000-dutycycle);
}hal_tim_base_stop_it(&htim5);}}
}
定時器中斷程式
void hal_tim_periodelapsedcallback(tim_handletypedef *htim)if (htim->instance ==htim5.instance)
k--;
}
最後是一些初始化變數和標頭檔案
#include "main.h
"#include
"i2c.h
"#include
"tim.h
"#include
"usart.h
"#include
"gpio.h
"#include
"oled.h
"gpio_pinstate ks0,ks1,ks2,ks3,ks4 ;
unsigned
int di=1,kb1,i=0,k=0,flag=0
; mx_gpio_init();
mx_i2c1_init();
mx_usart1_uart_init();
mx_tim3_init();
mx_tim8_init();
mx_tim2_init();
mx_tim5_init();
oled_init();
hal_tim_pwm_start(&htim8,tim_channel_1);//開啟pwm
printf函式
#include "stdio.h
"#ifdef __gnuc__
#define putchar_prototype int __io_putchar(int ch)
#else
#define putchar_prototype int fputc(int ch, file *f)
#endif
putchar_prototype
over
使用核心定時器的秒字元裝置
秒字元裝置 秒字元裝置也是字元驅動,所以與之前的字元裝置驅動程式的框架類似,模組編譯,模組載入與解除安裝也與核心模組的編譯,載入解除安裝一致。秒字元裝置驅 second 的實現,建立目錄 second 在該目錄下建立裝置檔案 second.c 內容按下面的 寫即可,在同一目錄下編寫相應的makefi...
利用定時器1實現流水燈
首先要求使用定時器1,且定時1s,那麼先將基礎的初始化函式完成,計算初值為1ms.在服務函式中定義乙個計數變數count並且讓count自增,當count 1000時即達到要求的1s.接著題目要求led燈 先從左至右,再從右至左移動,這一功能通過使用左移函式與右移函式來完成,具體看示例程式 incl...
Linux下定時器的使用及實現秒以下精確定時與休眠
linux下定時器的使用 alarm setitimer 1 alarm 如果不要求很精確的話,用alarm 和signal 就夠了 unsigned int alarm unsigned int seconds 函式說明 alarm 用來設定訊號sigalrm在經過引數seconds指定的秒數後傳...