注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

chenht7的个人空间 http://home.eeworld.com.cn/space-uid-490705.html [收藏] [复制] [分享] [RSS]

日志

学STM8-2-程序-KeyScan

已有 128 次阅读2018-1-11 08:56 |个人分类:STM8

 学STM8-2-程序-KeyScan
---
2018/1/11

# 一、内容概述  
## 1.1 主要功能
这次的程序的功能主要是要进行一些新的功能,对于按键进行对应的处理。
具体需要实现的功能描述:
1. 当按钮1按下且恢复后,LED1的输出进行状态取反。
2. LED1初始状态为灭。

## 1.2 整体框架

[整体框图]

# 二、开发环境  
## 2.1 开发环境
开发环境,采用了IAR进行开发。并且目前所用的下载器和仿真器为ST-Link。而使用的硬件板子,为外购的开发核心板。

## 2.2 硬件连接

目前的硬件连接方式为:
输入引脚
Buttom1 -- PC4

输出引脚:
LED1 -- PD1

芯片的引脚说明,就直接查看ST的关于芯片的引脚说明了。目前这个程序还是比较累赘的,很多的按键信号,比如Buttom2,Buttom3,以及LED2,LED3其实都在main函数中没有用到。

# 三、库
## 3.1 调用的系统库
库的调用,需要根据实际的实验要求来进行。在这个实验中,
需要进行数据的输入和输出的功能 <-- 调用GPIO库
系统需要正常运行 <-- 调用时钟管理的CLK库

## 3.2 自编的库

自己需要进行编写的库为两个方面。
一个是关于信号的输入 <-- KeyScan.h
一个是关于信号的输出 <-- Led.h

# 四、函数
## 4.1 说明
在函数这块的说明也就只是针对于常规的几个内容进行说明而已。

## 4.2 main.c
备份数据的寄存器。可以用来写入用户数据。

```
#include "key_scan.h"
void Buttom_Init(void)
{
// Buttom1这类,已经在按键库中进行了预定义
//定义引脚PD中的Buttom1到3脚,为浮动输入无中断功能
    GPIO_Init(GPIOD,Buttom1|Buttom2|Buttom3,GPIO_MODE_IN_PU_NO_IT);
}

//按键扫描中,除了按键消抖后,在按键按下,并且按键复位后到原先状态,算是一次有效按下。
BitStatus Key_Scan(GPIO_Pin_TypeDef Buttom)
{
    //指定读取的位
    BitStatus ButtomStatus;
    //设置按键的位置电平为高电平。这个也是有前提的,就是该Buttom是采用浮动输入,电阻值较大不会烧芯片。否则推挽的话,就会导致芯片损坏。
    ButtomStatus=Buttom_OFF;
    //读取输入引脚的电平
    if(!GPIO_ReadInputPin(GPIOD,Buttom))
    {
        Delay(0x3ff);/*  消抖 */
        if(!GPIO_ReadInputPin(GPIOD,Buttom))
        {
          while(!GPIO_ReadInputPin(GPIOD,Buttom));/*松手释放*/
          ButtomStatus=Buttom_ON;
        }
    }
    return ButtomStatus;
}

void Delay(u16 nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}

```


## 4.3 led
### 4.3.1 led.h
这个库主要作为为对于一些信息进行预定义。

```
#ifndef __LED_H
#define __LED_H
#include "stm8s_gpio.h"

#define ON  0    //低电平点亮LED
#define OFF 1
#define bit_set   1  //按键输入高置位,输入低复位
#define bit_reset 0

#define led1 GPIO_PIN_1
#define led2 GPIO_PIN_2
#define led3 GPIO_PIN_3
//  #define led4 GPIO_PIN_4  目前用不到这个引脚

// 预定义就算了,不再扯了
#define LED1(ON_OFF)  if(ON_OFF==ON)GPIO_WriteLow(GPIOD,led1);\
                      else GPIO_WriteHigh(GPIOD, led1)

#define LED2(ON_OFF)  if(ON_OFF==ON)GPIO_WriteLow(GPIOD, led2);\
                      else GPIO_WriteHigh(GPIOD, led2)

#define LED3(ON_OFF)  if(ON_OFF==ON)GPIO_WriteLow(GPIOD, led3);\
                      else GPIO_WriteHigh(GPIOD, led3)

/*
#define LED4(ON_OFF)  if(ON_OFF==ON)GPIO_WriteLow(GPIOD, led4);\
                      else GPIO_WriteHigh(GPIOD, led4)
*/
void LED_Init(void);
void SetLedOFF(void);
void Led_Reverse(GPIO_Pin_TypeDef LedPins);

#endif

```

### 4.3.2 led.c


```
#include "led.h"

void LED_Init(void)
{
   GPIO_Init(GPIOD,(led1|led2|led3),\
             GPIO_MODE_OUT_PP_HIGH_FAST);//定义LED的管脚的模式,去掉了LED4
}

//输出高电平进行熄灭灯
void SetLedOFF(void)
{
    GPIO_Write(GPIOD, 0xff);
}

//对于指定端口进行取反输出,该引脚需配置为输出引脚
void Led_Reverse(GPIO_Pin_TypeDef LedPins)
{
   GPIO_WriteReverse(GPIOD, LedPins);
}
```

## 4.4 Key_Scan
### 4.4.1 Key_Scan.h
```
#ifndef  __KEY_SCAN_H
#define  __KEY_SCAN_H
#include "stm8s_gpio.h"

#define Buttom_ON   0
#define Buttom_OFF  1

#define Buttom1 GPIO_PIN_4
#define Buttom2 GPIO_PIN_5
#define Buttom3 GPIO_PIN_6

void Buttom_Init(void);//按键初始化
void Delay(u16 nCount);//延时计数
BitStatus Key_Scan(GPIO_Pin_TypeDef Buttom);//按键扫描
#endif
```

### 4.4.2 Key_Scan.c

```
#include "key_scan.h"
void Buttom_Init(void)
{
    //对于对应的按键进行初始化,设置按键
    GPIO_Init(GPIOD,Buttom1|Buttom2|Buttom3,GPIO_MODE_IN_PU_NO_IT);
}

//进行按键扫描
BitStatus Key_Scan(GPIO_Pin_TypeDef Buttom)
{
    BitStatus ButtomStatus;
    ButtomStatus=Buttom_OFF;//OFF=1
    if(!GPIO_ReadInputPin(GPIOC,Buttom))
    {
        Delay(0x3ff);/*  消抖 */
        if(!GPIO_ReadInputPin(GPIOC,Buttom))//读取输入引脚状态
        {
          while(!GPIO_ReadInputPin(GPIOC,Buttom));/*松手释放*/
          ButtomStatus=Buttom_ON;
        }
    }
    return ButtomStatus;
}

//延时函数
void Delay(u16 nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}
```

## 4.5 main.c


```
#include "stm8s.h"
#include "stm8s_clk.h"
#include "led.h"
#include "key_scan.h"

int main(void)
{
  /* Infinite loop */
  /*设置内部时钟16M为主时钟*/
 
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  /*!<Set High speed internal clock  */
  
  Buttom_Init();
  LED_Init();
  SetLedOFF();//全部输出高
  while (1)
  {
      //低端版本,其实只用到了Buttom1而已,当Buttom1按下的时候,Led1就进行反转输出,从1-0-1-0...循环
      if(!Key_Scan(Buttom1))Led_Reverse(led1);
  }
}
```


# 五、总结

目前这个项目是,当按键按下,并且弹回去的时候,对于LED的状态进行取反输出。主要学习的内容,应该是关于按键的消抖这块怎么实现吧。学过了单片机,在这个STM8S来说,其实就是看下这个状态处理的库函数如何应用。

# 参考资料

[1] 风驰iCreate嵌入式开发工作室,LED的开发文件.  
[2] 《STM8S库函数中文参考 v1.0》, BH7KQK  
[3] ST公司,《RM0016 参考手册,STM8S微控制器家族》[M].
[4] ST公司,《Access line, 16 MHz STM8S 8-bit MCU, up to 8 Kbytes Flash, data
EEPROM,10-bit ADC, 3 timers, UART, SPI, I2C》

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-7-18 07:17 , Processed in 0.018480 second(s), 11 queries , Gzip On, Redis On.

Powered by EEWORLD电子工程世界

© 2018 http://bbs.eeworld.com.cn/

返回顶部