问题描述:自己写的中断服务程序在仿真的时候遇到中断就无法执行了,初步判断是识别不了中断服务程序,求大佬指点一二
芯片型号:MC9S12XS128
编译器:codewarriorV5.1
仿真器:USBDM()三合一版本)
现象描述:写的这个程序烧录到单片机后,用仿真器仿真,运行起来正常,当摁下按键后,程序就不运行了。
描述补充:这个中断函数,需要在project.prm文件最后一行添加这一句才能识别中断函数;“VECTOR ADDRESS 0xffcc Key_interrupt”;我想知道为什么用中断号和中断向量地址的方式不行
代码:
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LED_dir DDRB //LED口的方向
#define LED PORTB //定义IO口数据
#define KEY_dir DDRH //按键IO口方向
#define KEY PTH //按键IO口数据
#define KEY1 PTH_PTH3 //按键1
#define KEY2 PTH_PTH2 //按键2
#define KEY3 PTH_PTH1 //按键3
#define KEY4 PTH_PTH0 //按键4
void delay(unsigned int n); //定义延时函数
void LED_Init(void); //初始化LED
void KEY_Init(void); //初始化按键
/******************************************按键中断服务函数******************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED //将接下来的代码置于非分页区,中断函数只有被置于非分页区内才能被寻址到
void interrupt VectorNumber_Vpit0 Key_interrupt(void) //这里需要注意这个中断名,需要加载Project.Prm文件的末尾去
{
if(PIFH != 0) //如果触发了中断,中断标志寄存器PIFH的对应位会置1;
{
PIFH |= 0x0f; //0000 1111 清除中断标志位
if(KEY1==0) //如果按键1摁下
{
LED &= 0xfe;
}
if(KEY2==0) //如果按键2摁下
{
LED &= 0xfd;
}
if(KEY3==0) //如果按键3摁下
{
LED &= 0xfb;
}
if(KEY4==0) //如果按键4摁下
{
LED &= 0xf7;
}
}
}
#pragma CODE_SEG DEFAULT //后面的代码置于默认区域内
/******************************************主函数******************************************/
void main(void)
{
/* put your own code here */
DisableInterrupts;
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
EnableInterrupts;
// LED = 0x00; //0000 0000
// delay(1000);
//LED |= 0xf0; //1111 0000 与1相或置位,表示将bit4~bit7置1
//LED = 0xFF; //1111 1111
//delay(1000)
//LED &=0xf0; //1111 0000 与0相与清零,表示将bit0~bit3清零;
for(;;)
{
LED=0x0f;
delay(1000);
LED=0xf0;
delay(1000);
}
}
/******************************************延时函数******************************************/
void delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<1500;j++)
{
;
}
}
}
/******************************************LED初始化函数******************************************/
void LED_Init(void)
{
LED = 0xFF; //设置LED对应的IO口全部高电平,LED全部熄灭;
LED_dir = 0xFF; //设置LED对应的IO口全部为输出;
}
/******************************************按键初始化函数******************************************/
void KEY_Init(void)
{
KEY |= 0x0f; //0000 1111 按键对应IO口低四位拉高
KEY_dir &= 0xf0; //1111 0000 低四位清零,设置为输入
PPSH &= 0xf0; //设置中断触发方式
PIFH |= 0x0f; //清除相应位的中断标志位
PIEH |= 0x0f; //中断使能寄存器打开
}
|