?? 764test.c
字號:
/*==============================================================================*/
/* LPC764 單片機功能測試程序(764test.c)(第二版) */
/* 周立功單片機有限公司 */
/* 2000-8-23 */
/* 版本說明:在第一版本中,當按動LPD進入掉電模式后,由于并沒有采取任何措施降低764 */
/* 的功耗,因此用戶實際測試到的功耗要比數據手冊上說明的要高,大約在200微*/
/* 安以下.在這個版本中當進入掉電模式后,關閉了比較器,掉電檢測電路,看門 */
/* 狗定時器,實際測試到的功耗電流在1微安以下 */
/* */
/* 本測試板是專門針對Philips公司的低功耗單片機P87LPC764而設計,用于測試 */
/* P87LPC764以下功能: */
/* */
/* ■標準80C51的外部中斷,串行中斷和定時器中斷. */
/* ■比較器功能. */
/* ■掉電功能. */
/* ■鍵盤功能. */
/* ■看門狗定時器功能. */
/* ■I/O口線驅動能力. */
/* ■正常/空閑/掉電(低功耗)模式. */
/* */
/* 此文件764test.c為匯編程序,另外還有 */
/* 764test.sch 電路原理圖文件 */
/* 764test.asm 匯編程序文件 */
/* 764test.c C程序文件 */
/* 注意:由于87LPC764內部有兩個EEROM的配置字節,因此用戶在進行芯片編程時 */
/* 除了寫入編譯好的Hex或Bin文件外,還必須對這些EEROM進行單獨編程, */
/* 如果不加注意,87LPC764將不能正常工作.在此程序中,UCFG2可以不用 */
/* 處理,但是UCFG1要如下確定: */
/* UCFG1.7(WDTE)=0 關閉看門狗 . */
/* UCFG1.6(RPD) =1 關閉復位引腳. */
/* UCFG1.5(PRHI)=1 口復位為高電平. */
/* UCFG1.4(BOV) =0或1,用戶可以自己選擇:1(掉電電壓為2.5V)或0(為3.8V)*/
/* UCFG1.3(CLKR)=0(標準8051時鐘),用戶也可以選1(8051的2倍時鐘). */
/* UCFG[2..0](FOSC[2..0])=000,4MHz-20MHz晶振. */
/*==============================================================================*/
#include <Reg764.h> /*87LPC764的頭文件*/
#define LED_RUN T1 /*運行指示燈.點亮時為0,熄滅時為1*/
#define LED_CMP1 _CMP1 /*比較器1指示燈.*/
#define LED_CMP2 _CMP2 /*比較器2指示燈.*/
#define LED_SCI P1_6 /*通訊指示燈*/
#define LED_LBT P1_7 /*低電源電壓指示燈.*/
#define KEY_IDL _CIN2B /*空閑鍵.按此鍵MCU進入"空閑"模式*/
#define KEY_LPD _CIN1B /*低功耗鍵.按此鍵進入"低功耗"模式*/
#define KEY_SCI INT1 /*通訊鍵. 在"通訊"/"停"之間切換*/
#define KEY_WDT RST /*看門狗使能鍵.模擬死循環*/
bit MCU_STATUS;
bit SCI_STATUS; /*通訊狀態. 1表示正在通訊*/
bit KEY_STATUS;
data unsigned char SOFT_TMR1; /*軟件定時器1*/
data unsigned char SOFT_TMR2; /*軟件定時器2*/
data unsigned char SOFT_TMR3; /*軟件定時器3*/
data unsigned char TXD_LAST; /*最后一次通訊的數據*/
data unsigned char BUF_PTR; /*通訊緩沖區指針*/
data unsigned char REC_BUF[8]; /*通訊緩沖區指針*/
data unsigned char KEY_CODE; /*鍵盤代碼緩沖*/
#define TH0_VAL 0XDC /*定時器0的重載值*/
#define TL0_VAL 0X00
#define TH1_VAL 0XFA /*定時器1的重載值*/
#define TL1_VAL 0XFA
#define STACK_POINTER 0X50 /*堆棧指針*/
#define RUN_SPAN 50 /*運行燈閃爍的間隔*/
#define SCI_SPAN 5 /*通訊燈閃爍的間隔*/
void INT_T0(void) interrupt 1
{TR0=0;
TH0=TH0_VAL; /*定時10mS@11.0592MHz*/
TL0=TL0_VAL;
TR0=1;
if(SOFT_TMR1==0) /*如果定時器1數值為0則設定時間到*/
{SOFT_TMR1=RUN_SPAN; /*重新調入定時器1的予置數據.*/
LED_RUN=~LED_RUN; /*變換LED_RUN顯示*/
}
else{SOFT_TMR1=SOFT_TMR1-1;} /*如果定時器1數值不為0則繼續記時.*/
if(SOFT_TMR2==0) /*如果定時器2數值1則設定時間到*/
{SOFT_TMR2=SCI_SPAN; /*重新調入定時器2的予置數據*/
if(SCI_STATUS)
{RI=0;
TI=0;
LED_SCI=1; /*關閉串口顯示*/
}
else
{if(!ES)
{ES=1; /*如果串口處于關閉狀態,首先打開串口中斷.*/
SBUF=0X55; /*發送第一個數據*/
}
LED_SCI=~LED_SCI; /*變換串口顯示*/
}
}
else{SOFT_TMR2=SOFT_TMR2-1;} /*如果定時器2數值不為0則繼續記時.*/
if(SOFT_TMR3==0){}
else{SOFT_TMR3=SOFT_TMR3-1;} /*如果定時器3數值不為0則繼續記時.*/
}
void INT_EXT1(void) interrupt 2
{IE1=0; /*INT1中斷服務程序*/
ET0=1;
}
void INT_SERIAL(void) interrupt 4 /*串行口中斷服務程序*/
{if(TI)
{TI=0;
TXD_LAST=TXD_LAST + 8; /*發送的數據以08H的步長遞增*/
SBUF=TXD_LAST;
}
if(RI)
{RI=0;
if(BUF_PTR>=8){BUF_PTR=0;}
REC_BUF[BUF_PTR]=SBUF; /*接收一個數據*/
BUF_PTR=BUF_PTR+1; /*數據緩沖指針加一*/
}
}
void INT_LOWVOLT(void) interrupt 5 /*掉電中斷服務程序*/
{LED_LBT=0; /*點亮 LED_LBT*/
PCON=PCON&0XDF; /*清除 BOF 標志*/
}
void INT_KBI(void) interrupt 7 /*掉電中斷服務程序*/
{AUXR1=AUXR1&0X7F; /*清除 KBI 溢出標志*/
EKB=0; /*禁止 KBI 中斷*/
}
void INT_CMP2(void) interrupt 8 /*比較器2中斷服務程序*/
{CMP2=CMP2&0XFE;} /*清除 CMP2 溢出標志*/
void INT_WDT(void) interrupt 10 /*看門狗定時器中斷服務程序*/
{EWD=0; /*禁止 WDT 中斷*/
AUXR1=AUXR1|8; /*軟件復位*/
}
void INT_CMP1(void) interrupt 12 /*比較器2中斷服務程序*/
{CMP1=CMP1&0XFE;} /*清除 CMP2 溢出標志*/
/************************************************************************/
/*名稱: DLAY_10US */
/*用途: 短延時程序 */
/*說明: 用戶可以根據情況調整 */
/************************************************************************/
void DELAY_10US()
{data unsigned char temp1;
for(temp1=0;temp1<4;temp1++){}
}
/************************************************************************/
/*名稱: INIT_CMP */
/*說明: 比較器初始化子程序 */
/************************************************************************/
void INIT_CMP()
{PT0AD=PT0AD|0X34; /*設置P0.2數字功能禁止*/
P0M2=P0M2&0XCB; /*僅作為輸入口*/
P0M1=P0M1|0X34;
CMP1=0X24; /*CIN1A與CMPREF比較,結果輸出至CMP1腳*/
CMP2=0X2C; /*CIN2A與REF比較,結果輸出至CMP2腳*/
DELAY_10US(); /*延時10uS*/
CMP1=CMP1&0X0FE; /*清除比較器中斷標志*/
CMP2=CMP2&0XFE;
EC1=1; /*使能比較器中斷*/
EC2=1;
}
/************************************************************************/
/*名稱: INIT_SCI */
/*說明: 串行口初始化 */
/************************************************************************/
void INIT_SCI()
{SCON=0X50; /*置為模式1*/
ES=1; /*開放串口中斷.*/
}
/************************************************************************/
/*名稱: INIT_TMR */
/*說明: 定時器初始化 */
/************************************************************************/
void INIT_TMR()
{TMOD=0X21; /*定時器0置為模式1*/
/*定時器1置為模式2*/
TH0=TH0_VAL; /*定時10mS@11.0592MHz*/
TL0=TL0_VAL;
TH1=TH1_VAL; /*串行口波特率9600*/
TL1=TL1_VAL;
ET0=1; /*開放T0中斷使能.*/
TCON=TCON|0X50; /*啟動 T0/T1*/
}
/************************************************************************/
/*名稱: INIT_EXT */
/*說明: 外部中斷初始化子程序 */
/************************************************************************/
void INIT_EXT()
{TCON=TCON|0X40; /*外部中斷1低電平方式觸發.*/
IE1=1; /*開放外部中斷1使能.*/
}
/************************************************************************/
/*名稱: INIT_KBI */
/*說明: 鍵盤初始化子程序 */
/************************************************************************/
void INIT_KBI()
{KBI=0X0A; /*允許P0.1,P0.3鍵盤中斷*/
P0M2=P0M2&0XF5; /*P0.1,P0.3僅為輸入*/
P0M1=P0M1|0X0A;
P1M2=P1M2&0XCF; /*P1.4,P1.5僅為輸入*/
P1M1=P1M1|0X30;
EKB=0;
}
/************************************************************************/
/*名稱: KEY_SCAN */
/*用途: 鍵盤掃描子程序 */
/*返回: 檢測到的鍵值 */
/*說明: 此程序依次檢查KEY_IDL KEY_LPD KEY_SCI KEY_WDT端口是否為0(有鍵按 */
/* 下),對應的代碼分別為01H 02H 03H 04H(無按鍵為00H),放入R7中返回. */
/************************************************************************/
unsigned char KEY_SCAN()
{if(!KEY_IDL){return 1;}
if(!KEY_LPD){return 2;}
if(!KEY_SCI){return 3;}
if(!KEY_WDT){return 4;}
return 0;
}
/************************************************************************/
/*名稱: KEY_RELS */
/*用途: 判斷當前按鍵是否處于全部釋放的狀態 */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -