📄 764test.c
字号:
/*返回: CY C=0 有键按下; */
/* C=1 无键按下. */
/*说明: */
/************************************************************************/
bit KEY_RELS()
{data unsigned char temp1;
temp1=KEY_SCAN(); /*执行键盘扫描*/
if(temp1!=0){return 0;} /*如果键值不为0(有键按下),退出*/
SOFT_TMR3=3; /*设置等待时间*/
while(SOFT_TMR3!=0){} /*等待延时结束*/
temp1=KEY_SCAN(); /*延时后进行第二次扫描*/
if(temp1!=0){return 0;} /*确认无按键按下,返回*/
return 1;
}
/************************************************************************/
/*名称: DEAD_LOOP */
/*用途: 进入死循环,等待看门狗复位 */
/*说明: */
/************************************************************************/
void DEAD_LOOP()
{EA=0;
IEN0=0;
IEN1=0;
LED_RUN=0; /*点亮LED_RUN,表示进入死循环*/
EWD=1; /*开启看门狗中断*/
EA=1; /*开启中断使能.*/
while(1){} /*进入死循环,*/
}
/************************************************************************/
/*名称: KEY_TASK */
/*用途: 键盘处理子程序.根据键盘扫描得到的键值执行相应的操作. */
/*返回: 检测到的键值 */
/*说明: */
/************************************************************************/
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){}; /*等待延时结束*/
temp2=KEY_SCAN();
if(temp1!=temp2){return temp2;} /*如果两次键盘扫描得到的键值不相同则退出*/
if(temp2==0){return 0;}
if(temp2==1)
{while(!KEY_RELS()){} /*等待按键释放后才进入空闲操作*/
LED_RUN=1; /*关闭运行指示灯.*/
ET0=0; /*关闭T0中断使能,以免T0中断引起空闲状态的退出.*/
AUXR1=AUXR1&0X7F; /*清除 KBI 溢出标志*/
EKB=1; /*开放键盘中断,这样使用键盘可以退出空闲状态.*/
PCON=PCON|0X01; /*进入空闲状态.*/
EKB=0; /*退出空闲后关闭键盘中断.*/
ET0=1; /*开启T0中断使能,进入正常工作状态.*/
}
if(temp2==2)
{while(!KEY_RELS()){} /*等待按键释放后才进入掉电操作*/
/*进入掉电模式*/
/*注:用户可以根据自己的程序要求对以下的程序顺序和实现方法加以改动*/
/***********************************************/
LED_RUN=1; /*关闭运行指示灯.*/
ET0=0; /*关闭T0中断使能,以免T0中断引起掉电状态的退出.*/
ET1=0;
AUXR1=AUXR1&0X7F; /*清除 KBI 溢出标志*/
EKB=1; /*开放键盘中断,这样使用键盘可以退出掉电状态.*/
AUXR1=AUXR1|0X40; /*!!!关闭掉电检测*/
WDCON=WDCON & 0XEF; /*!!!禁止看门狗时钟运行*/
CMP1=0; /*!!!关闭比较器1*/
CMP2=0; /*关闭比较器2*/
/***********************************************/
PCON=PCON|0X03; /*设置掉电和空闲位进入掉电状态.*/
/*退出掉电模式*/
/*注:用户可以根据自己的程序要求对以下的程序顺序和实现方法加以改动*/
/***********************************************/
INIT_CMP();
AUXR1=AUXR1&0XBF; /*开启掉电检测*/
WDCON=WDCON | 0X10; /*开放看门狗时钟运行*/
EKB=0; /*退出掉电后关闭键盘中断.*/
ET0=1; /*开启T0中断使能,进入正常工作状态.*/
/***********************************************/
}
if(temp2==3){SCI_STATUS=~SCI_STATUS;}
if(temp2==4){DEAD_LOOP();} /*进入死循环状态,等待看门狗复位*/
return temp2;
}
/************************************************************************/
/*名称: WDT_FEED */
/*用途: 喂狗程序 */
/*说明: 请参照87LPC764的喂狗方法说明 */
/************************************************************************/
void WDT_FEED()
{WDRST=0X1E;
WDRST=0XE1;
}
/************************************************************************/
/*名称: INIT_WDT */
/*用途: 看门狗初始化程序 */
/*说明: */
/************************************************************************/
void INIT_WDT()
{WDCON=WDCON|0X17; /*开启看门狗定时器(溢出时间约为2.1秒)*/
WDT_FEED(); /*设置完后喂狗一次.*/
}
/************************************************************************/
/*名称: INIT_LOWVOLT_CHECK */
/*用途: 掉电检测初始化程序 */
/*说明: */
/************************************************************************/
void INIT_LOWVOLT_CHECK()
{PCON=PCON&0XDF; /*清除PCON.5位的BOF标志*/
AUXR1=AUXR1|0X20; /*禁止掉电检测产生复位,而是产生中断*/
EBO=1; /*开放掉电检测中断*/
}
/************************************************************************/
/*名称: CHK_POF */
/*用途: 检查上电标志程序 */
/*说明: 此程序根据上电检测标志位POF,决定相关操作 */
/************************************************************************/
void CHK_POF()
{if( (PCON&0X10)!=0 )
{PCON=PCON&0XEF;
LED_LBT=1;
}
}
/************************************************************************/
/*名称: DELAYS */
/*用途: 产生延时(延时中有喂狗操作) */
/*说明: 用户可以根据情况调整 */
/************************************************************************/
void DELAYS()
{data unsigned int temp1;
for(temp1=0;temp1<20000;temp1++){}
WDT_FEED(); /*喂狗操作*/
}
/************************************************************************/
/*名称: CHK_LED */
/*用途: 用于检查和为用户演示LED的显示. */
/*说明: 此程序以1秒间隔分别点亮LED_RUN LED_CMP1 LED_CMP2 LED_LBT LED_SCI*/
/* 然后仍以1秒间隔分别关闭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 */
/*说明: 此程序为主运行程序,用于程序初始化和检测键盘输入,并根据键盘扫描获*/
/* 得的不同键值执行相应的操作 */
/************************************************************************/
void main(void)
{INIT_WDT(); /*看门狗初始化.*/
CHK_LED(); /*进行LED的显示检查.*/
CHK_LED();
INIT_CMP(); /*比较器初始化设置.*/
INIT_KBI(); /*键盘初始化设置.*/
INIT_TMR(); /*定时器初始化设置.*/
INIT_EXT(); /*外部中断初始化设置.*/
INIT_SCI(); /*串行口初始化设置.*/
INIT_LOWVOLT_CHECK();
IP0=0X18; /*中断优先级设置.(串口,T1为3,T0为2,BO为0)*/
IP0H=0X1A;
KEY_CODE=0; /*键值初始化设置为00H.*/
TXD_LAST=0-8; /*设置最后一个发送字符为0F8H*/
BUF_PTR=0; /*接收缓冲指针初始化设置为0*/
LED_RUN=0; /*点亮LED_RUN显示.*/
SCI_STATUS=1; /*关闭SCI_STATUS显示.*/
EA=1; /*开中断.*/
while(1)
{WDT_FEED(); /*执行喂狗程序.*/
CHK_POF(); /*检查上电标志POF.*/
PCON=PCON&0XDF; /*清除掉电标志*/
if( (PCON&0X20)==0 ) /*清除由于掉电检测过后而点亮的显示*/
{LED_LBT=1;}
if(KEY_CODE==0)
{KEY_CODE=KEY_TASK();} /*执行键盘扫描以及相应操作.*/
else
{if(KEY_RELS())
{AUXR1=AUXR1&0X7F;
KEY_CODE=0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -