我有一个4x3矩阵键盘,连接到PIC16F1717的端口B(RB1-RB7(。我通过依次将每一行设置为高,并读取列值来扫描键盘按压。按下的键可以通过匹配行和列进行解码。我将在短时间内退出:
while(1)
{
//scan for key presses
__delay_ms(10);
ROW1 = 1;
ROW2 = 0;
ROW3 = 0;
ROW4 = 0;
if (COL1 == 1)
{
__delay_ms(100);
if (COL1 == 1)
{
key = 1;
keyCount = keyCount ++ 1;
}
}
else if (COL2 == 1)
{
__delay_ms(100);
if (COL2 == 1)
{
key = 2;
keyCount = keyCount + 1;
}
}
//and so on for the other rows and columns
两个变量键和keyCount分别记录按下的键和按下的键数。当按下4个键时,我想执行以下代码:
if (keyCount == 4)
{
LED = 1;
__delay_ms(500);
LED = 0;
__delay_ms(500);
LED = 1;
__delay_ms(500);
LED = 0;
__delay_ms(500);
LED = 1;
__delay_ms(500);
servoDemo();
__delay_ms(500);
LED = 0;
keyCount = 0;
}
这也在主函数内部的while(1(循环中。我遇到的问题是递增keyCount不起作用。以前,我尝试过keyCount++,它有效,但在此之前,它也不起作用。我尝试通过设置keyCount=4而不是将其递增1来进行调试,结果成功了。
这两个变量都在主函数内部声明(并初始化(,但在while(1(循环之外。此外,我定义了以下内容:
//pin definitions
//////////////////////////
#define ROW1 PORTBbits.RB2
#define ROW2 PORTBbits.RB7
#define ROW3 PORTBbits.RB6
#define ROW4 PORTBbits.RB4
#define COL1 PORTBbits.RB3
#define COL2 PORTBbits.RB1
#define COL3 PORTBbits.RB5
#define SERVOSIG PORTDbits.RD0
#define LED PORTDbits.RD1
问题是您的键上没有边缘检测。这意味着,只要按下一个键,if语句就会在每个循环周期中输入。这里有一个小例子,可以让您了解如何实现循环检测的基本概念。
int key[12];
int key_old[12];
read_keys(key); //function that reads the keys in
while(1)
{
memcpy(key_old, key, 12*sizeof(key[0])); //copy key to key_old
read_keys(key); //function that reads the keys in
for(int i=0;i<12;i++)
{
if(key[i] && !key_old[i])
{
//positive edge on key i
}
}
__delay_ms(50); //Debouncing
}
这段代码并不完美,但应该给出一个基本的想法。