廢話不多說,先上代碼
/************************* 定時器設定計數(16位) *************************
變量名 | 取值范圍 | 變量含義
NUM | 0 ~ 4 | 定時器編號
COUNT | 0 ~ 65535 | 定時器計數值
*/
void _TIMER_COUNT_16_(uint8_t NUM, uint16_t COUNT){
uint16_t Temp;
Temp = 65536 - COUNT;
switch (NUM){
case 0 :
TL0 = Temp;
TH0 = _crol_(Temp,8);
break;
case 1 :
TH1 = Temp;
TH1 = _crol_(Temp,8);
break;
case 2 :
T2L = Temp;
T2H = _crol_(Temp,8);
break;
case 3 :
T3L = Temp;
T3H = _crol_(Temp,8);
break;
case 4 :
T4L = Temp;
T4H = _crol_(Temp,8);
break;
}
}
我本來想寫一個庫函數,做一個長期的積累,結果就出怪事了。
這段代碼里的兩個變量在上面注釋里有,編譯之后單步運行,發現變量監視器里發生“靈異事件”。
這個函數功能是16位自動重載模式中給定時器設定初值的。假定 NUM = 0(給定時器0設定初值)。Temp是一個16位無符號變量,用來存放定時器初始值(65536 - 計數值COUNT)。賦值給8位寄存器TL0,直接將低8位送進去,沒有任何問題。然后Temp右移8位,幅值給TH0,但這中間發生了幾個奇怪的問題。
1、測試,Temp(定時器初值) = 65536 - COUNT(計數值)。但這條語句執行完之后,COUNT的值也發生了變化,雖說運算結果是正確的,而且COUNT是局部變量不影響主函數,但哪有把操作數改變的道理?萬一我下面再需要用到COUNT呢?那不全亂套了?
截圖2.png (114.67 KB, 下載次數: 72)
下載附件
2020-9-25 08:43 上傳
2、一開始我用的是 “>>” 右移運算符,但無論怎么改都沒有效果,Temp變量并沒有右移8位。后來改用 intrins.h 的庫函數 _cror_(),不用不要緊,一用更邪門了。_cror_(Temp,8)操作之后連NUM這個數都改變了,但這可是NUM啊!這是定時器編號啊,函數里沒有修改,也根本不需要修改,怎么莫名其妙地就被改了呢?而且說好的移位呢?也沒實現啊……
截圖1.png (129.69 KB, 下載次數: 58)
下載附件
2020-9-25 08:44 上傳
希望前輩答疑解惑,多謝啦!
|