kbdio.c

来自「该应用软件可以实现大多数单片机的仿真实验」· C语言 代码 · 共 67 行

C
67
字号
/*********************************************************************
**********************************************************************
*****                                                             ****
*****         L A B C E N T E R    E L E C T R O N I C S          ****
*****                                                             ****
*****                  PIC 18F452 Keypad Scanner                  ****
*****                                                             ****
**********************************************************************
*********************************************************************/

// Rows are connected to Port B 
// Columns are connected to Port D with external pull-up resistors.

#include "calc.h"
#include "p18f452.h"

CHAR keycodes[16] = {'7','8','9','/','4','5','6','*','1','2','3','-','.','0','=','+'};

CHAR keypadread()
// Find a key, wait for it to be released and return.
 { CHAR key = scankeypad();
   if (key)
      while (scankeypad() != 0)
         /* Nothing */  ;  
   return key;
 } 

CHAR scankeypad()
// Scan the keypad for a keypress.
// Return 0 for no press or the char pressed.
 { INT8 row,col,tmp;
   CHAR key=0;
	INT wait;

   // Disable ADC functionality on Port A
   ADCON1 = 6; 

   // Initialise Port for input, and PORTC for output
   TRISD = PORTB = 0xFF;
   TRISB = 0;

   for (row=0; row < KEYP_NUM_ROWS; row++)
    { // Drive appropriate row low and read columns:
      PORTB = ~(1 << row);
      for (wait=0; wait<100; ++wait)
         ;
      tmp = PORTD;
    
      // See if any column is active (low):
      for (col=0; col<KEYP_NUM_COLS; ++col)
         if ((tmp & (1<<col)) == 0)
          { INT8 idx = (row*KEYP_NUM_COLS) + col;
            key = keycodes[idx]; 
            goto DONE;
          }

    }
   DONE:

   // Disable Port Drive and return.
   TRISB = 0xFF;
   return key;
 }



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?