带有XC8 v1.43的PIC16F1717,用于按键的变量

时间:2018-08-01 12:55:59

标签: c microcontroller keypad xc8

我有一个连接到PIC16F1717的端口B(RB1-RB7)的4x3矩阵键盘。我通过依次将每一行设置为高并读取列值来扫描键盘按键。可以通过匹配行和列来对按下的键进行解码。我的弹跳动作稍有延迟:

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

两个变量key和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;

    }

这也在main函数内的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

1 个答案:

答案 0 :(得分:1)

问题是您的按键上没有边缘检测。这意味着只要您按一个键,每个循环周期都将输入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
}

此代码不是完美的,但应该给出所提到的基本思想。