找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2552|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

我的風(fēng)格,板級(jí)驅(qū)動(dòng),定期更新

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71922 發(fā)表于 2015-1-10 02:34 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
//☆☆☆☆☆☆張小強(qiáng)☆☆☆☆☆
//日期:2014/12/27/21:00-22:30
//版本:V0.1
//僅供參考
#include<stm8s105k4.h>
#include"key.h"
/////////////////8位輸入IO定義
#define KEYIO_01  0x01
#define KEYIO_02  0x02
#define KEYIO_04  0x04
#define KEYIO_08  0x08
#define KEYIO_10  0x10
#define KEYIO_20  0x20
#define KEYIO_40  0x40
#define KEYIO_80  0x80
//按鍵首次按下最小有效時(shí)間  連續(xù)按下觸發(fā)最小有效時(shí)間  連續(xù)按下?tīng)顟B(tài)下最小反應(yīng)時(shí)間
#define  keysonetime  2                //首次進(jìn)入的最小時(shí)間段
#define  keysltime    50        //進(jìn)入長(zhǎng)按狀態(tài)的最小時(shí)間段
#define  keyslrtime                10        //長(zhǎng)按狀態(tài)下反應(yīng)速度
#define  keyshtime    10        //松開(kāi)的最小保持時(shí)間
/////////PD口所用到的IO  1 2 3 4
#define   KEYIO_PC  (KEYIO_02|KEYIO_04|KEYIO_08|KEYIO_10)
/////////PC口所用到的IO  0 2
#define   KEYIO_PD        (KEYIO_01|KEYIO_04)

#define   KEY_PC  PC_IDR & KEYIO_PC  //過(guò)濾沒(méi)有選擇的端口
#define   KEY_PD  PD_IDR & KEYIO_PD
//識(shí)別的按鍵有效次數(shù)
unsigned  char key1num=0;
//按鍵確定有效標(biāo)志位
_Bool key1flag=0;
//按鍵首次觸發(fā)時(shí)間
unsigned char  key1time=0;
//按鍵松開(kāi)狀態(tài)保持時(shí)間
unsigned char  key1timeh=0;
//按鍵連續(xù)觸發(fā)時(shí)間條件
unsigned char  key1Ltime=0;
//按鍵處于連續(xù)觸發(fā)時(shí)反應(yīng)時(shí)間
unsigned char  key1rtime=0;
//按鍵允許檢測(cè)標(biāo)志位  1 允許檢測(cè) 0 不允許檢測(cè) 每次檢測(cè)后自動(dòng)置0
_Bool  keystartflag=0,keysenable=0;   //根據(jù)按鍵靈敏度需要特定時(shí)間內(nèi)置1將啟動(dòng)按鍵檢測(cè)
/*
*        KEYGPIO_Config ()  可外部調(diào)用
* 初始化板級(jí)按鍵端口
* 無(wú)返回值
*/
void   KEYGPIO_Config(void)//端口配置
{
        PC_ODR&=~KEYIO_PC;
        PC_DDR&=~KEYIO_PC;
        PC_CR2&=~KEYIO_PC;
        PC_CR1|=KEYIO_PC;
       
        PD_ODR&=~KEYIO_PD;
        PD_DDR&=~KEYIO_PD;
        PD_CR1&=~KEYIO_PD;
        PD_CR1|=KEYIO_PD;
}

//下文給出一個(gè)按鍵的源碼供參考,包含短按 長(zhǎng)按 松開(kāi)以上都會(huì)觸發(fā)事件發(fā)生

/*
*按鍵檢測(cè)函數(shù) 在循環(huán)中調(diào)用
*根據(jù)keystartflag確定函數(shù)是否執(zhí)行
*
*/
void  keysstart(void)
{
        if(keystartflag)
        {
                //端口c
                if((KEY_PC&KEYIO_02)==0x00)//是否有檢測(cè)到低電平
                {
                        if(key1flag==0)                                                //是否已經(jīng)檢測(cè)到當(dāng)前的低電平
                        {
                                key1time++;                                                        //記錄狀態(tài)保持時(shí)間
                                if(key1time>keysonetime)//是否達(dá)到首次按下的最小有效時(shí)間
                                {
                                        key1flag=1;                                                //更新標(biāo)志位
                                        key1time=0;                                                //清楚記錄的保持時(shí)間
                                        key1num++;                                                //按鍵事件++
                                        key1timeh=keyshtime;        //將按鍵松開(kāi)保持時(shí)間賦值
                                        key1Ltime=0;                                        //長(zhǎng)按保持時(shí)間累積清零
                                }
                        }
                        if((key1Ltime<keysltime))key1Ltime++;        //是否低于長(zhǎng)按檢測(cè)條件
                                else                                                                                                                                                 //進(jìn)入長(zhǎng)按狀態(tài)
                                {
                                        key1rtime++;                                                                                                        //長(zhǎng)按反應(yīng)時(shí)間累積
                                        if(key1rtime>keyslrtime)                                                        //是否到達(dá)長(zhǎng)按反應(yīng)時(shí)間的最小值
                                        {
                                                key1rtime=0;                                                                                                //清楚記錄時(shí)間                                               
                                                key1num++;                                                                                                        //按鍵事件++                                       
                                        }
                                }
                }
                else if(key1timeh>0)//是否已經(jīng)進(jìn)入松開(kāi)狀態(tài)并保持設(shè)置時(shí)間
                        {
                                key1timeh--;        //記錄本狀態(tài)保持時(shí)間
                                key1Ltime=0;        //清除按下?tīng)顟B(tài)保持時(shí)間的記錄值
                                key1time=0;
                                if(key1timeh==0)//到達(dá)松開(kāi)狀態(tài)下的最小保持時(shí)間
                                {
                                        key1flag=0;                //允許下次按鍵的按下
                                        key1rtime=0;//清除長(zhǎng)按下?tīng)顟B(tài)保持時(shí)間的記錄值
                                        key1num++;
                                }
                        }
                keystartflag=0;
        }
       
}
/*
*讀取當(dāng)前按鍵的事件數(shù)
*指針是外部調(diào)用函數(shù)的應(yīng)用變量
*調(diào)用后事件值自動(dòng)清零
*/
void   readkeysstatus(unsigned char  *key1ststus)
{
        *key1ststus=key1num;
        key1num=0;
}
/*
*使用按鍵外設(shè),并初始化
*使能后開(kāi)始按鍵檢測(cè)工作
*
*/
void usekeys(void)
{
        keysenable=1;
        key1num=0;
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:19715 發(fā)表于 2015-1-10 11:09 | 只看該作者
謝謝樓主共享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表