整个工程下载:
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_NULL: break;
case 0xEB: p_Key_0(); break;
case 0x77: p_Key_1(); break;
case 0x7B: p_Key_2(); break;
case 0x7D: p_Key_3(); break;
case 0xB7: p_Key_4(); break;
case 0xBB: p_Key_5(); break;
case 0xBD: p_Key_6(); break;
case 0xD7: p_Key_7(); break;
case 0xDB: p_Key_8(); break;
case 0xDD: p_Key_9(); break;
case 0x7E: p_Key_A(); break;
case 0xBE: p_Key_B(); break;
case 0xDE: p_Key_C(); break;
case 0xEE: p_Key_D(); break;
case 0xE7: p_Key_Xing(); break; // *
case 0xED: p_Key_Jin(); break; // #
case 0x3E: p_Key_A_B(); break; // A + B 组合键
// 此处添加其它组合键
default : break;
}
}

评论