PxIPH,PxIP:Px口中断优先级控制位
00:Px 口中断优先级为0级(最低级)
01:Px 口中断优先级为1级(较低级)
10:Px 口中断优先级为2 级(较高级)
11:Px口中断优先级为3级(最高级)
我们把P3P4的中断写好,比较一下:
P3的级别高:
void P3_IO_Init(void) //P3端口用作中断初始化
{
P3IM0 = 0X00; //P3口中断模式为低电平中断
P3IM1 = 0xFF;
P3INTE= 0X08; //使能 P3.3 口中断
}
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
{
passward = 1;
// P04 = !P04;
// P05 = !P05;
// P06 = !P06;
// P07 = !P07;
}
}
}
void P4_IO_Init(void) //P47端口用作中断初始化
{
P4IM0 = 0X00; //P4口中断模式为低电平中断
P4IM1 = 0xFF;
P4INTE= 0X80; //使能 P4.7 口中断,7是最高位对应0X80
}
void P4_IO_ISR(void) interrupt 41 //P4端口中断服务函数
{
u8 intf;
intf = P4INTF;
if(intf)//判断intf是否为0,为0就是没有触发
{
P4INTF = 0;
if(intf & 0X80)//判断是否P47按下01就是P40,02就是P41,04就是P42
{
passward = 2 ;
// P04 = !P04;
// P05 = !P05;
// P06 = !P06;
// P07 = !P07;
}
}
}
P4肯定对应80
注意判断P47按钮按下:
if(intf & 0X80)//判断是否P47按下01就是P40,02就是P41,04就是P42
7是最高位,对应10000000 就是80
//数码管显示0:执行while函数 1:执行P3_10中断 2:执行P4_10中断
static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
// {0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms */
// {0, 600, 600, LED1_Blink}, /* task 1 Period: 600ms */
// {0, 900, 900, LED2_Blink}, /* task 1 Period: 600ms */
// {0, 10, 10, KEY_Task}, /* task 1 Period: 10ms */
// {0, 10,10, Task_1}, /* task 1 Period: 矩阵按键 */
{0,1, 1, SEG_Task}, /* task 1 Period: 300ms */
// {0, 10,10, PW_write_Task},/* task 1 Period: 密码 */
};
只保留数码管显示:
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
{
passward = 1;
P3 用数码管第一位:
P4用数码管第二位:
void P4_IO_ISR(void) interrupt 41 //P4端口中断服务函数
{
u8 intf;
intf = P4INTF;
if(intf)//判断intf是否为0,为0就是没有触发
{
P4INTF = 0;
if(intf & 0X80)//判断是否P47按下01就是P40,02就是P41,04就是P42
{
passward = 2 ;
主函数用0:
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,主要是实验板约束
P4_IO_Init();
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();//执行功能函数
passward = 0;
编译下载后发现确实是有等级的:
按住P33,再按P47 没反应:
倒过来按下P47,再按P33,是可以打断P47区执行P33的:
也可以把P47的优先级调高: