注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

耳朵的博客

做自己想做的人

 
 
 

日志

 
 

STM8S-Discovery第四个程序 - 4*4矩阵键盘  

2010-10-02 15:41:14|  分类: STM8 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
整个工程下载:

Keypad.h:
/******** STM8S 4*4矩阵键盘程序 ********
* 版本.........: 1.1
* 作者.........: 陈利栋
* 目标.........: STM8S
* 文件名.......: Keypad.h
* 编译器.......: IAR for STM8 V1.1
* 创建时间.....: 2010.10.02
* 最后修改.....: 2010.10.08
***************************************/
#ifndef __KEYPAD_H__
#define __KEYPAD_H__

#include "main.h"
#include "delay.h"

#define KEYPAD_DDR    PB_DDR
#define KEYPAD_ODR    PB_ODR
#define KEYPAD_CR1    PB_CR1
#define KEYPAD_CR2    PB_CR2
#define KEYPAD_IDR    PB_IDR


/* 以下3个值根据实际情况调整 */
#define KEY_READY_COUNT               1000          // 检测按键稳定持续的次数

#define KEY_CONTINUE_START_COUNT      20000         // 检测连续按键开始需要的次数

#define KEY_CONTINUE_RUNNING_COUNT    1000          // 连续按键间隔检测次数


#define KEY_NULL                      0xff


static inline void _null_func(void{ }           // 空函数
#define NULL_FUNC                     _null_func  // 空函数宏定义

extern void KeypadPoll(void);                       // 键盘轮询
extern unsigned char key_continue_flag;             // 连续按键标记

// 键盘按键函数指针声明
extern void (*p_Key_1)(void);
extern void (*p_Key_2)(void);
extern void (*p_Key_3)(void);
extern void (*p_Key_4)(void);
extern void (*p_Key_5)(void);
extern void (*p_Key_6)(void);
extern void (*p_Key_7)(void);
extern void (*p_Key_8)(void);
extern void (*p_Key_9)(void);
extern void (*p_Key_0)(void);
extern void (*p_Key_A)(void);
extern void (*p_Key_B)(void);
extern void (*p_Key_C)(void);
extern void (*p_Key_D)(void);
extern void (*p_Key_Xing)(void);
extern void (*p_Key_Jin)(void);
extern void (*p_Key_A_B)(void);


#define NULL_FUNC2       ((void(*)(unsigned char))NULL_FUNC)

// 任意按键按下或弹起的函数指针声明
extern void (*p_Key_Down)(unsigned char c);
extern void (*p_Key_Up)(unsigned char c);


#endif /* __KEYPAD_H__ */

Keypad.c:
/******** STM8S 4*4矩阵键盘程序 ********
* 版本.........: 1.1
* 作者.........: 陈利栋
* 目标.........: STM8S
* 文件名.......: Keypad.c
* 编译器.......: IAR for STM8 V1.1
* 创建时间.....: 2010.10.02
* 最后修改.....: 2010.10.08
***************************************/
#include "Keypad.h"

static unsigned char _key_last = KEY_NULL;
static unsigned int  _key_count = 0;
static unsigned int  _key_continue_count = 0;

unsigned char key_continue_flag = 0;

// 矩阵键盘函数指针
void (*p_Key_1)(void= NULL_FUNC;
void (*p_Key_2)(void= NULL_FUNC;
void (*p_Key_3)(void= NULL_FUNC;
void (*p_Key_4)(void= NULL_FUNC;
void (*p_Key_5)(void= NULL_FUNC;
void (*p_Key_6)(void= NULL_FUNC;
void (*p_Key_7)(void= NULL_FUNC;
void (*p_Key_8)(void= NULL_FUNC;
void (*p_Key_9)(void= NULL_FUNC;
void (*p_Key_0)(void= NULL_FUNC;
void (*p_Key_A)(void= NULL_FUNC;
void (*p_Key_B)(void= NULL_FUNC;
void (*p_Key_C)(void= NULL_FUNC;
void (*p_Key_D)(void= NULL_FUNC;
void (*p_Key_Xing)(void= NULL_FUNC;
void (*p_Key_Jin)(void= NULL_FUNC;
void (*p_Key_A_B)(void= NULL_FUNC;

void (*p_Key_Down)(unsigned char c= NULL_FUNC2;
void (*p_Key_Up)(unsigned char c= NULL_FUNC2;

unsigned char _hex_to_ascii(unsigned char h)
{
    switch (h)
    {
        case 0xEB : return '0';
        case 0x77 : return '1';
        case 0x7B : return '2';
        case 0x7D : return '3';
        case 0xB7 : return '4';
        case 0xBB : return '5';
        case 0xBD : return '6';
        case 0xD7 : return '7';
        case 0xDB : return '8';
        case 0xDD : return '9';
        case 0x7E : return 'A';
        case 0xBE : return 'B';
        case 0xDE : return 'C';
        case 0xEE : return 'D';
        case 0xE7 : return '*';
        case 0xED : return '#';
        default   : return ' ';
    }
}

static inline unsigned char _keypad_scan(void)
{
    unsigned char temp = 0;

    KEYPAD_ODR = 0x00;  // 输出低电平

    KEYPAD_DDR = 0x0f;  // 高4位输入,低4位输出
    KEYPAD_CR1 = 0xf0;  // 高4位上拉输入,低4位开漏输出
    _delay_us(3);
    temp = KEYPAD_IDR;
    KEYPAD_CR1 = 0x00;

    KEYPAD_DDR = 0xf0;  // 高4位输出,低4位输入
    KEYPAD_CR1 = 0x0f;  // 高4位开漏输出,低4位上拉输入
    _delay_us(3);
    temp |= KEYPAD_IDR;
    KEYPAD_CR1 = 0x00;

    if (temp != _key_last)
    {
        _key_count++;
        if (_key_count >= KEY_READY_COUNT)
        {
            if (temp == KEY_NULL)
            {
                p_Key_Up(_hex_to_ascii(_key_last));
            }
            _key_last = temp;
            _key_count = 0;
            return _key_last;
        }
        key_continue_flag = 0;
_key_continue_count = 0;
    }
    else
    {
        if (_key_last != KEY_NULL)
        {
            _key_continue_count++;
            if (key_continue_flag == 0)
            {
                if (_key_continue_count >= KEY_CONTINUE_START_COUNT)
                {
                    key_continue_flag = 1;
                    _key_continue_count = 0;
                    return _key_last;
                }
            }
            else
            {
                if (_key_continue_count >= KEY_CONTINUE_RUNNING_COUNT)
                {
                    _key_continue_count = 0;
                    return _key_last;
                }
            }
        }
        _key_count = 0;
    }

    return KEY_NULL;
}


void KeypadPoll(void)
{
    unsigned char temp = _keypad_scan();
    if (temp == KEY_NULL)
    {
        return ;
    }
    p_Key_Down(_hex_to_ascii(temp));
    switch (temp)
    {
        case KEY_NULLbreak;
        case 0xEBp_Key_0(); break;
        case 0x77p_Key_1(); break;
        case 0x7Bp_Key_2(); break;
        case 0x7Dp_Key_3(); break;
        case 0xB7p_Key_4(); break;
        case 0xBBp_Key_5(); break;
        case 0xBDp_Key_6(); break;
        case 0xD7p_Key_7(); break;
        case 0xDBp_Key_8(); break;
        case 0xDDp_Key_9(); break;
        case 0x7Ep_Key_A(); break;
        case 0xBEp_Key_B(); break;
        case 0xDEp_Key_C(); break;
        case 0xEEp_Key_D(); break;
        case 0xE7p_Key_Xing(); break;  // *
        case 0xEDp_Key_Jin();  break;  // #
        case 0x3Ep_Key_A_B();  break;  // A + B 组合键
        // 此处添加其它组合键
        default  : break;
    }
}
AVR 矩阵键盘程序源代码(原创) - 耳朵 - 耳朵的博客
  评论这张
 
阅读(1981)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017