【问题标题】:AVR keyboard COM-08653 issueAVR 键盘 COM-08653 问题
【发布时间】:2023-05-25 08:49:02
【问题描述】:

我试图弄清楚如何使用 Atmega 32 从我的 COM-08653 键盘读取输入。电路视图和一些 arduino 教程让我简要了解了它的外观。 不幸的是,我没有得到任何意见,我也不知道为什么。

char test()
{
    char result = 0;
    for (int col = 0; col < COLS; col++)    
    {
        PORTD |= (1 << colPinMap[col]);
        for (int row = 0; row < ROWS; row ++)   
        {
            int pattern = 1 << rowPinMap[row];
            if((PIND & 0b1111) == pattern)
            {
                char debounce = 0;
                for(int db = 0; db < 10; db++)
                {
                    _delay_ms(1);
                    if((PIND & 0b1111) != pattern)
                    {
                        debounce = 1;
                        break;
                    }
                }
                if(!debounce)
                {
                    PORTA = 1 << 3;     //testing if the press is beeing noticed
                    while((PIND & 0b1111) == pattern) ;
                    PORTA = 0b0000;
                    result = keymap[row][col];
                }
            }
        }
        PORTD &= ~(1 << colPinMap[col]);
    }
    return result;
}

我已经尝试过多次使用不同的代码,但它不起作用。 我检查了这个键盘,它工作正常,我还检查了列和行是否连接正确。不幸的是,我确信这一点。

这是端口配置:

#define COLS 3
#define ROWS 4
char keymap[COLS][ROWS] = 
{
    { '1', '2', '3' },
    { '4', '5', '6' },
    { '7', '8', '9' },
    { '*', '0', '#' }
};
int colPinMap[COLS] = { 4, 5, 6 };
int rowPinMap[ROWS] = { 0, 1, 2, 3 };
keyConfig()
{
    DDRD = 0xf0;
    PORTD = 0x0f;
    //PORTD = 0x00;
    DDRA = 0xff;
    _delay_ms(2000);
}

什么也没发生,我不知道为什么。感谢您的帮助。

【问题讨论】:

    标签: c microcontroller avr avr-gcc atmega


    【解决方案1】:

    如果这可能对任何人有用,我已经解决了这个问题。 端口 D(低半字节)被设置为输入,然后被拉高。当输入引脚被拉起时,我读错了它们的状态。要找到已按下的键,需要找到 LOW 状态,而我试图找到 HIGH 状态。 解决方案如下所示: 将列处理输出设置为 HIGH 状态, 对于 ecery 列: 将当前列输出状态设置为 LOW, 然后找到具有 LOW 状态的行输入。

    由于我没有找到很多关于 AVR 使用 COM-08653 的描述(互联网上的大多数示例都是为 arduino 制作的),我为您提供了一个示例:

    #define COLS 3
    #define ROWS 4
    char keymap[ROWS][COLS] = 
    {
        { '1', '2', '3' },
        { '4', '5', '6' },
        { '7', '8', '9' },
        { '*', '0', '#' }
    };
    int colPinMap[COLS] = { 4, 5, 6 };
    int rowPinMap[ROWS] = { 0, 1, 2, 3 };
    
    
    void keyConfig()
    {
        DDRA = 0xff;
        DDRC = 0xf0;        //0 - 3 => input / 4 - 7 => output
        PORTC = 0x0f;       // output => LOW / input => PULL UP
    }
    
    char readKey()
    {
        char result = 0;
        for (int col = 0; col < COLS; col++)
        {
            PORTC = 0xff ^(1 << colPinMap[col]);
            for (int row = 0; row < 4; row++)
            {
                if ((PINC & 0b1111) == (0b1111 ^ (1 << row)))
                {
                    char isBouncing = 0;
                    for (int db = 0; db < 5; db++)
                    {
                        if((PINC & 0b1111) != (0b1111 ^ (1 << row)))
                        {
                            isBouncing = 1;
                            break;
                        }
                        if(!isBouncing)
                        {
                            while((PINC & 0b1111) == (0b1111 ^ (1 << row))) ;
                            result = keymap[row][col];
                        }
                    }
                }
            }
        }
        return result;
    }
    

    这只是一个例子,问题可能会以不同的方式解决。 它正在工作(在设备上检查)。包含简单的去抖动机制。

    【讨论】: