📄 eint2.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: Chenxibing
** Modified date: 2005-01-20
** Version:
** Descriptions: 外部中断唤醒掉电CPU,同时产生中断。
**
********************************************************************************************************/
#include "config.h"
//#define BEEP 1 << 7 // P0.7控制BEEP
extern uint8 RedStart;
extern uint32 Reddata;
extern uint8 KeyDown;
uint16 RedTime;
uint16 RedCnt;
uint8 Outdata[5];
uint8 const ASCII[]={'0','1','2','3','4','5','6','7','8','9'};
/*
*********************************************************************************************************
** 函数名称 :IRQ_Eint0()
** 函数功能 :外部中断0 EINT0服务程序
** 入口参数 :无。
** 出口参数 :无。
*********************************************************************************************************
*/
void IRQ_Eint2 (void) __irq
{
/* 等待外部中断信号恢复为高电平
若信号保持为低电平,中断标志会一直置位。*/
if ((EXTINT & 0x04) != 0)
{
EXTINT = 0x04; // 清除EINT0中断标志
T1TCR = 0x00; // 定时器计数器禁止计数
RedTime = T1TC; // 保存两次下降沿这间的时间
if((EXTPOLAR & 0x04) == 0x00) // 这次为下降沿中断
{
EXTPOLAR = 0x04; // EINT2改为上升沿中断
} else {
EXTPOLAR = 0x00; // EINT2改为下降沿中断
}
T1TCR = 0x03; // 复位
T1TCR = 0x01; // 定时器计数器开始计数
if((EXTPOLAR & 0x04) == 0x00) // 这次为下降沿中断
{
UART0_SendByte(13);
UART0_SendByte(10);
UART0_SendByte(0xb5);
UART0_SendByte(0xcd);
} else {
UART0_SendByte(0xb8);
UART0_SendByte(0xdf);
}
RedCnt = RedTime;
if((RedCnt/1000) != 0)
{
UART0_SendByte(ASCII[RedCnt/1000]);
}
if((RedCnt%1000/100) != 0)
{
UART0_SendByte(ASCII[(RedCnt%1000/100)]);
}
UART0_SendByte('.');
UART0_SendByte(ASCII[(RedCnt%100)/10]);
UART0_SendByte(ASCII[RedCnt%10]);
//UART0_SendByte(ASCII[RedTime%10]);
}
VICVectAddr = 0; // 向量中断结束
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :演示外部中断唤醒掉电的CPU
** 入口参数 :无。
** 出口参数 :无。
*********************************************************************************************************
*/
/*
int main (void)
{
PINSEL0 = 0x00000000; // 管脚连接GPIO
PINSEL1 = 0x00000001; // P0.16连接EINT0
IO0DIR = BEEP; // 设置BEEP控制口为输出,其余输入
IRQEnable(); // 使能IRQ中断
// 外部中断0初始化
VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
VICVectCntl5 = 0x20 | 16; // 分配外部中断0到向量中断0
VICVectAddr5 = (uint32)IRQ_Eint2; // 设置中断服务程序地址
VICIntEnable = 1 << 16; // 使能EINT2中断
//EXTWAKE = 0x01; // 外部中断0唤醒芯片
EXTINT = 0x04; // 清除EINT0中断标志
IO0SET = BEEP;
while (1)
{
PCONP = 0x00; // 关闭定时器、RTC、UART等功能部件
PCON = 0x02; // 系统进入掉电模式
// 当系统被唤醒后,取反BEEP控制
if ((IO0SET & BEEP) == 0) IO0SET = BEEP;
else IO0CLR = BEEP;
}
return (0);
}*/
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -