本帖最后由 芯圣电子官方QQ 于 2023-7-24 15:04 编辑
上一篇使用外部中断1做了测试,HC89S003P还有其他14个外部中断可以使用,2-7共用一个中断地址,8-15共用一个中断地址,下面使用INT2来测试下外部中断
一、手册里相关的寄存器设置
1.1、芯片引脚
INT2使用的引脚是P0.2。
1.2、外部中断电平选择寄存器选择
1.3、外部中断2使能
1.4、外部中断标志位,进入中断后要清除此标志位
二、程序部分
//main.c
#define ALLOCATE_EXTERN
#include "config.h"
//系统初始化
void SystemInit(void)
{
/************************************系统初始化****************************************/
WDTCCR = 0x00; //关闭看门狗
while((CLKCON&0x20)!=0x20); //等待内部高频RC起振
CLKSWR = 0x51; //选择内部高频时钟为主时钟,内部高频RC2分频,Fosc=16MHz
while((CLKSWR&0xC0)!=0x40); //等待内部高频切换完成
CLKDIV = 0x01; //Fosc1分频得到Fcpu,Fcpu=16MHz
}
void main(void)
{
// uint i;
SystemInit(); //系统初始化
Init_Port(); //端口初始化
//EintInit(); //外部中断初始化
INT2_7_Init(); //外部中断2-7初始化
//CCO_Init(); //CCO输出
while(1)
{
}
}
#include "config.h"
//外部中断初始化
void EintInit(void)
{
//外部中断0设置
PITS0 =PITS0&0xf3;
PITS0 |=0x04; //INT1下将沿中断
INT01_PINS = 0x00; //INT1选择P01端口
EX1=1; //打开INT1中断
EA = 1; //打开总中断
}
//外部中断1入口
void Eint1()interrupt INT1_VECTOR
{
PINTF0 &= ~0x02; //清除INT1中断标志位
P0_0 =~P0_0;
}
//外部中断2_7中断初始化
void INT2_7_Init(void)
{
PITS0 &= 0xcf;
PITS0 |= 0x30; //INT2上下升沿中断
PINTE0 |= 0x04; //使能INT2
IE1 |= 0x40; //打开INT2-7中断
EA = 1; //打开总中断
}
//外部中断2-7入口
void INT2_7() interrupt INT2_7_VECTOR
{
if(PINTF0&0x04)
{
PINTF0 &= ~0x04; //清除INT2中断标志位
P0_0 =~P0_0;
}
}
程序源码:
HC89S003F4_TEST-INT2.rar
(89.12 KB)
三、执行结果
P0.2上升和下降沿进入中断,触发LED反转,这里测试了INT2,其他的中断使用和这个方法一样 。
|