?? 764test.c
字號:
/*返回: CY C=0 有鍵按下; */
/* C=1 無鍵按下. */
/*說明: */
/************************************************************************/
bit KEY_RELS()
{data unsigned char temp1;
temp1=KEY_SCAN(); /*執(zhí)行鍵盤掃描*/
if(temp1!=0){return 0;} /*如果鍵值不為0(有鍵按下),退出*/
SOFT_TMR3=3; /*設(shè)置等待時間*/
while(SOFT_TMR3!=0){} /*等待延時結(jié)束*/
temp1=KEY_SCAN(); /*延時后進(jìn)行第二次掃描*/
if(temp1!=0){return 0;} /*確認(rèn)無按鍵按下,返回*/
return 1;
}
/************************************************************************/
/*名稱: DEAD_LOOP */
/*用途: 進(jìn)入死循環(huán),等待看門狗復(fù)位 */
/*說明: */
/************************************************************************/
void DEAD_LOOP()
{EA=0;
IEN0=0;
IEN1=0;
LED_RUN=0; /*點(diǎn)亮LED_RUN,表示進(jìn)入死循環(huán)*/
EWD=1; /*開啟看門狗中斷*/
EA=1; /*開啟中斷使能.*/
while(1){} /*進(jìn)入死循環(huán),*/
}
/************************************************************************/
/*名稱: KEY_TASK */
/*用途: 鍵盤處理子程序.根據(jù)鍵盤掃描得到的鍵值執(zhí)行相應(yīng)的操作. */
/*返回: 檢測到的鍵值 */
/*說明: */
/************************************************************************/
unsigned char KEY_TASK()
{data unsigned char temp1,temp2;
temp1=KEY_SCAN();
if(temp1==0){return 0;} /*第一次鍵盤掃描的鍵值如果為0則退出.*/
SOFT_TMR3=2; /*延時20mS, 去抖動*/
while(SOFT_TMR3!=0){}; /*等待延時結(jié)束*/
temp2=KEY_SCAN();
if(temp1!=temp2){return temp2;} /*如果兩次鍵盤掃描得到的鍵值不相同則退出*/
if(temp2==0){return 0;}
if(temp2==1)
{while(!KEY_RELS()){} /*等待按鍵釋放后才進(jìn)入空閑操作*/
LED_RUN=1; /*關(guān)閉運(yùn)行指示燈.*/
ET0=0; /*關(guān)閉T0中斷使能,以免T0中斷引起空閑狀態(tài)的退出.*/
AUXR1=AUXR1&0X7F; /*清除 KBI 溢出標(biāo)志*/
EKB=1; /*開放鍵盤中斷,這樣使用鍵盤可以退出空閑狀態(tài).*/
PCON=PCON|0X01; /*進(jìn)入空閑狀態(tài).*/
EKB=0; /*退出空閑后關(guān)閉鍵盤中斷.*/
ET0=1; /*開啟T0中斷使能,進(jìn)入正常工作狀態(tài).*/
}
if(temp2==2)
{while(!KEY_RELS()){} /*等待按鍵釋放后才進(jìn)入掉電操作*/
/*進(jìn)入掉電模式*/
/*注:用戶可以根據(jù)自己的程序要求對以下的程序順序和實(shí)現(xiàn)方法加以改動*/
/***********************************************/
LED_RUN=1; /*關(guān)閉運(yùn)行指示燈.*/
ET0=0; /*關(guān)閉T0中斷使能,以免T0中斷引起掉電狀態(tài)的退出.*/
ET1=0;
AUXR1=AUXR1&0X7F; /*清除 KBI 溢出標(biāo)志*/
EKB=1; /*開放鍵盤中斷,這樣使用鍵盤可以退出掉電狀態(tài).*/
AUXR1=AUXR1|0X40; /*!!!關(guān)閉掉電檢測*/
WDCON=WDCON & 0XEF; /*!!!禁止看門狗時鐘運(yùn)行*/
CMP1=0; /*!!!關(guān)閉比較器1*/
CMP2=0; /*關(guān)閉比較器2*/
/***********************************************/
PCON=PCON|0X03; /*設(shè)置掉電和空閑位進(jìn)入掉電狀態(tài).*/
/*退出掉電模式*/
/*注:用戶可以根據(jù)自己的程序要求對以下的程序順序和實(shí)現(xiàn)方法加以改動*/
/***********************************************/
INIT_CMP();
AUXR1=AUXR1&0XBF; /*開啟掉電檢測*/
WDCON=WDCON | 0X10; /*開放看門狗時鐘運(yùn)行*/
EKB=0; /*退出掉電后關(guān)閉鍵盤中斷.*/
ET0=1; /*開啟T0中斷使能,進(jìn)入正常工作狀態(tài).*/
/***********************************************/
}
if(temp2==3){SCI_STATUS=~SCI_STATUS;}
if(temp2==4){DEAD_LOOP();} /*進(jìn)入死循環(huán)狀態(tài),等待看門狗復(fù)位*/
return temp2;
}
/************************************************************************/
/*名稱: WDT_FEED */
/*用途: 喂狗程序 */
/*說明: 請參照87LPC764的喂狗方法說明 */
/************************************************************************/
void WDT_FEED()
{WDRST=0X1E;
WDRST=0XE1;
}
/************************************************************************/
/*名稱: INIT_WDT */
/*用途: 看門狗初始化程序 */
/*說明: */
/************************************************************************/
void INIT_WDT()
{WDCON=WDCON|0X17; /*開啟看門狗定時器(溢出時間約為2.1秒)*/
WDT_FEED(); /*設(shè)置完后喂狗一次.*/
}
/************************************************************************/
/*名稱: INIT_LOWVOLT_CHECK */
/*用途: 掉電檢測初始化程序 */
/*說明: */
/************************************************************************/
void INIT_LOWVOLT_CHECK()
{PCON=PCON&0XDF; /*清除PCON.5位的BOF標(biāo)志*/
AUXR1=AUXR1|0X20; /*禁止掉電檢測產(chǎn)生復(fù)位,而是產(chǎn)生中斷*/
EBO=1; /*開放掉電檢測中斷*/
}
/************************************************************************/
/*名稱: CHK_POF */
/*用途: 檢查上電標(biāo)志程序 */
/*說明: 此程序根據(jù)上電檢測標(biāo)志位POF,決定相關(guān)操作 */
/************************************************************************/
void CHK_POF()
{if( (PCON&0X10)!=0 )
{PCON=PCON&0XEF;
LED_LBT=1;
}
}
/************************************************************************/
/*名稱: DELAYS */
/*用途: 產(chǎn)生延時(延時中有喂狗操作) */
/*說明: 用戶可以根據(jù)情況調(diào)整 */
/************************************************************************/
void DELAYS()
{data unsigned int temp1;
for(temp1=0;temp1<20000;temp1++){}
WDT_FEED(); /*喂狗操作*/
}
/************************************************************************/
/*名稱: CHK_LED */
/*用途: 用于檢查和為用戶演示LED的顯示. */
/*說明: 此程序以1秒間隔分別點(diǎn)亮LED_RUN LED_CMP1 LED_CMP2 LED_LBT LED_SCI*/
/* 然后仍以1秒間隔分別關(guān)閉LED_SCI LED_LBT LED_CMP2 LED_CMP1 LED_RUN*/
/************************************************************************/
void CHK_LED()
{
LED_CMP1=0;
DELAYS();
LED_CMP2=0;
DELAYS();
LED_LBT=0;
DELAYS();
LED_SCI=0;
DELAYS();
LED_RUN=0;
DELAYS();
LED_RUN=1;
DELAYS();
LED_SCI=1;
DELAYS();
LED_LBT=1;
DELAYS();
LED_CMP2=1;
DELAYS();
LED_CMP1=1;
DELAYS();
DELAYS();
}
/************************************************************************/
/*名稱: MAIN_PRO */
/*說明: 此程序為主運(yùn)行程序,用于程序初始化和檢測鍵盤輸入,并根據(jù)鍵盤掃描獲*/
/* 得的不同鍵值執(zhí)行相應(yīng)的操作 */
/************************************************************************/
void main(void)
{INIT_WDT(); /*看門狗初始化.*/
CHK_LED(); /*進(jìn)行LED的顯示檢查.*/
CHK_LED();
INIT_CMP(); /*比較器初始化設(shè)置.*/
INIT_KBI(); /*鍵盤初始化設(shè)置.*/
INIT_TMR(); /*定時器初始化設(shè)置.*/
INIT_EXT(); /*外部中斷初始化設(shè)置.*/
INIT_SCI(); /*串行口初始化設(shè)置.*/
INIT_LOWVOLT_CHECK();
IP0=0X18; /*中斷優(yōu)先級設(shè)置.(串口,T1為3,T0為2,BO為0)*/
IP0H=0X1A;
KEY_CODE=0; /*鍵值初始化設(shè)置為00H.*/
TXD_LAST=0-8; /*設(shè)置最后一個發(fā)送字符為0F8H*/
BUF_PTR=0; /*接收緩沖指針初始化設(shè)置為0*/
LED_RUN=0; /*點(diǎn)亮LED_RUN顯示.*/
SCI_STATUS=1; /*關(guān)閉SCI_STATUS顯示.*/
EA=1; /*開中斷.*/
while(1)
{WDT_FEED(); /*執(zhí)行喂狗程序.*/
CHK_POF(); /*檢查上電標(biāo)志POF.*/
PCON=PCON&0XDF; /*清除掉電標(biāo)志*/
if( (PCON&0X20)==0 ) /*清除由于掉電檢測過后而點(diǎn)亮的顯示*/
{LED_LBT=1;}
if(KEY_CODE==0)
{KEY_CODE=KEY_TASK();} /*執(zhí)行鍵盤掃描以及相應(yīng)操作.*/
else
{if(KEY_RELS())
{AUXR1=AUXR1&0X7F;
KEY_CODE=0;
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -