我们马上写个中断函数:
void INT1_Init(void) //INT1中断(上升沿和下降沿)P33按下,0可同时支持上升沿和下降沿
{
IT1 = 1; //下降沿中断,0是上升沿和下降沿都可以
EX1 = 1; //打开中断允许
EA = 1; //打开总中断
}
void INT_ISR(void) interrupt 2//INT1中断(上升沿和下降沿)P33按下,可同时支持上升沿和下降沿
{
P04 = !P04;
P05 = !P05;
P06 = !P06;
P07 = !P07;
//P33按下,P01就取反
}
刚才都中断函数时在io.c里写的
我们在io.h里声明一下:
#ifndef __IO_H
#define __IO_H
#include "config.h" //调用头文件
#define ROW1 P06 //端口定义
#define ROW2 P07
#define COL1 P00
#define COL2 P01
#define COL3 P02
#define COL4 P03
#define HC595_SER P34
#define HC595_RCK P35
#define HC595_SCK P32
extern u8 key_num ;
void LED0_Blink(void);
void LED1_Blink(void);
void LED2_Blink(void);
void KEY_Task(void);
void Task_1(void);
void SEG_Task(void);
void Init_595(void);
void PW_write_Task(void);
void INT1_Init(void);
#endif
接着找主函数初始化调用
void main(void)
{
Sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init(); //定时器初始化
Init_595();
INT1_Init();//外部中断1(P33按下)中断初始化 //外部中断1初始化
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
// WDT_CONTR = 0X24;
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
// Task_Pro_Handler_Callback(); //执行功能函数
// if(P33 !=0)
// WDT_CONTR = 0X34;//看门狗和任务调度函数都关闭,只剩下LED3秒取反一次
P00 = !P00;
P01 = !P01;
P02 = !P02;
P03 = !P03;
Delay3000ms();
/*不信中断,可以用下面代码替换
if(P33==0)
{
P04 = !P04;
P05 = !P05;
P06 = !P06;
P07 = !P07;
}
你会发现,P33就很不灵光了吧?*/
}
}
之所以要3秒延时,就是反应出外部中断的作用
不用外部中断,这3S内都不搭理你,哪怕你把P33按烂!
编译链接下载:
3秒P00的LED变化一次
有外部中断1的情况下
按P33,随时反应,很灵光!
把外部中断1去掉
直接在主函数循环添加按下P33点亮LEDP01
你会发现基本上没应答,没反应的!
课后小练习:
利用光栅,来给雕刻机搞个保护开关
主要是外部中断启动后立马关电源!
红外光栅传感器不贵,100多久买的到
第十三课到此结束!
今天我们继续学习第十四集 IO中断(所有普通IO都支持的“外部中断")
这和传统的8051不同,普通的IO口也支持“外部中断”
和传统外部中断比较:
选择合适的中断模式:
这个和模式寄存器设置和相似