OSDN Git Service

[UI][Key] Add input-keymatrix support @low-level.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 21 Jun 2013 00:34:46 +0000 (09:34 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 21 Jun 2013 00:34:46 +0000 (09:34 +0900)
idle.c
iodef.h
ioports.c
ioports.h
lcd_acm1602.h
main.c
nbproject/Makefile-genesis.properties
ui.c
ui.h

diff --git a/idle.c b/idle.c
index 312ff1b..7cb6bb2 100644 (file)
--- a/idle.c
+++ b/idle.c
@@ -51,6 +51,7 @@ void idle(unsigned int initial)
 {
    unsigned char osccon;
    unsigned char  contword;
+   unsigned int i;
 
    /* Enable IDLE */
    osccon = OSCCON;
@@ -64,9 +65,12 @@ void idle(unsigned int initial)
    contword = _T0PS0 | _T0PS1 | _T0PS2 | _TMR0ON; // Prescaler = 1:256.
    //contword =  _T0PS2 | _TMR0ON; // Pre-scakler is 1:32.
    //TMR0H = initial >> 8;
+   i = initial;
    TMR0L = initial & 0xff;
    TMR0H = initial >> 8; // Write order : L->H
    T0CON = contword;
-   
-   Sleep();
+   do {
+       Sleep();
+       i = TMR0H << 8 + TMR0L; // Check if IDLE-Timer was elapsed.
+   } while(i < 3); // Dead area : 0-2.
 }
diff --git a/iodef.h b/iodef.h
index c9539f3..dc4fb06 100644 (file)
--- a/iodef.h
+++ b/iodef.h
@@ -128,7 +128,18 @@ extern "C" {
 #define _FM_STATLAMP  LATAbits.LATA5
 #define _POW_STATLAMP LATDbits.LATD3
 
-
+#define _KEY_SENDPORT LATA
+#define _KEY_RECVPORT PORTB
+#define _KEY_GRP1MASK 0x01
+#define _KEY_GRP2MASK 0x02
+#define _KEY_GRP3MASK 0x04
+#define _KEY_GRP4MASK 0x08
+#define _KEY_SENDPORTMASK (_KEY_GRP1MASK | _KEY_GRP2MASK | _KEY_GRP3MASK | _KEY_GRP4MASK)
+#define _KEY_POS1MASK 0x01
+#define _KEY_POS2MASK 0x02
+#define _KEY_POS3MASK 0x04
+#define _KEY_POS4MASK 0x08
+#define _KEY_RECVPORTMASK (_KEY_POS1MASK | _KEY_POS2MASK | _KEY_POS3MASK | _KEY_POS4MASK)
 
 typedef  union {
     struct {
@@ -152,19 +163,8 @@ typedef  union {
     unsigned BIT2D:1;
     unsigned BIT3D:1;
 
-    /*
-     * special keys
-     */
-    unsigned BIT0F:1;
-    unsigned BIT1F:1;
-    unsigned BIT2F:1;
-    unsigned BIT3F:1;
-    unsigned :1;
-    unsigned :1;
-    unsigned :1;
-    unsigned :1;
     };
-    unsigned char byte[3];
+    unsigned char byte[2];
 } keyin_defs;
 
 enum {
@@ -185,10 +185,7 @@ enum {
     charcode_e,
     charcode_f,
     charcode_0,
-    charcode_s0, // RB1
-    charcode_s1, // RB2
-    charcode_s2, // RB3
-    charcode_s3, // Reserve
+    // Special keys was removed.
 };
 
 /*
index 748480b..b38c721 100644 (file)
--- a/ioports.c
+++ b/ioports.c
@@ -26,6 +26,9 @@
  */
 
 #include "ioports.h"
+#include <signal.h>
+
+unsigned char statecount;
 
 void set_amlamp(unsigned char f)
 {
@@ -89,6 +92,28 @@ void lcd_setbacklight(unsigned char flag, unsigned char level)
 #endif
 }
 
+void TMR3_set(void)
+{
+    TMR3L = 1000 & 0xff;
+    TMR3H = 1000 >> 8;
+    T3CONbits.TMR3ON = 1;
+}
+
+void io_intcountinit(void)
+{
+    statecount = 0;
+    T3CON = 0b10001100; // TMR3 = 16bit, CCP is not use TMR3, Prescaler=1:2(1uS)
+                        // DO-not-use SYNC, Internal clock, TMR3 temporally off.
+    PIR2bits.TMR3IF = 0;
+    PIE2bits.TMR3IE = 1;
+    IPR2bits.TMR3IP = 0; // Low priority.
+    INTCONbits.PEIE = 1;
+    RCONbits.IPEN = 0;
+    TMR3L = 0;
+    TMR3H = 0;
+    TMR3_set();
+}
+
 void lcd_backlightinit(void)
 {
 #if 0
@@ -129,6 +154,8 @@ void keyin_ioinit(void)
     LATC = 0x00;
     ANSELC = AN_C_VAL;
     TRISC = TRIS_C_VAL_O;
+    lcd_backlightinit();
+    io_intcountinit();
 }
 #endif
 
@@ -153,6 +180,8 @@ void keyin_ioinit(void)
     PORTC = 0x00;
     LATC = 0x00;
     TRISC = TRIS_C_VAL_O;
+    lcd_backlightinit();
+    io_intcountinit();
 }
 #endif
 
@@ -187,6 +216,7 @@ void keyin_ioinit(void)
     PORTE = 0x00;
     TRISE = TRIS_E_VAL;
     lcd_backlightinit();
+    io_intcountinit();
 }
 #else
 void keyin_ioinit(void)
@@ -205,5 +235,152 @@ void keyin_ioinit(void)
     PORTC = 0x00;
     LATC = 0x00;
     TRISC = TRIS_C_VAL_O;
+    lcd_backlightinit();
+    io_intcountinit();
 }
 #endif
+
+/*
+ * Read IOPORTS for KEY. You should modify if you modify circuit.
+ */
+void readkey_io(unsigned char state)
+{
+    char i;
+    unsigned char portvar;
+    unsigned char latchvar;
+
+    switch(state) {
+        case 0:
+            for(i = 0; i < 2; i++){
+                keyin_old[1].byte[i] = keyin_old[0].byte[i];
+                keyin_old[0].byte[i] = keyin_now.byte[i];
+                keyin_now.byte[i] = 0x00;
+            }
+            latchvar = _KEY_SENDPORT;
+            latchvar &= ~_KEY_GRP1MASK;
+            _KEY_SENDPORT = latchvar; // Group1 DOWN.
+            break;
+        case 1:
+            portvar = _KEY_RECVPORT;
+            if((portvar & _KEY_POS1MASK) == 0) {
+                keyin_now.BIT0A = 1;
+            } else {
+                keyin_now.BIT0A = 0;
+            }
+            if((portvar & _KEY_POS2MASK) == 0) {
+                keyin_now.BIT1A = 1;
+            } else {
+                keyin_now.BIT1A = 0;
+            }
+            if((portvar & _KEY_POS3MASK) == 0) {
+                keyin_now.BIT2A = 1;
+            } else {
+                keyin_now.BIT2A = 0;
+            }
+            if((portvar & _KEY_POS4MASK) == 0) {
+                keyin_now.BIT3A = 1;
+            } else {
+                keyin_now.BIT3A = 0;
+            }
+            latchvar = _KEY_SENDPORT;
+            latchvar |= _KEY_GRP1MASK;
+            _KEY_SENDPORT = latchvar; // Group1 UP.
+            break;
+        case 2:
+            latchvar = _KEY_SENDPORT;
+            latchvar &= ~_KEY_GRP2MASK;
+            _KEY_SENDPORT = latchvar; // Group2 DOWN.
+            break;
+        case 3:
+            portvar = _KEY_RECVPORT;
+            if((portvar & _KEY_POS1MASK) == 0) {
+                keyin_now.BIT0B = 1;
+            } else {
+                keyin_now.BIT0B = 0;
+            }
+            if((portvar & _KEY_POS2MASK) == 0) {
+                keyin_now.BIT1B = 1;
+            } else {
+                keyin_now.BIT1B = 0;
+            }
+            if((portvar & _KEY_POS3MASK) == 0) {
+                keyin_now.BIT2B = 1;
+            } else {
+                keyin_now.BIT2B = 0;
+            }
+            if((portvar & _KEY_POS4MASK) == 0) {
+                keyin_now.BIT3B = 1;
+            } else {
+                keyin_now.BIT3B = 0;
+            }
+            latchvar = _KEY_SENDPORT;
+            latchvar |= _KEY_GRP2MASK;
+            _KEY_SENDPORT = latchvar; // Group1 UP.
+            break;
+        case 4:
+            latchvar = _KEY_SENDPORT;
+            latchvar &= ~_KEY_GRP3MASK;
+            _KEY_SENDPORT = latchvar; // Group2 DOWN.
+            break;
+        case 5:
+            portvar = _KEY_RECVPORT;
+            if((portvar & _KEY_POS1MASK) == 0) {
+                keyin_now.BIT0C = 1;
+            } else {
+                keyin_now.BIT0C = 0;
+            }
+            if((portvar & _KEY_POS2MASK) == 0) {
+                keyin_now.BIT1C = 1;
+            } else {
+                keyin_now.BIT1C = 0;
+            }
+            if((portvar & _KEY_POS3MASK) == 0) {
+                keyin_now.BIT2C = 1;
+            } else {
+                keyin_now.BIT2C = 0;
+            }
+            if((portvar & _KEY_POS4MASK) == 0) {
+                keyin_now.BIT3C = 1;
+            } else {
+                keyin_now.BIT3C = 0;
+            }
+            latchvar = _KEY_SENDPORT;
+            latchvar |= _KEY_GRP3MASK;
+            _KEY_SENDPORT = latchvar; // Group1 UP.
+            break;
+        case 6:
+            latchvar = _KEY_SENDPORT;
+            latchvar &= ~_KEY_GRP4MASK;
+            _KEY_SENDPORT = latchvar; // Group2 DOWN.
+            break;
+        case 7:
+            portvar = _KEY_RECVPORT;
+            if((portvar & _KEY_POS1MASK) == 0) {
+                keyin_now.BIT0D = 1;
+            } else {
+                keyin_now.BIT0D = 0;
+            }
+            if((portvar & _KEY_POS2MASK) == 0) {
+                keyin_now.BIT1D = 1;
+            } else {
+                keyin_now.BIT1D = 0;
+            }
+            if((portvar & _KEY_POS3MASK) == 0) {
+                keyin_now.BIT2D = 1;
+            } else {
+                keyin_now.BIT2D = 0;
+            }
+            if((portvar & _KEY_POS4MASK) == 0) {
+                keyin_now.BIT3D = 1;
+            } else {
+                keyin_now.BIT3D = 0;
+            }
+            latchvar = _KEY_SENDPORT;
+            latchvar |= _KEY_GRP4MASK;
+            _KEY_SENDPORT = latchvar; // Group4 UP.
+
+            break;
+        default:
+            break;
+    }
+}
index 0fe606d..1c2881f 100644 (file)
--- a/ioports.h
+++ b/ioports.h
 
 #include <sdcc-lib.h>
 #include <pic18fregs.h> /* ONLY FOR PIC18x */
+#include <signal.h>
 
 #include "iodef.h"
 #include "idle.h"
+#include "ui.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -43,7 +45,11 @@ extern void set_fmlamp(unsigned char f);
 extern void set_powerlamp(unsigned char f);
 extern void lcd_setbacklight(unsigned char flag, unsigned char level);
 extern void keyin_ioinit(void);
+extern void io_intcountinit(void);
+extern void TMR3_set(void);
 
+extern void readkey_io(unsigned char state);
+extern unsigned char statecount;
 #ifdef __cplusplus
 }
 #endif
index b4fb656..f353bf0 100644 (file)
@@ -48,8 +48,8 @@ extern "C" {
 #define _ACM1602_SHORT_WAIT()     delay100tcy(4)
 // Wait 5ms
 #define _ACM1602_LONG_WAIT()     delay10ktcy(40)
-// Wait 50ms
-#define _ACM1602_LONG_LONG_WAIT()     delay10ktcy(40)
+// Wait 125ms
+#define _ACM1602_LONG_LONG_WAIT()     delay1mtcy(1)
 // Wait 5.5ms
 #define _ACM1602_I2C_WAIT()     delay1ktcy(44)
 
diff --git a/main.c b/main.c
index 4d052ca..e98ede7 100644 (file)
--- a/main.c
+++ b/main.c
@@ -84,8 +84,6 @@ SIGHANDLER(TMR0_handler)
    t0con &= ~_IDLEN;
    T0CON = t0con;
 
-   // Read IOKEYS
-//   readkey_io();
 
    // Clear interrupt flag
    tmr0f = INTCON;
@@ -95,9 +93,23 @@ SIGHANDLER(TMR0_handler)
    return;
 }
 
+/*
+ * Interrupt wake up every 1ms.
+ */
+SIGHANDLER(TMR3_Handler)
+{
+    if(statecount >= 8) statecount = 0;
+    readkey_io(statecount);
+    statecount++;
+    if(statecount > 7) readkey_compare(); // Compare and push to fifo.
+    PIR2bits.TMR3IF  = 0;
+    PIE2bits.TMR3IE  = 1;
+    TMR3_set();
+}
 
 DEF_INTLOW(intlow_handler)
   DEF_HANDLER(SIG_TMR0, TMR0_handler)
+//  DEF_HANDLER(SIG_TMR3, TMR3_Handler)
 END_DEF
 
 
@@ -653,7 +665,7 @@ void main_menu(void)
         } while(input_flag == 0);
 
         c = pop_keyinfifo();
-        if((c < charcode_1) || ( c >charcode_s3)) {
+        if((c < charcode_1) || ( c > charcode_0)) {
             idle(0xff00);
             continue; // Error
         }
@@ -882,10 +894,9 @@ int main(void)
     unsigned char power_flag;
 #endif
 //    OSCCON =  (_IDLEN & 0b11111100) | 0b00111000;
-
+    idle_init();
     keyin_init();
     keyin_ioinit();
-    idle_init();
 
     //i2c1_init();
 
@@ -909,49 +920,22 @@ int main(void)
 #if 1
     i = 10001;
     do {
-#if 1
-        LATA |= 0x0f;
-        idle(65535-256);
-        LATA &= 0xfe;
-        idle(65535-256);
-        pa = PORTB;
-
-        LATA |= 0x0f;
-        idle(65535-256);
-        LATA &= 0xfd;
-        idle(65535-256);
-        pb = PORTB;
-
-        LATA |= 0x0f;
-        idle(65535-256);
-        LATA &= 0xfb;
-        idle(65535-256);
-        pc = PORTB;
-
-        LATA |= 0x0f;
-        idle(65535-256);
-        LATA &= 0xf7;
-        idle(65535-256);
-        pd = PORTB;
-        _LOCATE(0,0);
-        print_numeric_nosupress(pa, 3);
-        _PUTCHAR(' ');
-        print_numeric_nosupress(pb, 3);
-        _LOCATE(0,1);
-        print_numeric_nosupress(pc, 3);
-        _PUTCHAR(' ');
-        print_numeric_nosupress(pd, 3);
-#endif
         ClrWdt();
         set_fmlamp(i & 1);
         set_amlamp(i & 1);
         set_powerlamp(i & 1);
-        lcd_setbacklight(0xff, 0);
         i = i + 1;
         idle(65535-7128/10 + 1);
+        c = readkey();
+        _LOCATE(0,0);
+//        if(c == charcode_null) _PUTCHAR('p');
+        while(c != charcode_null) {
+            _PUTCHAR(c + '0');
+            c = pop_keyinfifo();
+        }
     }while(1);
 #else
-//    idle(0xffff);
+    idle(0xf800);
     switch(load_eeprom()) {
         case 0x01: // No magic-word
             idle(65535-7128*2+1);
@@ -961,15 +945,19 @@ int main(void)
             printstr("EEPROM FORMATTING");
             _LOCATE(0,1);
             printstr("Press any key");
+            c = charcode_null;
             do {
-                input_flag = readkey_compare();
+                c = readkey();
                 idle(ui_idlecount);
+//                _CLS();
+                _LOCATE(0,0);
+                _PUTCHAR(c + '0');
                 ClrWdt();
-            } while(input_flag == 0);
+            } while(c == charcode_null);
             _CLS();
             _LOCATE(0,0);
             printstr("Formatting...");
-            c = pop_keyinfifo();
+            _LOCATE(0,0);
             format_eeprom(0,254);
             save_eeprom();
             break;
@@ -980,15 +968,17 @@ int main(void)
             printstr("X-) Sum Error");
             _LOCATE(0,1);
             printstr("Press any key to format");
+            c = charcode_null;
             do {
-                input_flag = readkey_compare();
-                idle(0xff80);
-            } while(input_flag == 0);
+                _CLS();
+                c = readkey();
+                idle(ui_idlecount);
+                _PUTCHAR(c + '0');
+                ClrWdt();
+            } while(c == charcode_null);
             _CLS();
             _LOCATE(0,0);
             printstr("Formatting...");
-            
-            c = pop_keyinfifo();
             format_eeprom(0,254);
             setdefault();
             save_eeprom();
@@ -1015,14 +1005,18 @@ int main(void)
     idle(0xff00);
 #endif
     _CLS();
+    _LOCATE(0,0);
+    _PUTCHAR(' ');
     //update_status();
-    update_display();
+//    update_display();
+    idle(ui_idlecount);
+    _LOCATE(0,0);
+    printstr("OK");
     do {
         /* Main routine*/
-        input_flag = readkey_compare();
-        if(input_flag != 0){
-            readchar = pop_keyinfifo();
-            if((readchar >= charcode_1) && (readchar <= charcode_f)) {
+        c = readkey();
+        if(c != charcode_null){
+            if((c >= charcode_1) && (c <= charcode_0)) {
         //            setfreq_updown(readchar);
             } else {
                 // Other is skip
@@ -1033,12 +1027,12 @@ int main(void)
 //     update_status();
         // Putstring to LCD.
 
-        update_display();
+//        update_display();
         if(backlight_counter > 0) {
             backlight_counter--;
-            set_backlight(0xff, backlight_level); // Turn ON
+            lcd_setbacklight(0xff, backlight_level); // Turn ON
         } else {
-            set_backlight(0x00, 0); // Turn OFF
+            lcd_setbacklight(0x00, 0); // Turn OFF
         }
 #ifdef _LCD_DEBUG
         if(power_flag != 0x00) {
index bb3c353..1a77a3a 100644 (file)
@@ -1,5 +1,5 @@
 #
-#Thu Jun 20 16:08:25 JST 2013
+#Fri Jun 21 07:28:22 JST 2013
 default.languagetoolchain.dir=/usr/local/bin
 default.br-unifei-rmaalmeida-toolchainSDCC-SDCCtoolchain.md5=b67cce1ad75b450308d7806e430931b3
 com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=8fe1589514540343a5279c082104bce0
diff --git a/ui.c b/ui.c
index 31db261..8761276 100644 (file)
--- a/ui.c
+++ b/ui.c
  *  the executable file might be covered by the GNU General Public License.
  */
 
+#include "ioports.h"
 #include "ui.h"
 #include "idle.h"
 
+
+const char charcodemap[] = {charcode_0,
+                            charcode_1,
+                            charcode_4,
+                            charcode_7,
+
+                            charcode_f,
+                            charcode_2,
+                            charcode_5,
+                            charcode_8,
+
+                            charcode_e,
+                            charcode_3,
+                            charcode_6,
+                            charcode_9,
+
+                            charcode_d,
+                            charcode_c,
+                            charcode_b,
+                            charcode_a,
+};
+
 keyin_defs keyin_old[2];
 keyin_defs keyin_now;
-char keyin_fifo[16];
+char keyin_fifo[32];
 char keyin_nowp;
 char keyin_readp;
 char keyin_counter;
@@ -39,7 +62,7 @@ void keyin_init(void)
 {
     char i;
     /* Initialize vars*/
-    for(i = 0; i < 3; i++) {
+    for(i = 0; i < 2; i++) {
         keyin_old[0].byte[i] = 0x00;
         keyin_old[1].byte[i] = 0x00;
         keyin_now.byte[i] = 0x00;
@@ -55,11 +78,14 @@ void keyin_init(void)
  */
 void push_keyinfifo(char b) __critical
 {
+    if(keyin_counter >= 31) {
+        keyin_counter = 31;
+        return;
+    }
     keyin_nowp++;
-    if((keyin_nowp > 15) || (keyin_nowp < 0))keyin_nowp = 0;
+    if((keyin_nowp > 31) || (keyin_nowp < 0))keyin_nowp = 0;
     keyin_fifo[keyin_nowp] = b;
     keyin_counter++;
-    if(keyin_counter > 16) keyin_counter = 16;
 }
 
 /*
@@ -72,12 +98,11 @@ char pop_keyinfifo(void) __critical
         keyin_counter = 0;
         return charcode_null ;
     }
-    if(keyin_readp > 15) keyin_readp = 15;
+    if(keyin_readp > 31) keyin_readp = 0;
     c = keyin_fifo[keyin_readp];
     keyin_readp++;
-    if(keyin_readp > 15) keyin_readp = 0;
     keyin_counter--;
-    if(keyin_counter < 0)keyin_counter = 0;
+    if(keyin_counter < 0) keyin_counter = 0;
     return c;
 }
 
@@ -154,7 +179,6 @@ void printstr(char *s)
 void print_numeric_nosupress(unsigned int data, unsigned char digit)
 {
     unsigned int i;
-    unsigned char c;
     int ref = 10;
     int div = 1;
 
@@ -271,98 +295,9 @@ unsigned int read_numeric(unsigned int initial, unsigned char digit,
 
 
 
-/*
- * Set signal tune status led assigned to RC0.
- * You should modify if you modify circuit.
- */
-void setsignal_tune(unsigned char flag)
-{
-    if(flag != 0){
-        LATCbits.LATC0 = 1;
-    } else {
-        LATCbits.LATC0 = 0;
-    }
-}
 
-/*
- * Set power of lcd backlight assigned to RB0.
- * You should modify if you modify circuit.
- */
-void set_backlight(unsigned char flag, unsigned int val)
-{
-    if(flag != 0){
-        LATBbits.LATB0 = 1;
-    } else {
-        LATBbits.LATB0 = 0;
-    }
-}
 
 
-/*
- * Read IOPORTS for KEY. You should modify if you modify circuit.
- */
-void readkey_io(void)
-{
-    char i;
-    unsigned char portvar;
-    unsigned char latchvar;
-    unsigned char high;
-    unsigned char low;
-    if(keyin_counter > 16) keyin_counter = 0;
-    for(i = 0; i < 3; i++){
-        keyin_old[1].byte[i] = keyin_old[0].byte[i];
-        keyin_old[0].byte[i] = keyin_now.byte[i];
-        keyin_now.byte[i] = 0x00;
-     }
-
-
-
-     /* SCANLINE A*/
-    latchvar = (LATA | 0x0f) & 0xfe;
-    LATA = latchvar;
-    delay1ktcy(8); // 1ms
-    portvar = PORTB;
-    low = ~portvar & 0x0f;
-    latchvar |= 0x01;
-    LATA = latchvar;
-    delay1ktcy(8); // 1ms
-
-    /* SCANLINE B*/
-    latchvar &= 0xfd;
-    LATA = latchvar;
-    delay1ktcy(8); // 1ms
-    portvar = PORTB;
-    high = ~portvar & 0x0f;
-    latchvar |= 0x02;
-    LATA = latchvar;
-    delay1ktcy(8); // 1ms
-    /* Pos */
-
-    keyin_now.byte[0] = (low << 4) | high;
-
-     /* SCANLINE A*/
-    latchvar &= 0xfb;
-    LATA = latchvar;
-    delay1ktcy(8); // 1ms
-    portvar = PORTB;
-    low = ~portvar & 0x0f;
-    latchvar |= 0x04;
-    LATA = latchvar;
-    delay1ktcy(8); // 1ms
-
-    /* SCANLINE B*/
-    latchvar &= 0xf7;
-    LATA = latchvar;
-    delay1ktcy(8); // 1ms
-    portvar = PORTB;
-    high = ~portvar & 0x0f;
-    latchvar |= 0x08;
-    LATA = latchvar;
-    delay1ktcy(8); // 1ms
-    /* Pos */
-    keyin_now.byte[0] = (low << 4) | high;
-    /* Special KEYS */
-}
 
 unsigned char readkey_compare(void)
 {
@@ -374,28 +309,24 @@ unsigned char readkey_compare(void)
     unsigned char f;
     f = 0;
     e = 0;
-    for(d = 0; d < 3; d++) {
+    for(d = 0; d < 2; d++) {
         shift = 0x01;
         for(b = 0; b < 8; b++){
             c = 0;
-            if((keyin_now.byte[c] & shift) != 0) c++;
-            if((keyin_old[0].byte[c] & shift) != 0) c++;
-            if((keyin_old[1].byte[c] & shift) != 0) c++;
+            if((keyin_now.byte[d] & shift) != 0) c++;
+            if((keyin_old[0].byte[d] & shift) != 0) c++;
+            if((keyin_old[1].byte[d] & shift) != 0) c++;
             if(c >= 2) {
             /*
              * Clear older-inputs on .
              */
                 f |= 1;
-                keyin_old[0].byte[c] &= ~shift;
-                keyin_old[1].byte[c] &= ~shift;
-                keyin_now.byte[c] &= ~shift;
-                if(e == 0) {
-                    push_keyinfifo(charcode_0);
-                } else if(e <= 15) {
-                    push_keyinfifo(b);
-                } else if(e < 20) {
-                    push_keyinfifo(e + 1);
-                }
+                keyin_old[0].byte[d] &= ~shift;
+                keyin_old[1].byte[d] &= ~shift;
+                keyin_now.byte[d] &= ~shift;
+                if(e < 16) {
+                    push_keyinfifo(charcodemap[e]);
+                } 
             }
             shift <<= 1;
             e++;
@@ -405,6 +336,17 @@ unsigned char readkey_compare(void)
     return f;
 }
 
+unsigned char readkey(void)
+{
+    unsigned char i;
+    for(i = 0; i < 8; i++) {
+        idle(0xfffe); // 1.5ms?
+        readkey_io(i);
+    }
+    readkey_compare();
+    return pop_keyinfifo();
+}
+
 /*
  * Notes:
  * Initialize sequence:
diff --git a/ui.h b/ui.h
index a0e9d3a..e80e9ba 100644 (file)
--- a/ui.h
+++ b/ui.h
 extern "C" {
 #endif
 
+
 extern keyin_defs keyin_old[2];
 extern keyin_defs keyin_now;
-extern char keyin_fifo[16];
+extern char keyin_fifo[32];
 extern char keyin_nowp;
 extern char keyin_counter;
 
@@ -56,7 +57,6 @@ extern char keyin_counter;
 extern void keyin_init(void);
 extern void push_keyinfifo(char b) __critical;
 extern char pop_keyinfifo(void) __critical;
-extern void readkey_io(void);
 extern unsigned char readkey_compare(void);
 
 extern void printstr(char *s);
@@ -67,6 +67,7 @@ extern unsigned int read_numeric(unsigned int initial, unsigned char digit,
         char startx, char starty);
 extern unsigned int subst_numeric(unsigned int start, unsigned char pos, unsigned char c);
 extern void print_numeric_nosupress(unsigned int data, unsigned char digit);
+extern unsigned char readkey(void);
 
 #ifdef __cplusplus
 }