PnIM1.x n代表端口
PnIMO.x .x就是第几位
Pn.x 口中断模式
比如B0这列: P00M0=0P00M1=0 P01就是下降沿模式
接着看中断使能:
还是P00这位:
P00INTE =1 就可以使能中断了
每一个脚位都是独立的:
接着看端口中断标志寄存器(PxINTF)
只要前面的模式和一个中断打开,一旦触发了以后
这里就会触发这个PXINTF的这个寄存器:
中断号的处理:
不装这个插件的话,中断号太大
插件的安装方法:
还可以用13号中断装接:
void main(void)
{
Sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init(); //定时器初始化
Init_595();
// INT1_Init();//外部中断1(P33按下)中断初始化 //外部中断1初始化
P3_IO_Init(); //P3端口用作中断初始化,(P33按下)
//上面这句实际是IO初始化,是所有IO口都能
//用作外部中断的,之所以还用P33,主要是实验板约束
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;
P00 = !P00;
P01 = !P01;
P02 = !P02;
P03 = !P03;
Delay3000ms();
/*不信中断,可以用下面代码替换
if(P33==0)
{
P04 = !P04;
P05 = !P05;
P06 = !P06;
P07 = !P07;
}
你会发现,P33就很不灵光了吧?*/
}
}
我们把上节课的外部中断关了:
void P3_IO_Init(void) //P3端口用作中断初始化
{
P3IM0 = 0X00; //P3口中断模式为下降沿中断
P3IM1 = 0x00;
P3INTE= 0X08; //使能 P3.3 口中断
// P3IM0 = 0X00; //IO中断模式设置为了下降沿
// P3IM1 = 0Xff;
//
// P3INTE= 0X08; //打开中断
}
void P3_IO_ISR(void) interrupt 40 //P3端口用作中断初始化
{
u8 intf;
intf = P3INTF;
if(intf)//判断intf是否为0,为0就是没有触发
{
P3INTF = 0;
if(intf & 0X08)//判断是否P33按下01就是P30,02就是P31,04就是P32
{
P04 = !P04;
P05 = !P05;
P06 = !P06;
P07 = !P07;
}
}
}
其中新的中断初始化如上:
B3这个位对应1000,就是8
P3INTE =0x08 ; //P33启用中断!
因为1个口只有1个中断号
你要会判断是8个脚的哪个脚按下:
if(intf & 0X08)//判断是否P33按下01就是P30,02就是P31,04就是P32
编译链接下载:
效果和外部中断 是 一样的!
端口中断优先级控制寄存器(PINIPL,PINIPH)
还可以配置优先级: