Test application for the library MCP23017_I2C
Dependencies: DebugLibrary MCP23017_I2C mbed
main.cpp@3:3f23faf5f7eb, 2015-01-13 (annotated)
- Committer:
- Yann
- Date:
- Tue Jan 13 10:09:13 2015 +0000
- Revision:
- 3:3f23faf5f7eb
- Parent:
- 2:83b9df729e73
Add PullUp support
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Yann | 0:1d91b4046326 | 1 | #include <string> |
Yann | 0:1d91b4046326 | 2 | #include <iostream> |
Yann | 0:1d91b4046326 | 3 | #include <iomanip> |
Yann | 0:1d91b4046326 | 4 | |
Yann | 0:1d91b4046326 | 5 | #include "MCP23017_I2C.h" |
Yann | 0:1d91b4046326 | 6 | |
Yann | 0:1d91b4046326 | 7 | /* |
Yann | 0:1d91b4046326 | 8 | * Declare functions |
Yann | 0:1d91b4046326 | 9 | */ |
Yann | 0:1d91b4046326 | 10 | void AvailableIndicator(); // LED1 flashing for program while program is alive |
Yann | 0:1d91b4046326 | 11 | DigitalOut g_availableLed(LED1); // To verify if program in running |
Yann | 0:1d91b4046326 | 12 | Ticker g_available; // LED1 will flash with a period of 2s |
Yann | 0:1d91b4046326 | 13 | char DisplayMenuAndGetChoice(); |
Yann | 1:e981573db063 | 14 | void GpioAIntr(); // Interrupt on GPIOA |
Yann | 0:1d91b4046326 | 15 | |
Yann | 0:1d91b4046326 | 16 | static CMCP23017_I2C g_gpioExp(p9, p10, 0x27, p15, p16, p17); |
Yann | 0:1d91b4046326 | 17 | |
Yann | 0:1d91b4046326 | 18 | int main() { |
Yann | 0:1d91b4046326 | 19 | // Launch available indicator |
Yann | 0:1d91b4046326 | 20 | g_available.attach(&AvailableIndicator, 2.0); |
Yann | 0:1d91b4046326 | 21 | |
Yann | 1:e981573db063 | 22 | g_gpioExp.Initialize(0x01); // GpioA<0> as input port, no interrupt mirroring, Active low |
Yann | 1:e981573db063 | 23 | g_gpioExp.setupInterruptPin(GPA0, AbstractGpioExpender::OnFalling); // A switch with pull-up is connected to GPIOA<0>, interrupt on falling mode |
Yann | 1:e981573db063 | 24 | g_gpioExp.setIntrACallback(GpioAIntr); // Set callback for interrup on GPIOA<0> |
Yann | 0:1d91b4046326 | 25 | |
Yann | 0:1d91b4046326 | 26 | while(true) { |
Yann | 0:1d91b4046326 | 27 | switch (DisplayMenuAndGetChoice()) { |
Yann | 0:1d91b4046326 | 28 | case 'a': |
Yann | 0:1d91b4046326 | 29 | g_gpioExp.write(GPB0, 1); |
Yann | 0:1d91b4046326 | 30 | break; |
Yann | 0:1d91b4046326 | 31 | case 'b': |
Yann | 0:1d91b4046326 | 32 | g_gpioExp.write(GPB0, 0); |
Yann | 0:1d91b4046326 | 33 | break; |
Yann | 0:1d91b4046326 | 34 | case 'c': |
Yann | 0:1d91b4046326 | 35 | g_gpioExp.write(GPB2, 1); |
Yann | 0:1d91b4046326 | 36 | break; |
Yann | 0:1d91b4046326 | 37 | case 'd': |
Yann | 0:1d91b4046326 | 38 | g_gpioExp.write(GPB2, 0); |
Yann | 0:1d91b4046326 | 39 | break; |
Yann | 1:e981573db063 | 40 | case 'e': |
Yann | 1:e981573db063 | 41 | g_gpioExp.write(GPB3, 1); |
Yann | 1:e981573db063 | 42 | break; |
Yann | 1:e981573db063 | 43 | case 'f': |
Yann | 1:e981573db063 | 44 | g_gpioExp.write(GPB3, 0); |
Yann | 1:e981573db063 | 45 | break; |
Yann | 1:e981573db063 | 46 | case 'g': |
Yann | 3:3f23faf5f7eb | 47 | g_gpioExp.write(GPB4, 1); |
Yann | 1:e981573db063 | 48 | break; |
Yann | 1:e981573db063 | 49 | case 'h': |
Yann | 3:3f23faf5f7eb | 50 | g_gpioExp.write(GPB4, 0); |
Yann | 3:3f23faf5f7eb | 51 | break; |
Yann | 3:3f23faf5f7eb | 52 | case 'i': |
Yann | 3:3f23faf5f7eb | 53 | g_gpioExp.write(GPB7, 1); |
Yann | 3:3f23faf5f7eb | 54 | break; |
Yann | 3:3f23faf5f7eb | 55 | case 'j': |
Yann | 1:e981573db063 | 56 | g_gpioExp.write(GPB7, 0); |
Yann | 1:e981573db063 | 57 | break; |
Yann | 3:3f23faf5f7eb | 58 | case 'r': |
Yann | 3:3f23faf5f7eb | 59 | g_gpioExp.reset(); |
Yann | 3:3f23faf5f7eb | 60 | break; |
Yann | 3:3f23faf5f7eb | 61 | case 's': { |
Yann | 2:83b9df729e73 | 62 | std::list<unsigned char> lcdBus; |
Yann | 3:3f23faf5f7eb | 63 | lcdBus.push_back(GPA7); // First item in the list |
Yann | 2:83b9df729e73 | 64 | lcdBus.push_back(GPA6); |
Yann | 2:83b9df729e73 | 65 | lcdBus.push_back(GPA5); |
Yann | 2:83b9df729e73 | 66 | lcdBus.push_back(GPA4); |
Yann | 2:83b9df729e73 | 67 | unsigned char busId = g_gpioExp.createBus(lcdBus); |
Yann | 3:3f23faf5f7eb | 68 | g_gpioExp.busWrite(busId, 0x000A); // GPA7=1, GPA6=0, GPA5=1, GPA4=0 - LSB is GPB4, MSB is GPA7 |
Yann | 3:3f23faf5f7eb | 69 | wait_us(20); |
Yann | 3:3f23faf5f7eb | 70 | g_gpioExp.busWrite(busId, 0x0000); // GPA7=1, GPA6=0, GPA5=1, GPA4=0 |
Yann | 3:3f23faf5f7eb | 71 | wait_us(20); |
Yann | 2:83b9df729e73 | 72 | g_gpioExp.deleteBus(busId); |
Yann | 2:83b9df729e73 | 73 | } |
Yann | 2:83b9df729e73 | 74 | break; |
Yann | 0:1d91b4046326 | 75 | default: |
Yann | 0:1d91b4046326 | 76 | std::cout << "Invalid user choice\r" << std::endl; |
Yann | 0:1d91b4046326 | 77 | break; |
Yann | 0:1d91b4046326 | 78 | } // End of 'switch' statement |
Yann | 0:1d91b4046326 | 79 | |
Yann | 0:1d91b4046326 | 80 | } // End of 'while' loop |
Yann | 0:1d91b4046326 | 81 | } |
Yann | 0:1d91b4046326 | 82 | |
Yann | 0:1d91b4046326 | 83 | void AvailableIndicator() |
Yann | 0:1d91b4046326 | 84 | { |
Yann | 0:1d91b4046326 | 85 | g_availableLed = !g_availableLed; |
Yann | 0:1d91b4046326 | 86 | } // End of AvailableIndicator |
Yann | 0:1d91b4046326 | 87 | |
Yann | 0:1d91b4046326 | 88 | char DisplayMenuAndGetChoice() |
Yann | 0:1d91b4046326 | 89 | { |
Yann | 0:1d91b4046326 | 90 | char value; |
Yann | 0:1d91b4046326 | 91 | std::cout << "\r" << std::endl << "\r" << std::endl << "MCP23017_I2C v0.1\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 92 | std::cout << "\tSet MUX_EN1 (PortB-0) :\t\ta\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 93 | std::cout << "\tUnset MUX_EN1 (PortB-0) :\t\tb\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 94 | std::cout << "\tSet MUX_ADDR0 (PortB-2) :\t\tc\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 95 | std::cout << "\tUnset MUX_ADDR0 (PortB-2) :\t\td\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 96 | std::cout << "\tSet MUX_ADDR1 (PortB-3) :\t\te\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 97 | std::cout << "\tUnset MUX_ADDR1 (PortB-3) :\t\tf\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 98 | std::cout << "\tSet MUX_ADDR2 (PortB-4) :\t\tg\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 99 | std::cout << "\tUnset MUX_ADDR2 (PortB-4) :\t\th\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 100 | std::cout << "\tSet BOARD_EN (PortB-7) :\t\ti\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 101 | std::cout << "\tUnset BOARD_EN (PortB-7) :\t\tj\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 102 | std::cout << "\tReset device :\t\tr\r" << std::endl; |
Yann | 3:3f23faf5f7eb | 103 | std::cout << "\tBus test :\t\ts\r" << std::endl; |
Yann | 0:1d91b4046326 | 104 | std::cout << "Enter your choice: " << std::flush; |
Yann | 0:1d91b4046326 | 105 | value = getchar(); |
Yann | 0:1d91b4046326 | 106 | std::cout << "\r" << std::endl; |
Yann | 0:1d91b4046326 | 107 | return value; |
Yann | 0:1d91b4046326 | 108 | } |
Yann | 1:e981573db063 | 109 | |
Yann | 1:e981573db063 | 110 | void GpioAIntr() { |
Yann | 1:e981573db063 | 111 | unsigned char gpioId, gpioValue; |
Yann | 1:e981573db063 | 112 | wait(0.6); // Debounce timer |
Yann | 3:3f23faf5f7eb | 113 | g_gpioExp.getLastInterruptPinAndValue(&gpioId, &gpioValue); // Get interrupt info and clear it |
Yann | 1:e981573db063 | 114 | std::cout << "\r" << std::endl << "GpioAIntr: interrupt on pin #" << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(gpioId) << " - value: " << static_cast<unsigned int>(gpioValue) << "\r" << std::endl; |
Yann | 1:e981573db063 | 115 | } |
Yann | 1:e981573db063 | 116 |