Controll MCP23S17 as GPIO

ExioMcp23s17Keypad4x4.h

Committer:
ryood
Date:
2016-11-04
Revision:
14:2073b80c69cd
Parent:
13:75af5ebeecea

File content as of revision 14:2073b80c69cd:

/*
 * MCP23S17 Keypad 4x4 class
 *
 * 2016.11.02 created
 */
 
#ifndef _EXIOMCP23S17Keypad4x4_
#define _EXIOMCP23S17Keypad4x4_

#include "mbed.h"
#include "ExioMcp23s17.h"

#define IO_DIRECTION (0b11110000)
#define IO_PULLUP    (0b00000000)
#define IO_POLARITY  (0b00000000)

class ExioMcp23s17Keypad4x4 {
public:
    ExioMcp23s17Keypad4x4(ExioMcp23s17* _pDevice, ExioPort _port) :
        pDevice(_pDevice),
        port(_port),
        keyVal(-1),
        keyBuffer(-1)
    {
        pDevice->ioDirection(port, IO_DIRECTION);
        pDevice->ioPullup(port, IO_PULLUP);
        pDevice->ioPolarity(port, IO_POLARITY);
        pDevice->writePort(port, 0x00);
    }
    
    ~ExioMcp23s17Keypad4x4() 
    {
    }
    
    void setSampleFrequency(int i) { ticker.attach_us(this, &ExioMcp23s17Keypad4x4::callback, i); }
    
    int read() { return keyVal; }
    
private:
    //------------------------------------------------------
    // keyScan1(): 押されているキー
    // return: キースキャンの結果 0..15
    //         押されていない場合は -1
    //------------------------------------------------------
    int keyScan1()
    {
      uint8_t data;
      for (int i = 0; i < 4; i++) {
        pDevice->bit(GPIOA_ADDR + port, i + 1, 1);
        data = pDevice->readPort(port);
        pDevice->bit(GPIOA_ADDR + port, i + 1, 0);
        uint8_t rv = data >> 4;
        if (rv) {
            uint8_t lv = 0;
            if      (rv & 0b0001)   lv = 0;
            else if (rv & 0b0010)   lv = 1;
            else if (rv & 0b0100)   lv = 2;
            else if (rv & 0b1000)   lv = 3;

            return (i << 2) | lv;
        }
      }
      return -1;
    }
    
    // The Ticker callback function
    void callback()
    {
        //チャタリング防止
        int v = keyScan1();
        if (v == keyBuffer) {
            keyVal = v;
        }
        keyBuffer = v;
    }
    
    Ticker ticker;
    ExioMcp23s17* pDevice;
    ExioPort port;
    int keyVal;
    int keyBuffer;
};

#endif //_MCP23S17Keypad4x4_