打印
[STM8]

实验分享-【STM8-SO8】03-GPIO按键输入

[复制链接]
396|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在 STM8-SO8-DISCO 板上的使用者 LED 对应 STM8S001J3 器件的安排是在 PA3 高电位输出点亮,而使用者按键是在 PC3 电路上有安排下拉电阻。而我在面包板上的接法 LED 也是在 PA3 高电位点亮,使用者按键也是在 PC3,不过我不接下拉电阻而是配置 PC3 有上拉电阻。



在上一个 LAB 当中使用到了 SWIM 这根管脚,因此程序的开始做了一些必要的设定与延迟,不过目前所要实现的功能都不使用 pin8 这根管脚,所以程序中先移除这部份的代码。

(一)
第一个程序先来实现一个最简单的 GPIO 输入输出功能,程序读取 PC3 按键状态并直接输出到 PA5 上的 LED。

管脚定义:
  • #define LED_GPIO_PORT  (GPIOA)
  • #define LED_GPIO_PINS  (GPIO_PIN_3)
  • #define KEY_GPIO_PORT  (GPIOC)
  • #define KEY_GPIO_PINS  (GPIO_PIN_3)


[color=rgb(51, 102, 153) !important]复制代码


main 回圈:
  • void main(void)
  • {
  •   GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  •   GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);
  •   while (1)
  •   {
  •     if(GPIO_ReadInputPin(KEY_GPIO_PORT, KEY_GPIO_PINS))
  •     {
  •       GPIO_WriteHigh(LED_GPIO_PORT, LED_GPIO_PINS);
  •     }
  •     else
  •     {
  •       GPIO_WriteLow(LED_GPIO_PORT, LED_GPIO_PINS);
  •     }
  •   }
  • }


[color=rgb(51, 102, 153) !important]复制代码


按键放开时由于有上拉电阻所以输入状态为 1,直接输出给 LED 因此 LED 是亮起的状态,按键按下时 LED 熄灭。

源代码:
B03.rar (715.63 KB, 下载次数: 4)

(二)
第二个程序实现外部中断的功能,当按下按键时翻转 LED 状态。在前面的程序中我们只使用到基本的 GPIO 功能,因此工程里只载入了 stm8s_gpio.c 库函数:



不过这一次需要使用到中断功能,因此要再载入 stm8s_exti.c 库函数。



PC3 设定成有上拉电阻并具有中断输入功能,中断的方式为下降沿触发,并开启中断功能。

main 回圈:
  • void main(void)
  • {
  •   GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  •   GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_MODE_IN_PU_IT);
  •   EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
  •   // enable Interrupt
  •   enableInterrupts();
  •   while (1)
  •   {
  •   }
  • }


[color=rgb(51, 102, 153) !important]复制代码


PORTC 的中断处理程序在 stm8s_it.c 这里:
  • INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
  • {
  •   /* In order to detect unexpected events during development,
  •      it is recommended to set a breakpoint on the following instruction.
  •   */
  •   // for De-Bounce
  •   uint16_t dly = 2000;
  •   while(dly--);
  •   GPIO_WriteReverse(LED_GPIO_PORT, LED_GPIO_PINS);
  • }


[color=rgb(51, 102, 153) !important]复制代码


大部份的例程在进入按键中断后都会运行一个延时功能,这主要的目的是要消除按键动作的弹跳 (Bounce) 现象,这种处理方式并不太正确,不过目前我们只是想了解中断的动作,因此也先这样用了。

按下按键时 LED 的显示状态会翻转,不过有时候还是会有误动作,这主要还是按键弹跳的问题了。

源代码:
B04.rar (825.4 KB, 下载次数: 6)

(三)
第三个程序是使用按键去改变 LED 闪烁的速度,程序中宣告了一个全局变量 cnt_s ,按键中断时改变 cnt_s 变量,该变量为 LED 闪烁的延时参数。

main 回圈:
  • void main(void)
  • {
  •   uint16_t cnt;
  •   cnt_s = 65000;
  •   GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  •   GPIO_Init(KEY_GPIO_PORT, KEY_GPIO_PINS, GPIO_MODE_IN_PU_IT);
  •   EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
  •   // enable Interrupt
  •   enableInterrupts();
  •   while (1)
  •   {
  •     GPIO_WriteReverse(LED_GPIO_PORT, LED_GPIO_PINS);
  •     cnt = cnt_s;
  •     while(cnt--);
  •   }
  • }


[color=rgb(51, 102, 153) !important]复制代码


中断处理程序:
  • INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
  • {
  •   /* In order to detect unexpected events during development,
  •      it is recommended to set a breakpoint on the following instruction.
  •   */
  •   // for De-Bounce
  •   uint16_t dly = 2000;
  •   while(dly--);
  •   cnt_s -= 10000;
  •   if(cnt_s <= 5000)
  •     cnt_s = 65000;
  • }


[color=rgb(51, 102, 153) !important]复制代码


程序运行时将全局变量 cnt_s 设定为 65000,每按一下按键就将 cnt_s 减 10000,当 cnt_s 小于或等于 5000 时重新设定为 65000。
本文转载于【STM8-SO8】03-GPIO按键输入
http://www.stmcu.org.cn/module/forum/thread-619340-1-1.html



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:每天都要开心呀

210

主题

505

帖子

4

粉丝