📄 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 + -