軟件延時的誤區
往往這些問題都是整個流程上附加的延時過多導致的。延時程序是比較直觀明了的程序,但是也破壞單片機的整機性能,因為延時單片機處于全速運行狀態。
本文引用地址:http://www.104case.com/article/201611/316566.htm我現在的腦海想起以前寫的流程:初始化->顯示->按鍵->其他功能->結束。
1.比如說顯示,肉眼不可分辨是50HZ以上,所以說用4個數碼管動態顯示平均每個顯示是5ms。按照以前的觀點是這樣寫的 第一個數碼管點亮->延時幾毫秒、滅第一個、點亮第二個->...->延時、滅最后個、點亮第一個。 如果8個數碼管的動態顯示,豈不是得有 8 * 幾毫秒的 延時。
2.還有個按鍵,按鍵得有個去除抖動,通常是軟件延時,大約在20ms, 如果在加上顯示的幾十毫秒,那這延時是相當恐怖的。
3.其他功能函數也是有附帶延時,特別是驅動程序,比如MAX7279讀取操作都是需要一定延時,但是這種延時都是在us級別,對比與ms級別可以忽略。
筆者建議寫程序,特別寫到延時程序,考慮下你的延時得多久,如果是ms級別,考慮用定時器中斷處理。
比如說顯示程序。假如8個數碼管動態顯示。那么你就得考慮20ms內8個數碼管刷新一次,那么意味著每個數碼管顯示時間為2.5ms。
那么程序如下:
volatile unsigned char time_2500_flag; //2.5ms標志
void TimerA(void) //定時器初始化
{
//初始化,配置為500us中斷一次
}
#pragma interrupt_handler TimerA_ISR:NUM
void Timer1_ISR(void) //中斷服務程序
{
static unsigned char cnt = 0;
//reload 重新賦值
if (++cnt > 5)
{
cnt = 0;
time_2500_flag = 1;
}
}
void Display(void)
{
;
}
void main(void)
{
//初始化
for (;;)
{
if (time_2500_flag == 1)
{
time_2500_flag = 0;
Display();
}
}
}
程序寫到這里。
顯示程序這里要做特別處理,執行一次顯示程序,數碼管依次點亮就OK。
評論