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
相关产品推荐
相关产品推荐

