接着冲哥给大家演示插件的安装:
先去STC官网下载插件:
接着解压运行,很简单的
我们今天的任务1:编写IO中断的程序
上节课的外部中断是这样写的:
其实我们改写一下就OK
其实手册有完整代码:
看看我们的程序:
void P3_IO_Init(void) //P3端口用作中断初始化
{
P3IM0 = 0X00; //P3口中断模式为下降沿中断
P3IM1 = 0x00;
P3INTE= 0X08; //使能 P3.3口中断0x08对应P33,0x08就是1000
}
void P3_IO_ISR(void) interrupt 40 //P3端口用作中断初始化,中断号是40
{ //我们安装了插件,就不用13号跳转
u8 intf;
intf = P3INTF; //读出P3端口IO中断标志
if(intf)//判断intf是否为0,为0就是没有触发
{
P3INTF = 0;
if(intf & 0X08)//判断是否P33按下01就是P30,02就是P31,04就是P32,08就是P33
{
P04 = !P04;
P05 = !P05;
P06 = !P06;
P07 = !P07;
}
}
}
编译连接:
P33在中断状态,和普通外部中断一样很灵!
随时按P33都及时反应
这就意味着,STC的芯片,任意一个引脚都可以外部中断!
我可以用P00或者P10或者P20
接着看:
16.1.4端口中断优先级控制寄存器(PINIPL,PINIPH)
任务二是验证优先级:
我们让数码管显示0:执行while函数
显示1:执行P3_I0中断
显示 2:执行P4_I0中断
void P3_IO_Init(void) //P3端口用作中断初始化
{
P3IM0 = 0X00; //P3口中断模式为低电平中断
P3IM1 = 0xFF; //FF就是低电平中断,下降沿的话,一闪而过,不行的
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;
}
}
}
void P4_IO_Init(void) //P47端口用作中断初始化
{
P4IM0 = 0X00; //P4口中断模式为低电平中断
P4IM1 = 0xFF; //FF就是低电平中断,下降沿的话,一闪而过,不行的
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 ;
}
}
}
主函数显示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;
}
}