六。矩阵按键 行列扫描返回端口数值,然后 采用论坛三行代码,返回键值后判断按键简单点灯灭灯测试效果,主函数每20毫秒扫描一次,可以正常点亮熄灭,健壮性有待后续验证。
#define KEY P0
static void KeyDelay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
static unsigned char KeyScan()
{
unsigned char keynum = 0xff ;
KEY = 0xf0;
KeyDelay();
keynum = KEY & 0xf0;
KEY = 0x0f;
KeyDelay();
keynum |= (KEY & 0x0f);
// keynum = keynum ^ 0xff;
return keynum;
}
unsigned char KeyVal(void)
{
static unsigned char s_keyStateLast;
static unsigned char s_keyStateNow;
unsigned char keyval=0;
unsigned char readKeyPort=0;
readKeyPort = (KeyScan()) ^ 0xff; //1111 11111
s_keyStateNow = readKeyPort & (readKeyPort ^ s_keyStateLast);
s_keyStateLast = readKeyPort;
keyval = s_keyStateNow;
return keyval;
}
void MatrixKey(void)
{
unsigned char key =KeyVal();
if (key == 0x81)
P65 = 0;
if (key== 0x82)
P65 = 1;
if (key == 0x84)
P66 = 0;
if (key == 0x88)
P66 = 1;
if (key == 0x41)
P67 = 0;
if (key == 0x42)
P67 = 1;
}
static Task_t g_task[] =
{
//状态 计数 重装 函数
{0,20, 20,MatrixKey},
/* Add new task here */
};
复制代码
Your browser does not support video tags.