You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PICSimLab中PIC18F4580矩阵键盘扫描异常问题求助

PIC18F4580矩阵键盘扫描异常,操作PORT引脚可解决问题

我在PICSimLab的PICGenios开发板上使用PIC18F4580 MCU开发矩阵键盘。

相关代码

matrix_keypad.h

#ifndef MATRIX_KEYPAD_H
#define MATRIX_KEYPAD_H

#define ROW1 PORTDbits.RD0
#define ROW2 PORTDbits.RD1
#define ROW3 PORTDbits.RD2
#define ROW4 PORTDbits.RD3

#define COL1 PORTBbits.RB0
#define COL2 PORTBbits.RB1
#define COL3 PORTBbits.RB2

#define DEBOUNCE_DELAY 400

void init_switch(void);
unsigned char scan_keypad(void);
unsigned char debounce_signal();

#endif

matrix_keypad.c

#include <xc.h>
#include "matrix_keypad.h"

void init_switch() {
    //digital pins.
    ADCON1 = 0xFF;
    
    //set first three bits as input & rest as output for PORTB.
    TRISB = 0x07;
    
    //set up PORTB internal pull-ups.
    RBPU = 0;

    //set PORTD as output.
    TRISD = 0;

    //set all row bits.
    ROW1 = ROW2 = ROW3 = ROW4 = 1;
}

unsigned char scan_keypad() {

    unsigned char ret_val = 0;

    //scan keys on row 1.
    ROW1 = 0;
    if (!COL1)
        ret_val = 1;
    if (!COL2)
        ret_val = 2;
    if (!COL3)
        ret_val = 3;
    ROW1 = 1;

    //scan keys on row 2.
    ROW2 = 0;
    if (!COL1)
        ret_val = 4;
    if (!COL2)
        ret_val = 5;
    if (!COL3)
        ret_val = 6;
    ROW2 = 1;

    //scan keys on row 3.
    ROW3 = 0;
    if (!COL1)
        ret_val = 7;
    if (!COL2)
        ret_val = 8;
    if (!COL3)
        ret_val = 9;
    ROW3 = 1;

    //scan keys on row 4.
    ROW4 = 0;
    if (!COL1)
        ret_val = 10;
    if (!COL2)
        ret_val = 11;
    if (!COL3)
        ret_val = 12;
    ROW4 = 1;

    /*if (ret_val)
        PORTBbits.RB6 = 1;              -----------why tho?
    else
        PORTBbits.RB6 = 0;*/

    return ret_val;
}

main.c

#include <xc.h>
//#include "clcd.h"
#include "matrix_keypad.h"

void main(void) {

    init_switch();
    for (unsigned int i = 0; i < 1000; ++i);

    while (1) {
        if (scan_keypad()) {
            PORTBbits.RB7 = 1;
        } else {
            PORTBbits.RB7 = 0;
        }
    }

    return;
}

问题现象

预期按住矩阵键盘任意按键时,main.c中的scan_keypad()调用会返回非零值,但实际RB7 LED以约50%的占空比闪烁,说明scan_keypad()的返回值在零和非零之间交替变化。

当在scan_keypad()返回前添加以下代码后,问题消失,函数恢复正常:

if (ret_val)
    PORTBbits.RB6 = 1;
else
    PORTBbits.RB6 = 0;

操作任意PORT引脚都能解决此问题,恳请帮助。


内容的提问来源于stack exchange,提问作者Abhishek A Udupa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:35:28