/*************************************************************************************
* KF8F系列单片机开发板演示程序
* 标    题: INT1中断实验
* 项目名: 19-INT1_Interrupt_TEST
* 开发环境：ChipON IDE
* 版本： V2.0 (2015/9/29)
* 使用芯片：KF8F312
* 作者：上海芯旺微电子有限公司
* 功能简述: 使能INT1外部中断功能，通过P11口改变P12口电平，当P12（INT1引脚）有触发脉冲时产生中断，并在中断处理程序中改变LED显示状态。
* 硬件说明：LED连接单片机P16口，输出低电平即可点亮LED
* 跳线接法：使用杜邦线将单片机的P11口和P12口连接起来J13需跳上跳线帽,单片机的P16口需跳上跳线帽。
* 如需下载程序，则单片机P03、VDD、VSS、P00、P01需跳上跳线帽
*************************************************************************************/
#include<KF8F312.h>

//#define INT0
//#define INT1
#define INT2

/*********************宏定义******************************/
#define uchar unsigned char
#define uint  unsigned int
#define LED1 P16                              // 对应Demo板上的D3
/*********************宏定义结束*********************** ***/

/************************
 * 函数名     ：init_fun
 * 函数功能：初始化函数
 * 入口参数：无
 * 返回          ：无
 ************************/
void Init_fun()
{
    OSCCTL = 0x60;                           //设置系统时钟为8M

	/*********端口初始化***********/
	TR0 = 0x0c;				                 //设置P03 P02(INT0) 端口只能设置为输入
	TR1 = 0x0c;				                 //P12(INT1)/P13(INT2)口为外部中断引脚，需配置为数字输入口设置P1端口为输出
	TR2 = 0x00;				                 //设置P2端口为输出

	P0 = 0x00;
	P1 = 0x00;
	P2 = 0xF0;

	ANSEL = 0;                               //配置P12口为数字口
	ANSEH = 0;

#ifdef INT0
	INT0IF = 0;   //  清中断标志位
	INT0SE = 0;   //  0 ：下降沿             1：上升沿
	INT0IE = 1;   //  使能中断
#endif

#ifdef INT1
	INT1IF = 0;	  //  清中断标志位
	INT1SE = 0;   //  0 ：下降沿             1：上升沿
	INT1IE = 1;   //  使能中断
#endif

#ifdef INT2
	INT2IF = 0;   //  清中断标志位
	INT2SE = 0;   //  0 ：下降沿             1：上升沿
	INT2IE = 1;   //  使能中断

#endif

	INTCTL = 0XC0;							 //使能总中断AIE、INT0属于外部中断，需使能外部中断PUIE = 1
}

/************************
 * 函数名     ：Delay
 * 函数功能：短时间延时
 * 入口参数：无
 * 返回          ：无
 ************************/
void Delay()
{

	uchar i = 0,j = 0;

	for (i = 0;i < 200;i++)
		for (j = 0;j < 200;j++);
}

void main()
{
	Init_fun();

	while (1)
	{
		P11 = !P11;                 //  改变P11口电平
		Delay();
	}

}
//中断函数
void int_fun() __interrupt
{
#ifdef INT0
	if (INT0IF)
	{
		INT0IF = 0;                 // 清中断标志
		LED1 = !LED1;               // 更改 D3 显示状态
	}
#endif

#ifdef INT1
	if (INT1IF)
	{
		INT1IF = 0;                 // 清中断标志
		LED1 = !LED1;               // 更改 D3 显示状态
	}
#endif

#ifdef INT2
	if (INT2IF)
	{
		INT2IF = 0;                 // 清中断标志
		LED1 = !LED1;               // 更改 D3 显示状态
	}
#endif
}
