單片機(jī)C語言編程心得
static unsigned char sts;//按鍵狀態(tài)變量
static unsigned char Nowkeycode;//此時(shí)的鍵碼
static unsigned char Prekeycode;//上一次的鍵碼
static unsigned char Keydowntime;//矩形鍵盤按下去抖時(shí)間變量
static unsigned char Keyuptime;//矩形鍵盤釋放去抖時(shí)間變量
static unsigned char Onoffdowntime;//關(guān)機(jī)鍵按下去抖時(shí)間變量
static unsigned char Onoffuptime;//關(guān)機(jī)鍵釋放去抖時(shí)間變量
static unsigned char onoff_10ms; //判斷關(guān)機(jī)鍵中斷次數(shù)變量,累計(jì)150次大約為3S,因?yàn)榍昂筮M(jìn)了兩個(gè)10ms中斷
2、全局變量,編譯時(shí)分配為靜態(tài)存儲區(qū),可以被本文件中的各個(gè)函數(shù)引用。如果是多個(gè)文件的話,如果在一個(gè)文件中引用另外文件中的變量,在此文件中要用extern說明。不過如果一個(gè)全局變量定義為static的話,就只能在此一個(gè)文件中使用。
四、特殊關(guān)鍵字const volatile的使用
1、const
const用于聲明一個(gè)只讀的變量
const unsigned char a=1;//定義a=1,編譯器不允許修改a的值
作用:保護(hù)不希望被修改的參數(shù)
const unsigned char Key_code[KEYNUM]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,
0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,
0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,
0x41
};//鍵碼
const unsigned char Line_out[LINENUM]={0xFE,0xFD,0xFB,0xf7,0xEF,0xDF,0xBF,0x7F};//行輸出編碼
const unsigned char Row_in[ROWNUM]={0xFE,0xFD,0xFB,0xf7,0xEF,0xDF,0xBF,0x7F};//列輸入編碼
2、volatile
一個(gè)定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。
static int i=0;
int main(void)
{
...
while (1)
{
if (i)
dosomething();
}
}
/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}
程序的本意是希望ISR_2中斷產(chǎn)生時(shí),在main當(dāng)中調(diào)用dosomething函數(shù),但是,由于編譯器判斷在main函數(shù)里面沒有修改過i,因此可能只執(zhí)行一次對從i到某寄存器的讀操作,然后每次if判斷都只使用這個(gè)寄存器里面的“i副本”,導(dǎo)致dosomething永遠(yuǎn)也不會被調(diào)用。如果將將變量加上volatile修飾,則編譯器保證對此變量的讀寫操作都不會被優(yōu)化(肯定執(zhí)行)。
一般說來,volatile用在如下的幾個(gè)地方:
1、中斷服務(wù)程序中修改的供其它程序檢測的變量需要加volatile;
2、多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile;
3、存儲器映射的硬件寄存器通常也要加volatile說明,因?yàn)槊看螌λ淖x寫都可能由不同意義;
c語言相關(guān)文章:c語言教程
評論