项目案例:外部中断信号控制灯光开关
硬件资源:
1个LED灯,1个按键。
D3灯 <——– PC1
外部中断—–>PB0
硬件电路相关信息,详见:XMF06A开发的电路结构框图。
功能要求:
1. 系统的主时钟采用默认的高速内部振荡器8分频,即2MHz。
2. 在主函数中,D3灯循环闪烁。
3. 将PB0引脚定义为外部中断输出,设置上拉电阻。
4. 将外部中断设置为仅下降沿信号触发。
5. 在外部中断服务函数中,翻转D6灯的开关状态。
案例的参考源码及注释
#include "iostm8s105k6.h"
#define D3 PC_ODR_ODR1
#define D6 PC_ODR_ODR4
/*=========================普通延时函数==========================*/
void Delay(unsigned int t)
{
while(t--);
}
/*========================LED灯闪烁函数==========================*/
void LED_Flicker()
{
D3 = 1; //点亮D3灯
Delay(60000);
D3 = 0; //熄灭D3灯
Delay(60000);
}
/*========================GPIO端口初始化=========================*/
void Init_GPIO()
{
//初始化D3灯和D6灯的引脚
PC_DDR |= 0x12; //PC1、PC4设置为输出模式
PC_CR1|= 0x12; //PC1、PC4设置为推挽输出
PC_CR2&= ~0x12; //PC1、PC4输出速度最大为2MHz
//将PB0初始化为外部中断输入引脚
PB_DDR &= ~0x01; //PB0设置为输入模式
PB_CR1|= 0x01; //PB0设置为带上拉电阻输入
PB_CR2|= 0x01; //PB0使能为外部中断
}
/*=========================外部中断初始化========================*/
void Init_INTP()
{
asm("rim"); //打开总中断,CC寄存器为级别3
//PB端口仅下降沿信号触发
EXTI_CR1 = (EXTI_CR1 && 0xf3) | 0x08;
asm("rim"); //打开总中断,CC寄存器为级别0
}
/*====================外部中断中断服务函数=======================*/
#pragma vector= EXTI1_vector
__interrupt void INTPB_IRQHandler()
{
D6 = ~D6; //D6灯的开关状态切换
}
void main()
{
Init_GPIO(); //GPIO端口初始化
Init_INTP(); //外部中断初始化
while(1)
{
LED_Flicker(); //D3灯循环闪烁
}
}