第十四集 IO中断 摘要 1.IO中断介绍 2.IO中断用法 3.中断优先级的设置
IO中断介绍 IO中断用法 任务1:编写IO中断的程序
代码:触发中断P20状态取反 void P3_IO_Init(void)
{
P3IM0 = 0X00; //IO中断模式设置为了下降沿
P3IM1 = 0X00;
P3INTE= 0x04; //打开中断 7654 3210 8421 8421
}
void main(void)
{
Sys_init();
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
P3_IO_Init();
EA = 1;
P20 = 1;
while(1)
{
P21 = !P21;
Delay3000ms();
}
}
void P3_IO_ISR(void) interrupt 40
{
u8 intf;
intf = P3INTF;
if( intf ) //判断有没有IO触发了中断
{
P3INTF = 0;
if( intf & 0x04 )//判断是否是P32按钮按下
{
P20 = !P20;
}
}
}
中断优先级设置
任务2:编写P4端口的IO中断 打断 P3低电平中断的的程序(注意优先级) 代码:(将P4改为了P1,P1默认优先级比P3高,P1可以打断P3,P3不能打断P1;修改优先级后给予P3最高优先级后,P3可以打断P1)
void P3_IO_Init(void)
{
P3IM0 = 0X00; //IO中断模式设置为了下降沿
P3IM1 = 0Xff;
P3INTE= 0x04; //打开中断 P32 7654 3210 8421 8421
PINIPH |= 0x08; //写入最高优先级
PINIPL |= 0x08;
}
void P1_IO_Init(void)
{
P1IM0 = 0X00; //IO中断模式设置为了下降沿
P1IM1 = 0Xff;
P1INTE= 0x04; //打开中断 P12 7654 3210 8421 8421
}
void main(void)
{
Sys_init();
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Init_595();
Timer0_Init();
P3_IO_Init();
P1_IO_Init();
EA = 1;
P20 = 1;
P22 = 1;
while(1)
{
//Task_Pro_Handler_Callback(); //执行功能函数
Display_Seg(0xfe,0x3f);
}
}
void P3_IO_ISR(void) interrupt 40
{
u8 intf;
intf = P3INTF;
if( intf ) //判断有没有IO触发了中断
{
P3INTF = 0;
if( intf & 0x04 )//判断是否是P32按钮按下
{
Display_Seg(0xfe,0x5b);
}
}
}
void P1_IO_ISR(void) interrupt 38
{
u8 intf;
intf = P1INTF;
if( intf ) //判断有没有IO触发了中断
{
P1INTF = 0;
if( intf & 0x04 )//判断是否是P32按钮按下
{
Display_Seg(0xfe,0x06);
}
}
}
课后练习
练习代码: void P1_IO_Init(void)
{
P1IM0 = 0X00; //IO中断模式设置为了下降沿
P1IM1 = 0Xff;
P1INTE= 0x07; //打开中断 P12 7654 3210 8421 8421
}
void main(void)
{
Sys_init();
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Init_595();
Timer0_Init();
//P3_IO_Init();
P1_IO_Init();
EA = 1;
P20 = 1;
P22 = 1;
while(1)
{
//Task_Pro_Handler_Callback(); //执行功能函数
Display_Seg(0xfe,0x3f);
}
}
void P1_IO_ISR(void) interrupt 38
{
u8 intf;
intf = P1INTF;
if( intf ) //判断有没有IO触发了中断
{
//P1INTF = 0;
if( intf & 0x04 )//判断是否是P12按钮按下
{
Display_Seg(0xfe,0x4f);
while(1);
}
if( intf & 0x02 )//判断是否是P11按钮按下
{
Display_Seg(0xfe,0x5b);
while(1);
}
if( intf & 0x01 )//判断是否是P10按钮按下
{
Display_Seg(0xfe,0x06);
while(1);
}
}
}
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
|