|
|
廢話不多說(shuō),先上代碼
/************************* 定時(shí)器設(shè)定計(jì)數(shù)(16位) *************************
變量名 | 取值范圍 | 變量含義
NUM | 0 ~ 4 | 定時(shí)器編號(hào)
COUNT | 0 ~ 65535 | 定時(shí)器計(jì)數(shù)值
*/
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;
}
}
我本來(lái)想寫一個(gè)庫(kù)函數(shù),做一個(gè)長(zhǎng)期的積累,結(jié)果就出怪事了。
這段代碼里的兩個(gè)變量在上面注釋里有,編譯之后單步運(yùn)行,發(fā)現(xiàn)變量監(jiān)視器里發(fā)生“靈異事件”。
這個(gè)函數(shù)功能是16位自動(dòng)重載模式中給定時(shí)器設(shè)定初值的。假定 NUM = 0(給定時(shí)器0設(shè)定初值)。Temp是一個(gè)16位無(wú)符號(hào)變量,用來(lái)存放定時(shí)器初始值(65536 - 計(jì)數(shù)值COUNT)。賦值給8位寄存器TL0,直接將低8位送進(jìn)去,沒(méi)有任何問(wèn)題。然后Temp右移8位,幅值給TH0,但這中間發(fā)生了幾個(gè)奇怪的問(wèn)題。
1、測(cè)試,Temp(定時(shí)器初值) = 65536 - COUNT(計(jì)數(shù)值)。但這條語(yǔ)句執(zhí)行完之后,COUNT的值也發(fā)生了變化,雖說(shuō)運(yùn)算結(jié)果是正確的,而且COUNT是局部變量不影響主函數(shù),但哪有把操作數(shù)改變的道理?萬(wàn)一我下面再需要用到COUNT呢?那不全亂套了?
2、一開始我用的是 “>>” 右移運(yùn)算符,但無(wú)論怎么改都沒(méi)有效果,Temp變量并沒(méi)有右移8位。后來(lái)改用 intrins.h 的庫(kù)函數(shù) _cror_(),不用不要緊,一用更邪門了。_cror_(Temp,8)操作之后連NUM這個(gè)數(shù)都改變了,但這可是NUM!這是定時(shí)器編號(hào)啊,函數(shù)里沒(méi)有修改,也根本不需要修改,怎么莫名其妙地就被改了呢?而且說(shuō)好的移位呢?也沒(méi)實(shí)現(xiàn)啊……
希望前輩答疑解惑,多謝啦!
|
|