void delay_n_ms(uchar num) {
uchar time;
while (num) {
time = 250; // fosc=11.0592MHz
while (time) time--;
num--;
}
}
while(time) time--; 編譯為多條汇編指令 (載入、減一、跳轉),每條指令耗時不同 (1-2 機器周期)。**軟件延時無法獲得精確的 1ms**,僅適合粗略延時 (如 LED 閃爍)。
// 定時器 0 模式 1 (16位) 定時 1ms @ 11.0592MHz
TMOD = 0x01;
TH0 = 0xFC; // (65536 - 1000) / 256
TL0 = 0x66; // (65536 - 1000) % 256
ET0 = 1; EA = 1; TR0 = 1;
// 中斷服務
void timer0() interrupt 1 {
TH0 = 0xFC; TL0 = 0x66; // 重裝
ms_counter++; // 全局毫秒計數
}