stm8s开发(六) EXIT的使用:做一个外部中断的按钮!
2016-09-16 23:44
302 查看
在前几篇文章,GPIO的使用:点亮LED!中只讲述了IO口的输出,并没有输入,因为IO作为输入我建议采用中断方式,可以大大减轻CPU的运行时间。最常用的就是按钮的功能了,当然还有和其他芯片通信的功能。
前篇文章讲过GPIO可以通过寄存器设置为中断输入。(参考http://blog.csdn.net/devintt/article/details/50818494)
这里我们选用PC3作为外部中断
void EXIT_GPIO_Init(void)
{
PC_DDR &= 0xf7;
PC_CR1 |= 0x08; // 将PC3设置成中断上拉输入
PC_CR2 |= 0x08;
EXTI_CR1 = 0x20; //PC设置为下降沿触发
}
这里需要注意的是,中断向量指定的是PC,也就是说如果有几个PC口都设置为中断的话,只要其中一个中断响应,就会进入同一个函数。
如果你有好几个按键在同一个port口的话,可以在进入中断函数之后做一个IO口状态的获取,判定哪个IO进行了中断,再对应相应的操作。
#pragma vector = EXIT_PORTC_vector //0x07
__interrupt void EXIT_PORTC_RQHandler(void) //中断服务函数
{
if((PC_IDR & 0x08)==0)
{
delay_nms(50); //延时50ms,消抖
if((PC_IDR & 0x08)==0) //再判断是否按下
{
while(!(PC_IDR & 0x08)); //松手检测
//TODO
}
}
} 由于使用了机械按钮,一般都会有一个机械抖动的过程,所以进入了中断函数之后,我们先做一个消抖处理,这样就可以判断按钮的状态,同时也防止抖动造成了多次中断函数的反复进入。最后加入松手检测,判定按钮动作完成。(TODO这里就可以加入你需要的操作了)
附上stm8s在IAR环境下的项目工程,包括了SPI、IIC、PWM、AWU、USART、EEPROM等片上硬件的初始化代码。
http://download.csdn.net/detail/devintt/9454188
前篇文章讲过GPIO可以通过寄存器设置为中断输入。(参考http://blog.csdn.net/devintt/article/details/50818494)
配置模式 | DDR | CR1 | CR2 | 配置模式 | 上拉电阻 |
输入 | 0 | 0 | 0 | 悬浮输入 | OFF |
0 | 1 | 0 | 上拉输入 | ON | |
0 | 0 | 1 | 中断悬浮输入 | OFF | |
0 | 1 | 1 | 中断上拉输入 | ON | |
输出 | 1 | 0 | 0 | 开漏输出 | OFF |
1 | 1 | 0 | 推挽输出 | ||
1 | x | 1 | 输出(最快速度10MHZ) | ||
x | x | x | 真正的开漏输出 | 未采用 |
void EXIT_GPIO_Init(void)
{
PC_DDR &= 0xf7;
PC_CR1 |= 0x08; // 将PC3设置成中断上拉输入
PC_CR2 |= 0x08;
EXTI_CR1 = 0x20; //PC设置为下降沿触发
}
这里需要注意的是,中断向量指定的是PC,也就是说如果有几个PC口都设置为中断的话,只要其中一个中断响应,就会进入同一个函数。
如果你有好几个按键在同一个port口的话,可以在进入中断函数之后做一个IO口状态的获取,判定哪个IO进行了中断,再对应相应的操作。
#pragma vector = EXIT_PORTC_vector //0x07
__interrupt void EXIT_PORTC_RQHandler(void) //中断服务函数
{
if((PC_IDR & 0x08)==0)
{
delay_nms(50); //延时50ms,消抖
if((PC_IDR & 0x08)==0) //再判断是否按下
{
while(!(PC_IDR & 0x08)); //松手检测
//TODO
}
}
} 由于使用了机械按钮,一般都会有一个机械抖动的过程,所以进入了中断函数之后,我们先做一个消抖处理,这样就可以判断按钮的状态,同时也防止抖动造成了多次中断函数的反复进入。最后加入松手检测,判定按钮动作完成。(TODO这里就可以加入你需要的操作了)
附上stm8s在IAR环境下的项目工程,包括了SPI、IIC、PWM、AWU、USART、EEPROM等片上硬件的初始化代码。
http://download.csdn.net/detail/devintt/9454188
相关文章推荐
- 【EFM32开发笔记】GPIOE外部中断使用
- 开发一个好项目:二、actvity简便跳转,创建菜单按钮,正确使用fragment
- STM32之中断与事件---一个使用GPIO作为外部中断的示例
- iphone开发之UIButton按钮的使用(二)拖线实现 多个按钮用同一个监听方法实现
- 【SDK驱动开发1】中断的使用(以一个dma为例)
- java开发系统内核:使用一个中断实现多个API调用
- 一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
- 使用C#开发一个简单的P2P应用
- 如何使用java程序界面上的按钮启动外部的exe程序
- 使用C#开发一个简单的P2P应用
- 使用python为Java项目开发一个预编译脚本
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 抢先体验Atlas--一个使用Atlas模板开发的AtlasWeb实验
- 通过一个简单的SWING日历BEAN开发学习Calendar类的使用(2)JCalendar源代码
- [webservices开发]使用XFire开发一个简单的web服务
- 使用Remoting开发分布式应用(四) ——采用回调实现一个聊天程序
- 使用C#开发一个简单的P2P应用
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 使用C#开发一个简单的P2P应用
- 一个初级的使用GDI+开发的颜色拾取器用户控件