From 0402352f79d93afa4dec8fb6836dc118ac0a3ed0 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Fri, 28 Jun 2013 17:06:59 +0900 Subject: [PATCH] [IO] Use bitfield on scanning key, to save program-memory. [UI] Add LCD-Suspend on shutdown. --- iodef.h | 26 ++++--------- ioports.c | 116 ++++++++++++++++------------------------------------------ lcd_acm1602.c | 9 +++++ lcd_acm1602.h | 5 +++ menu.c | 23 +++++------- power.c | 3 ++ ui.c | 8 ++-- 7 files changed, 70 insertions(+), 120 deletions(-) diff --git a/iodef.h b/iodef.h index 703c87a..2f38b53 100644 --- a/iodef.h +++ b/iodef.h @@ -140,11 +140,14 @@ extern "C" { #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) +#define _KEY_SEND_GRP1 LATAbits.LATA0 +#define _KEY_SEND_GRP2 LATAbits.LATA1 +#define _KEY_SEND_GRP3 LATAbits.LATA2 +#define _KEY_SEND_GRP4 LATAbits.LATA3 +#define _KEY_POS1MASK(p) p.b0 +#define _KEY_POS2MASK(p) p.b1 +#define _KEY_POS3MASK(p) p.b2 +#define _KEY_POS4MASK(p) p.b3 typedef union { struct { @@ -196,19 +199,6 @@ enum { /* * LCD Control: Default register values, You should re-define in iodef.h if you need. */ -typedef union { - unsigned char byte; - struct { - unsigned b0:1; - unsigned b1:1; - unsigned b2:1; - unsigned b3:1; - unsigned b4:1; - unsigned b5:1; - unsigned b6:1; - unsigned b7:1; - }; - } Bitdefs_t; #ifdef _LCD_IF_4BIT diff --git a/ioports.c b/ioports.c index 1f2533f..1bebf24 100644 --- a/ioports.c +++ b/ioports.c @@ -24,7 +24,7 @@ * This exception does not however invalidate any other reasons why * the executable file might be covered by the GNU General Public License. */ - +#include "commondef.h" #include "ioports.h" #include @@ -272,9 +272,8 @@ void keyin_ioinit(void) void readkey_io(unsigned char state) { char i; - unsigned char portvar; - unsigned char latchvar; - + __bitops_t portvar; + switch(state) { case 0: for(i = 0; i < 2; i++){ @@ -282,134 +281,83 @@ void readkey_io(unsigned char state) keyin_old[0].byte[i] = keyin_now.byte[i]; keyin_now.byte[i] = 0x00; } - latchvar = _KEY_SENDPORT; - latchvar |= _KEY_SENDPORTMASK; - _KEY_SENDPORT = latchvar; // Group1 DOWN. + _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN. break; case 1: - latchvar = _KEY_SENDPORT; - latchvar &= ~_KEY_GRP1MASK; - _KEY_SENDPORT = latchvar; // Group1 DOWN. + _KEY_SEND_GRP1 = 0; // Group1 DOWN. break; case 2: - portvar = _KEY_RECVPORT; - if((portvar & _KEY_POS1MASK) == 0) { + portvar.byte = _KEY_RECVPORT; + if(!_KEY_POS1MASK(portvar)) { keyin_now.BIT0A = 1; - } else { - keyin_now.BIT0A = 0; } - if((portvar & _KEY_POS2MASK) == 0) { + if(!_KEY_POS2MASK(portvar)) { keyin_now.BIT1A = 1; - } else { - keyin_now.BIT1A = 0; } - if((portvar & _KEY_POS3MASK) == 0) { + if(!_KEY_POS3MASK(portvar)) { keyin_now.BIT2A = 1; - } else { - keyin_now.BIT2A = 0; } - if((portvar & _KEY_POS4MASK) == 0) { + if(!_KEY_POS4MASK(portvar)) { keyin_now.BIT3A = 1; - } else { - keyin_now.BIT3A = 0; } - latchvar = _KEY_SENDPORT; - latchvar |= _KEY_SENDPORTMASK; - _KEY_SENDPORT = latchvar; // Group1 UP. + _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN. break; case 3: - latchvar = _KEY_SENDPORT; - latchvar &= ~_KEY_GRP2MASK; - _KEY_SENDPORT = latchvar; // Group2 DOWN. + _KEY_SEND_GRP2 = 0; // Group2 DOWN. break; case 4: - portvar = _KEY_RECVPORT; - if((portvar & _KEY_POS1MASK) == 0) { + portvar.byte = _KEY_RECVPORT; + if(!_KEY_POS1MASK(portvar)) { keyin_now.BIT0B = 1; - } else { - keyin_now.BIT0B = 0; } - if((portvar & _KEY_POS2MASK) == 0) { + if(!_KEY_POS2MASK(portvar)) { keyin_now.BIT1B = 1; - } else { - keyin_now.BIT1B = 0; } - if((portvar & _KEY_POS3MASK) == 0) { + if(!_KEY_POS3MASK(portvar)) { keyin_now.BIT2B = 1; - } else { - keyin_now.BIT2B = 0; } - if((portvar & _KEY_POS4MASK) == 0) { + if(!_KEY_POS4MASK(portvar)) { keyin_now.BIT3B = 1; - } else { - keyin_now.BIT3B = 0; } - latchvar = _KEY_SENDPORT; - latchvar |= _KEY_SENDPORTMASK; - _KEY_SENDPORT = latchvar; // Group1 UP. + _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN. break; case 5: - latchvar = _KEY_SENDPORT; - latchvar &= ~_KEY_GRP3MASK; - _KEY_SENDPORT = latchvar; // Group2 DOWN. + _KEY_SEND_GRP3 = 0; // Group1 DOWN. break; case 6: - portvar = _KEY_RECVPORT; - if((portvar & _KEY_POS1MASK) == 0) { + portvar.byte = _KEY_RECVPORT; + if(!_KEY_POS1MASK(portvar)) { keyin_now.BIT0C = 1; - } else { - keyin_now.BIT0C = 0; } - if((portvar & _KEY_POS2MASK) == 0) { + if(!_KEY_POS2MASK(portvar)) { keyin_now.BIT1C = 1; - } else { - keyin_now.BIT1C = 0; } - if((portvar & _KEY_POS3MASK) == 0) { + if(!_KEY_POS3MASK(portvar)) { keyin_now.BIT2C = 1; - } else { - keyin_now.BIT2C = 0; } - if((portvar & _KEY_POS4MASK) == 0) { + if(!_KEY_POS4MASK(portvar)) { keyin_now.BIT3C = 1; - } else { - keyin_now.BIT3C = 0; } - latchvar = _KEY_SENDPORT; - latchvar |= _KEY_SENDPORTMASK; - _KEY_SENDPORT = latchvar; // Group1 UP. + _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN. break; case 7: - latchvar = _KEY_SENDPORT; - latchvar &= ~_KEY_GRP4MASK; - _KEY_SENDPORT = latchvar; // Group2 DOWN. + _KEY_SEND_GRP4 = 0; // Group4 up break; case 8: - portvar = _KEY_RECVPORT; - if((portvar & _KEY_POS1MASK) == 0) { + portvar.byte = _KEY_RECVPORT; + if(!_KEY_POS1MASK(portvar)) { keyin_now.BIT0D = 1; - } else { - keyin_now.BIT0D = 0; } - if((portvar & _KEY_POS2MASK) == 0) { + if(!_KEY_POS2MASK(portvar)) { keyin_now.BIT1D = 1; - } else { - keyin_now.BIT1D = 0; } - if((portvar & _KEY_POS3MASK) == 0) { + if(!_KEY_POS3MASK(portvar)) { keyin_now.BIT2D = 1; - } else { - keyin_now.BIT2D = 0; } - if((portvar & _KEY_POS4MASK) == 0) { + if(!_KEY_POS4MASK(portvar)) { keyin_now.BIT3D = 1; - } else { - keyin_now.BIT3D = 0; } - latchvar = _KEY_SENDPORT; - latchvar |= _KEY_SENDPORTMASK; - _KEY_SENDPORT = latchvar; // Group4 UP. - + _KEY_SENDPORT |= _KEY_SENDPORTMASK; // Group1 DOWN. break; default: break; diff --git a/lcd_acm1602.c b/lcd_acm1602.c index 2da99ad..4751a0e 100644 --- a/lcd_acm1602.c +++ b/lcd_acm1602.c @@ -584,6 +584,15 @@ void acm1602_init(unsigned char addr, unsigned char cls) // sendcmd(addr, 0x06, 0xff); } +/* + * Suspend lcd + */ +void acm1602_suspend(unsigned char addr) +{ + sendcmd(addr, 0x08, 0xff); + _ACM1602_LONG_WAIT(); +} + #ifdef _USE_I2C_1602 /* * st7032 extensions. diff --git a/lcd_acm1602.h b/lcd_acm1602.h index 67a0ce3..8fbb73b 100644 --- a/lcd_acm1602.h +++ b/lcd_acm1602.h @@ -41,6 +41,9 @@ extern "C" { #endif +#ifndef LCD_I2CADDR +#define LCD_I2CADDR 0xa0 +#endif // Notes: Master clock = 8MHz(0.125uS) // Wait 5us #define _ACM1602_TC_WAIT() delay10tcy(4) @@ -62,6 +65,8 @@ extern void acm1602_locate_8x2(unsigned char addr, char x, char y); extern void acm1602_home(unsigned char addr); extern void acm1602_cursordir(unsigned char addr, unsigned char right); extern void acm1602_init(unsigned char addr, unsigned char cls); +extern void acm1602_suspend(unsigned char addr); + //extern unsigned char acm1602_getchar(unsigned char addr); #ifdef _USE_I2C_1602 diff --git a/menu.c b/menu.c index cb62fe8..09121d1 100644 --- a/menu.c +++ b/menu.c @@ -28,6 +28,7 @@ #include "menu.h" #include "power.h" +#include "commondef.h" void toggle_amfm(void) { @@ -96,19 +97,14 @@ void set_thresh(void) void set_stereomode(void) { - unsigned char mode = 0x00; - switch(stereo){ - case 0x00: - mode = 0b00000001; // Force mono - break; - case 0xff: - mode = 0x00000000; - break; - default: - mode = 0b00000010; // Force stereo - break; + __bitops_t mode; + mode.byte = 0x00; + if(stereo == 0x00){ + mode.b0 = 1; // Force mono + } else if(stereo < 0x80){ + mode.b1 = 1; // Force stereo } - akc6955_set_stereomode(mode); + akc6955_set_stereomode(mode.byte); } void set_stereo(void) @@ -716,7 +712,8 @@ void main_menu(void) } else if(c == charcode_8){ // Set sensitivity fmbandwidth++; - if(fmbandwidth > 3) fmbandwidth = 0; +// if(fmbandwidth > 3) fmbandwidth = 0; + fmbandwidth &= 3; akc6955_set_fmbandwidth(fmbandwidth); } else if(c == charcode_9){ // Set NF diff --git a/power.c b/power.c index 1fc0628..7c3431b 100644 --- a/power.c +++ b/power.c @@ -26,6 +26,7 @@ * the executable file might be covered by the GNU General Public License. */ +#include "lcd_acm1602.h" #include "power.h" /* @@ -105,6 +106,8 @@ void shutdown(unsigned char save) set_powerlamp(0); set_amlamp(0); set_fmlamp(0); +// _CLS(); + acm1602_suspend(LCD_I2CADDR); power_off(save); } diff --git a/ui.c b/ui.c index 6e63806..b61870f 100644 --- a/ui.c +++ b/ui.c @@ -71,7 +71,7 @@ void keyin_init(void) keyin_old[1].byte[i] = 0x00; keyin_now.byte[i] = 0x00; } - for(i = 0; i < 16; i++) keyin_fifo[i] = 0x00; + for(i = 0; i < 32; i++) keyin_fifo[i] = 0x00; keyin_nowp = 0; keyin_readp = 0; keyin_counter = 0; @@ -268,9 +268,7 @@ unsigned char readkey_compare(void) keyin_old[0].byte[d] &= ~shift; keyin_old[1].byte[d] &= ~shift; keyin_now.byte[d] &= ~shift; - if(e < 16) { - push_keyinfifo(charcodemap[e]); - } + push_keyinfifo(charcodemap[e]); } shift <<= 1; e++; @@ -345,7 +343,7 @@ unsigned char pollkey_single(void) do { idle_time_ms(10); // 0.125 * 4 * 20 = 10ms. - c = readkey(); // 2 * 4 + c = readkey(); // 2 * 9 = 16ms ClrWdt(); if(c != charcode_null) { if(cold != c){ -- 2.11.0