STC实验箱4
IAP15W4K58S4
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
硬知识
摘自《STC库函数使用参考》
外中断初始化函数
Ext_Inilize
EXTI_InitTypeDef的定义见于文件"Exti.H"。
typedef struct
{
u8 EXTI_Mode;
u8 EXTI_Polity;
u8 EXTL_Interrupt;
} EXTI_InitTypeDef;
EXTI_Mode:设置外中断的工作模式:初始化INT0、INT1时的取值,初始化INT2,INT3.INT4时忽略,固定为下降沿中断。
EXTI_Polity:中断的优先级:初始化INT0、INT1时的取值,初始化INT2,INT3,INT4时忽略,固定为低优先级中断。
EXTI_Interrupt:中断允许或禁止:
测试
main.c
#include "./Drivers/config.h"
#include "./Drivers/delay.h"
#include "./Drivers/GPIO.h"
#include "./Drivers/Exti.h"
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_InitStructure.Pin = GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO, 或操作
GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //P1.6、P1.7初始化为推挽输出
GPIO_Inilize(GPIO_P4,&GPIO_InitStructure); //P4.6、P4.7初始化为推挽输出
GPIO_InitStructure.Pin = GPIO_Pin_2 | GPIO_Pin_3; //指定要初始化的IO, 或操作
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //P3.2、P3.3初始化为上拉输入
P32 = 1;
P33 = 1;
}
void EXTI_config(void)
{
EXTI_InitTypeDef EXTI_InitStructure; //结构定义
EXTI_InitStructure.EXTI_Mode = EXT_MODE_Fall; //中断模式, EXT_MODE_RiseFall, EXT_MODE_Fall
EXTI_InitStructure.EXTI_Polity = PolityLow; //中断优先级, PolityLow,PolityHigh
EXTI_InitStructure.EXTI_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
Ext_Inilize(EXT_INT0,&EXTI_InitStructure); //初始化INT0 EXT_INT0,EXT_INT1,EXT_INT2,EXT_INT3,EXT_INT4
Ext_Inilize(EXT_INT1,&EXTI_InitStructure); //初始化INT0 EXT_INT0,EXT_INT1,EXT_INT2,EXT_INT3,EXT_INT4
}
bit P32_Flag = 0;
bit P33_Flag = 0;
void main(void)
{
u8 Dir_Flag = 0;
u8 LED_Port = 0;
u8 i = 0;
GPIO_config();
EXTI_config();
EA = 1;
while(1)
{
if (P32_Flag)
{
delay_ms(20);
if (P32 == 0)
{
Dir_Flag = 0;
}
while (P32 == 0);
P32_Flag = 0;
}
if (P33_Flag)
{
delay_ms(20);
if (P33 == 0)
{
Dir_Flag = 1;
}
while (P33 == 0);
P33_Flag = 0;
}
if (Dir_Flag)
{
LED_Port >>= 1;
if ((LED_Port & 0x0f) == 0x00)
LED_Port = 0x08;
}
else
{
LED_Port <<= 1;
if ((LED_Port & 0x0f) == 0x00)
LED_Port = 0x01;
}
P17 = (((~LED_Port) & 0x01) != 0);
P16 = (((~LED_Port) & 0x02) != 0);
P47 = (((~LED_Port) & 0x04) != 0);
P46 = (((~LED_Port) & 0x08) != 0);
i = 25;
while (P32 && P33 && i--)
delay_ms(20);
}
}
Exti.c
修改Exti.c中的中断服务函数:
/********************* INT0中断函数 *************************/
void Ext_INT0 (void) interrupt INT0_VECTOR //进中断时已经清除标志
{
extern bit P32_Flag;
P32_Flag = 1;
}
/********************* INT1中断函数 *************************/
void Ext_INT1 (void) interrupt INT1_VECTOR //进中断时已经清除标志
{
extern bit P33_Flag;
P33_Flag = 1;
}
实验现象同上一个实验。
上一篇:【STC15库函数上手笔记】4、USART串口
下一篇:【STC15库函数上手笔记】2、GPIO
推荐阅读最新更新时间:2024-11-08 10:28
设计资源 培训 开发板 精华推荐
- 安全管家
- AM1D-4812DH30-RZ ±12V 1 瓦 DC-DC 转换器的典型应用
- LTC3785-1 的典型应用 - 具有电源良好状态的 10V、高效率、降压-升压型控制器
- EVB-USB4604,USB4604 USB 2.0 集线器控制器评估板
- LT3467AIS6 4 节电池至 5V SEPIC 转换器的典型应用
- LT1940 的典型应用 - 双路单片式 1.4A、1.1MHz 降压型开关稳压器
- 使用 Richtek Technology Corporation 的 RT8080 的参考设计
- 具有双输入的 LTC3126IFE 3.3V、2MHz 降压转换器的典型应用电路
- 超声波探测器
- AM1G-0518SZ 18V 1 瓦 DC-DC 转换器的典型应用