4x4 keypad and 7 Segment

10 Feb 2012

Hello guys,I am currently trying to display number on 7 segment LED when i enter the number using a 4 x 4 Keypad, however it seems like i just cant get it to work, I not sure why but i hope you guys can help me. Thanks in advance. Here is my code:

#include "mbed.h"
#include "keypad.h"

// input of number
BusOut     SevenSegments(p27, p26, p25, p24, p23, p22, p21);
BusOut     Leds(p28, p29, p30);
Keypad     keypad(p15, p14, p13, p12, p20, p19, p17, p16);

#define  MAXBUS    10
#define  MAXLEN     4
#define  ENDKEYIX  14

char     Keytable[] = { 0x30, 0x6D, 0x79, 0x00,
                        0x33, 0x5B, 0x5F, 0x00,
                        0x70, 0xFF, 0x7B, 0x00,
                        0x00, 0x75, 0x00, 0x00
                      };

char     BusNumber[MAXBUS][MAXLEN];
int           NumIX = 0;    // Point to current index of Bus number
volatile int  BusIX = -1;    // Point to current bus, -1, 0 .. MAXBUS - 1
volatile int  CurrBusShown = -1; // Index to BusNumber for bus number being shown
Ticker   UpdateBusNumber;
Ticker   RefreshLEDs;

/*
 * To be enabled in the main process once
 */
void UpdateBusNumberISR() {
    if (BusIX == -1)
        CurrBusShown = -1;
    else if (CurrBusShown <= BusIX) {
        CurrBusShown = ++CurrBusShown % MAXBUS;
    }
}

/*
 * To be called from a process in RTOS
 */
void RefreshLEDsISR() {
    while (1) {
        if (CurrBusShown == -1)
            Leds = 0; // Switch off all 7-segment leds
        else {
            for (int i = 0; i < MAXLEN - 1; i++) {
                Leds = 0x01 << i;
                SevenSegments = BusNumber[CurrBusShown][i];
                printf("%02X ", BusNumber[CurrBusShown][i]);
                wait_ms(200);  // Changed to Sleep(20000) in RTOS
            }
            printf("\n");
        }
    }
}

/*
 * It is an ISR within a keypad process in RTOS
 */
uint32_t cbAfterInput(uint32_t keyIX) {
    if (BusIX == MAXBUS - 1)
        return 1;  // No more space to store new bus number

    if (NumIX < MAXLEN - 1) {
        if (keyIX == ENDKEYIX) {
            NumIX = 0;
            ++BusIX;
        } else
            BusNumber[BusIX][NumIX++] = Keytable[keyIX];
    }
    return 0;
}

int main() {

    UpdateBusNumber.attach(&UpdateBusNumberISR, 5.0);
    RefreshLEDs.attach(&RefreshLEDsISR, 0.5);

    memset(BusNumber, 0, MAXBUS * MAXLEN);
    keypad.CallAfterInput(&cbAfterInput);
    keypad.Start();

    while (1) {
        printf("starting..");
        wait(1.0);
    }
}

10 Feb 2012

Maybe you need to call WFI(); instead of wait(1.0) in the while(1) loop.

10 Feb 2012

Endless loop in an ISR?