独立按键可以配置成中断或者扫描模式,独立按键最多允许配置8个,详细见配置节
0.引用
[codesyntax lang=”c”]
#include "direct_key.h"
[/codesyntax]
1.板级配置
这些常量应该使用define语句写入globalcfg.h中
配置的常量 | 定义 |
DIRECT_KEY_INT | 配置是否启用按键中断,如果启用,将所有按键用与非门连接后连接至INT0或INT1。当连接至INT0时,该常量设置为1,为INT1时设置为2 |
DIRECT_KEY_NUM | 独立按键的数量,这个数值应该小于8 |
DIRECT_KEY_PORT | 接至独立按键的第一个引脚,如果启用中断,不能使用PD |
DIRECT_KEY_INT_ALL | 在配置为中断模式时,是否扫描全部按键,如果设置为1,将会返回数组,详细请参见函数:set_direct_key_isr |
2.函数
初始化函数
这个函数不需要任何参数,根据配置的常量进行初始化。请在setup()中调用。
[codesyntax lang=”c”]
这个函数不需要任何参数,根据配置的常量进行初始化。请在setup()中调用。
[codesyntax lang=”c”]
direct_key_setup();
[/codesyntax]
中断初始化函数
请将函数名(函数指针)作为参数传递!!
[codesyntax lang=”c”]
set_direct_key_isr(function_name);
[/codesyntax]
当DIRECT_KEY_INT_ALL常量被配置为1的时候,函数将会接收2个参数,分别为按键编号的数组和长度。
当DIRECT_KEY_INT_ALL配置为0的时候,函数仅接收一个按键编号的数值。
按键扫描函数
以下两个函数仅在中断没有开启的时候可以使用。
[codesyntax lang=”c”]
uchar key_scan_loop(void); uchar key_scan_loop_all(uchar* result)
[/codesyntax]
第一个函数用于扫描单个按键,如果按键没有放开,函数将不会返回任何值,直到按键放开。如果LED的显示没有采用中断形式,LED显示将会关闭。
第一个函数将在按键松开后返回按键的编号。如果没有按键按下将会返回0xff
第二个函数用来扫描所有已经按下的按键,当需要支持多个按键同时按下时可以用这个函数扫描。为了防止数组下标溢出,result的长度至少为DIRECT_KEY_NUM。这个函数将会返回按下按键的个数,没有任何按键按下时返回0,请注意,如果没有清空这个数组(全部置0xff),可能会导致意外的错误。
3.示例
中断模式
[codesyntax lang=”c”]
//初始化,扫描单个按键 void setup() { direct_key_setup(); set_direct_key_isr(key_pressed); } void key_pressed(uchar keyno) { static int value; switch(keyno) { case 0: value++; break; case 1: value--; break; default: value*=10+keyno+1; } }
[/codesyntax]
扫描模式
[codesyntax lang=”c”]
//初始化,扫描单个按键 void setup() { direct_key_setup(); } void loop() { uchar keyvalue; keyvalue=key_scan_loop(); key_pressed(key_value); } void key_pressed(uchar keyno) { static int value; switch(keyno) { case 0: value++; break; case 1: value--; break; default: value*=10+keyno+1; } }
[/codesyntax]