本帖最后由 芯圣电子官方QQ 于 2023-7-24 15:04 编辑
HC89S003P芯片外部中断1测试。在P01引脚上外接按键,驱动P00端口输出LED,可以实现上升沿、下降沿、低电平和高电平中断测试。
一、手册有关外部中断1寄存器
1.1、手册中有关外部中断的介绍。
HC89S003F4有4个外部中断向量入口,外部中断0~1分别有一个独立的中断向量入口,外部中断2~7共用一个中断向量入口,外部中断8~15共用一个中断向量入口,因而共有16个外部中断端口输入,所有
的中断都可以设定4种触发方式,分别为上升沿、下降沿、双沿及低电平。当调用中断服务程序后,外部中断0~15标志必须软件清除。如果中断服务完成后而外部中断仍旧维持,则会产生下一次中断。
上面红色的字体注意,进入中断后必须清楚中断标志位,否则下次不能再进入中断。
1.2、有关的寄存器
和通用单片机相同的IP中断优先级这里不关注,主要看和其他不同的寄存器设置
1.2.1、外部中断电平选择寄存器
我这里使用的外部中断1,设置时关注下面框内的数据。来选择外部中断电平。
1.2.2、外部中断标志寄存器,主要注意下面的位,进入中断后要把此位清零
1.2.3、外部中断1引脚选择寄存器,这里选择P0.1口
二、程序部分
2.1、main.c
//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(); //端口初始化
<b> EintInit(); //外部中断初始化</b>
//CCO_Init(); //CCO输出
while(1)
{
}
}
2.2、外部中断初始化 #include "config.h"
bit ei0=0;
//外部中断初始化
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.3、端口设置
//port.c
#include "config.h"
void Init_Port(void)
{
//P0xM[3:0]
//0000 -- 输入(非施密特)
//0001 -- 带下拉输入(非施密特)
//0010 -- 带上拉输入(非施密特)
//0011 -- 模拟输入
//0100 -- 输入(施密特)
//0101 -- 带下拉输入(施密特)
//0110 -- 带上拉输入(施密特)
//0111 -- 保留(模拟输入)
//1x00 -- 推挽输出
//1x01 -- 开漏输出
//1x10 -- 开漏带上拉输出
// P0M1 = P0M1&0xF0|0x00; //P02设置为输入(无SMT)
P0M0 = P0M0&0xF0|0x08; //P00设置为推挽输出
P0M0 = P0M0&0x0F|0x60; //P01设置为带上拉输入(施密特)
P0M1 = P0M1&0xF0|0x02; //P02设置为带上拉输入(非施密特)
P1M0 = P1M0&0x0F|0x80; //P11设置为推挽输出
}
三、执行结果
通过PITS0 |=0x04; //INT1下将沿中断 这个设置来改变中断触发方式。
我设置的是下降沿中断,每次按下按键瞬间,LED输出电平发生反转。进入中断后一定要清除相应的中断标志位,否则,就再也进不去中断了。
|