- 打卡等级:以坛为家II
- 打卡总天数:443
- 最近打卡:2025-05-09 10:10:53
已绑定手机
金牌会员
- 积分
- 1619
|
发表于 2024-5-27 22:57:59
|
显示全部楼层
本帖最后由 未元星系 于 2024-5-27 22:59 编辑
自学开天斧第⑤课:
学习内容:1、外部中断
学习简介:STC8H8K64U单片机内置五个外部中断,INT0,INT1,INT2,INT3,INT4;分别对应引脚:P3.2,P3.3,P3.6,P3.7,P3.0;分别对应中断号:interrupt 0,2,10,11,16;
其中INT0和INT1即支持上升沿/下降沿中断(同时支持两种方式引发中断),也支持下降沿中断,INT2,INT3,INT4只支持下降沿中断。
外部INT0,INT1所连引脚正好为两个独立按键,本次实验:主函数执行死循环,设INT0,INT1为下降沿触发,若P3.3按键按下,LED交替闪烁两回合;若P3.2按下,LED闪烁两次
程序代码:
#define MAIN_Fosc 24000000L
void Delay_ms(unsigned int ms)
{
unsigned int i;
do{
i = MAIN_Fosc / 10000;
while(--i);
}while(--ms);
}
void main()
{
P2M0 = 0x00; P2M1 = 0x00; //P2口设为准双向口模式
P3M0 = 0x00; P3M1 = 0x00; //P3口设为准双向口模式
P2 = 0xff; //熄灭全部LED
P2 |= 0x30; //P3.2, P3.3口设为高电平
IT0 = 1; //外部中断0设置为下降沿触发(若IT0=1则设置为上升沿+下降沿触发)
EX0 = 1; //使能INT0
IT1 = 1; //外部中断1设置为下降沿触发(若IT1=1则设置为上升沿+下降沿触发)
EX1 = 1; //使能INT1
EA = 1; //打开总中断
while(1){} //死循环
}
void INT0_Routine(void) interrupt 0
{
P2 = 0x55;Delay_ms(150);
P2 = 0xAA;Delay_ms(150);
P2 = 0x55;Delay_ms(150);
P2 = 0xAA;Delay_ms(150);
P2 = 0xff;
}
void INT1_Routine(void) interrupt 2
{
P2 = 0x00;Delay_ms(100);
P2 = 0xff;Delay_ms(100);
P2 = 0x00;Delay_ms(100);
P2 = 0xff;Delay_ms(100);
}
代码现象:P3.3按键按下,LED交替闪烁两回合;P3.2按下,LED闪烁两次
存在问题:按键按下会产生抖动,目前外部中断里的消抖本人目前也没完全弄明白,所以此程序可能会导致按一下按键触发多次中断的现象。
|
|