AVR 独立按键

独立按键可以配置成中断或者扫描模式,独立按键最多允许配置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”]

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]