From 6a662bcecf0f53682c21ff0b15fc112d3903d160 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Fri, 21 Jun 2013 09:34:46 +0900 Subject: [PATCH] [UI][Key] Add input-keymatrix support @low-level. --- idle.c | 8 +- iodef.h | 31 +++--- ioports.c | 177 ++++++++++++++++++++++++++++++++++ ioports.h | 6 ++ lcd_acm1602.h | 4 +- main.c | 106 ++++++++++---------- nbproject/Makefile-genesis.properties | 2 +- ui.c | 164 ++++++++++--------------------- ui.h | 5 +- 9 files changed, 312 insertions(+), 191 deletions(-) diff --git a/idle.c b/idle.c index 312ff1b..7cb6bb2 100644 --- 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 --- 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. }; /* diff --git a/ioports.c b/ioports.c index 748480b..b38c721 100644 --- a/ioports.c +++ b/ioports.c @@ -26,6 +26,9 @@ */ #include "ioports.h" +#include + +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; + } +} diff --git a/ioports.h b/ioports.h index 0fe606d..1c2881f 100644 --- a/ioports.h +++ b/ioports.h @@ -30,9 +30,11 @@ #include #include /* ONLY FOR PIC18x */ +#include #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 diff --git a/lcd_acm1602.h b/lcd_acm1602.h index b4fb656..f353bf0 100644 --- a/lcd_acm1602.h +++ b/lcd_acm1602.h @@ -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 --- 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) { diff --git a/nbproject/Makefile-genesis.properties b/nbproject/Makefile-genesis.properties index bb3c353..1a77a3a 100644 --- a/nbproject/Makefile-genesis.properties +++ b/nbproject/Makefile-genesis.properties @@ -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 --- a/ui.c +++ b/ui.c @@ -25,12 +25,35 @@ * 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 --- a/ui.h +++ b/ui.h @@ -39,9 +39,10 @@ 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 } -- 2.11.0