蓝桥杯STC15单片机复习——外部中断
前言
终于到外部中断了,其实从往届赛题来看,外部中断的使用比较少(也可能是我太菜了),不过咱得秉着宁错勿漏的精神来复习才行。
如上图所示,STC15的单片机的外部中断分别位于P32、P33(EX0、EX1),其中,外部中断0的中断号为0,外部中断1的中断号为2.
1、通过外部中断0控制LED亮灭
/*
彭某的蓝桥杯复习——外部中断
1、外部中断按键控制LED亮灭
*/
#include <STC15F2K60S2.h>
#define uint unsigned int
#define uchar unsigned char
void ALL_Init();
void EX0_Init();
void main()
{
ALL_Init();
EX0_Init();
while(1)
{
}
}
void EX0_run() interrupt 0
{
P25 = 0;P26 = 0;P27 = 1;
P00 = !P00;
}
void EX0_Init()
{
EX0 = 1;
EA = 1;
IT0 = 1;
}
void ALL_Init()
{
P25 = 0;P26 = 1;P27 = 1;
P0 = 0x00;
P25 = 1;P26 = 0;P27 = 1;
P0 = 0x00;
P25 = 0;P26 = 0;P27 = 1;
P0 = 0xff;
}
2、通过外部中断1控制流水灯流水方向
前面做流水灯测试的时候,由于延时函数的干扰,当流水速度不那么快的时,按键存在被延时函数阻塞而无法检测,这次我们通过外部中断进行控制,可以直接打断延时函数,提高按键检测是实时性。
uchar flag = 0;
void main()
{
ALL_Init();
EX0_Init();
EX1_Init();
P25 = 0;P26 = 0;P27 = 1;
P00 = 0;
while(1)
{
liushui();
}
}
void delay_ms(uint ms)
{
int i;
for(;ms>0;ms--)
for(i = 864;i>0;i--);
}
void liushui()
{
if(flag)
P0 = _cror_(P0,1);
else
P0 = _crol_(P0,1);
delay_ms(1000);
}
void EX1_run() interrupt 2
{
flag = !flag;
}
结语
至此,外部中断测试结束。