久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1301|回復: 1
收起左側

一段按鍵C程序供大家學習

[復制鏈接]
ID:668012 發表于 2019-12-19 17:00 | 顯示全部樓層 |閱讀模式
#include "key.h"
/*********************************************************************************
*************************MCU啟明 STM32F103MINI開發板******************************
**********************************************************************************
* 文件名稱: key.c                                                                *
* 文件簡述:按鍵掃描程序                                                         *
* 創建日期:2019.08.08                                                          *
* 版    本:V1.0                                                                 *
* 作    者:Reny Ren                                                               *
* 說    明:該按鍵掃描,包涵各種按鍵模式的掃描                                   *
**********************************************************************************
*********************************************************************************/
/**
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~按鍵模式剖析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一、按鍵返回值,即按鍵掃描結果值,分為以下幾種情況
  1、按鍵按下未抬起時的返回值,對應代碼中 keydown_data 變量的值
  2、按鍵按下抬起后才返回的值,對應代碼中 keyup_data   變量的值
  3、按任意鍵有效,只需在程序中判斷key_time>某個值,該值取決于執行一次掃描函數的
     時間長短,掃描函數時間長,相應這該值就小,反之亦然。
  4、需要長按一個鍵一段時間才執行相應的程序,就需要該鍵鍵值key_tem與key_time
     配合使用,即實現某個按鍵(key_tem)長按多久(key_time)后執行相應的程序
二、按鍵使用模式
    1、單按:按鍵按下(一直按著)只返回一次有效按鍵值
  2、連按:按鍵一直按著每執行一次按鍵掃描函數就返回一次按鍵值
  3、void key_scan(u8 mode) 中 mode   0:單按   1:連按
三、按鍵使用注意事項;
    1、當使用抬起返回值keyup_data時,按鍵的連按模式無效,因為鍵抬起才返回按鍵值,你
     按再久都沒用,所以在使用keyup_data時,模式mode必須設置為0
  2、如果需要keydown_data與key_time配合構成長按,模式mode需設置為1,才可用
  3、如果需要keyup_data與key_time配合構成長按,就要對程序作出相應的改動,在函數的
     末尾,將 key_time=0; 改為 key_tem=0;就可以使用長按一個按鍵一段時間,等時間到
    并且按鍵抬起才執行相應的代碼。不過這樣改動,按任意鍵就失效了,因為按鍵抬起沒
    把key_time清零,key_time一直有值;蛘哂脩暨是需要任意鍵有效就要自己在相應的
    代碼中把key_time清零。這種長按配合使用在實際是很少用到的。
**/
u8  keydown_data=0x00;    //按鍵按下后就返回的值
u8  keyup_data=0x00;      //按鍵抬起返回值
u16  key_time=0x00;       //按鍵按下之后的時間計數,該值乘以掃描一次按鍵函數的時間就等于按鍵按下的時間
u8  key_tem=0x00;         //長按的按鍵值與按鍵掃描程序過渡變量
u8  key_bak=0x00;         //按鍵掃描程序過渡變量
//按鍵IO口初始化函數
void KEY_Init(void)
{
    //初始化GPIOF6,7,8,9
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);   //使能GPIOF時鐘
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0 KEY1 KEY2 對應引腳
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;           //設置成上拉輸入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO口速度為50MHz
    GPIO_Init(GPIOF, &GPIO_InitStructure);                  //初始化GPIOF2,3,4
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;    // KEY3對應引腳
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0設置成輸入,默認下拉
    GPIO_Init(GPIOF, &GPIO_InitStructure);        //初始化GPIOF.5
}
/****************************************************************************
* 名    稱: void key_scan(u8 mode)
* 功    能:按鍵掃描函數
* 入口參數:mode:0:單按
                  1: 連按
* 返回參數:無
* 說    明:響應優先級,KEY0>KEY1>KEY2>KEY3
****************************************************************************/
void key_scan(u8 mode)
{
    keyup_data=0;         //鍵抬起后按鍵值一次有效
    if(KEY0==0||KEY1==0||KEY2==0||KEY3==1)   //有鍵正按下
    {
        if(KEY0==0)      key_tem=1;
        else if(KEY1==0) key_tem=2;
        else if(KEY2==0) key_tem=3;
        else if(KEY3==1) key_tem=4;
        if (key_tem == key_bak)      //有鍵按下后第一次掃描不處理,與else配合第二次掃描有效,這樣實現了去抖動
        {
            key_time++;             //有鍵按下后執行一次掃描函數,該變量加1
            keydown_data=key_tem;   //按鍵值賦予keydown_data
            if( (mode==0)&&(key_time>1) )//key_time>1按鍵值無效,這就是單按,如果mode為1就為連按
                keydown_data=0;
        }
        else                             //去抖動
        {
            key_time=0;
            key_bak=key_tem;
        }
    }
    else       //鍵抬起
    {
        if(key_time>2)            //按鍵抬起后返回一次按鍵值
        {
            keyup_data=key_tem;  //鍵抬起后按鍵值賦予keydown_data
        }
        key_bak=0;               //要清零,不然下次執行掃描程序時按鍵的值跟上次按的值一樣,就沒有去抖動處理了
        key_time=0;
        keydown_data=0;
    }
}

回復

使用道具 舉報

ID:668012 發表于 2019-12-19 17:07 | 顯示全部樓層
補發附件。。。

key.zip

2.09 KB, 下載次數: 4, 下載積分: 黑幣 -5

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操人人干 | 在线视频91| 国产精品免费一区二区三区 | 欧美一级二级三级视频 | 国产一区二区在线免费 | 国产我和子的乱视频网站 | 日韩成人性视频 | 国产一级片 | 午夜小电影 | 隔壁老王国产在线精品 | 一级黄色生活视频 | 人人做人人澡人人爽欧美 | 日韩欧美三级 | 亚欧洲精品在线视频免费观看 | 国产精品一区二区欧美黑人喷潮水 | 91一区二区三区 | 亚洲成人av在线 | 91精品国产91久久久久久密臀 | 香蕉91 | 久久精品一区二区三区四区 | 男女羞羞视频大全 | 久久国产精品精品国产色婷婷 | 亚洲日本一区二区三区四区 | 婷婷综合激情 | 欧美一区视频 | 成年人在线观看视频 | 亚洲欧美综合 | 成人在线观看免费 | 久久综合一区 | 午夜伦4480yy私人影院 | 精品国产久 | 欧美午夜一区二区三区免费大片 | 久草色视频 | 精品视频在线观看 | 永久免费在线观看 | 亚洲国产精品区 | 亚洲欧美另类在线 | 中文字幕专区 | 久久亚洲一区二区 | www视频在线观看 | 成人二区 |