{
unsigned char osccon;
unsigned char contword;
+ unsigned int i;
/* Enable IDLE */
osccon = OSCCON;
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.
}
#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 {
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 {
charcode_e,
charcode_f,
charcode_0,
- charcode_s0, // RB1
- charcode_s1, // RB2
- charcode_s2, // RB3
- charcode_s3, // Reserve
+ // Special keys was removed.
};
/*
*/
#include "ioports.h"
+#include <signal.h>
+
+unsigned char statecount;
void set_amlamp(unsigned char f)
{
#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
LATC = 0x00;
ANSELC = AN_C_VAL;
TRISC = TRIS_C_VAL_O;
+ lcd_backlightinit();
+ io_intcountinit();
}
#endif
PORTC = 0x00;
LATC = 0x00;
TRISC = TRIS_C_VAL_O;
+ lcd_backlightinit();
+ io_intcountinit();
}
#endif
PORTE = 0x00;
TRISE = TRIS_E_VAL;
lcd_backlightinit();
+ io_intcountinit();
}
#else
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;
+ }
+}
#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" {
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
#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)
t0con &= ~_IDLEN;
T0CON = t0con;
- // Read IOKEYS
-// readkey_io();
// Clear interrupt flag
tmr0f = INTCON;
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
} 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
}
unsigned char power_flag;
#endif
// OSCCON = (_IDLEN & 0b11111100) | 0b00111000;
-
+ idle_init();
keyin_init();
keyin_ioinit();
- idle_init();
//i2c1_init();
#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);
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;
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();
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
// 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) {
#
-#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
* 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;
{
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;
*/
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;
}
/*
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;
}
void print_numeric_nosupress(unsigned int data, unsigned char digit)
{
unsigned int i;
- unsigned char c;
int ref = 10;
int div = 1;
-/*
- * 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)
{
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++;
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:
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;
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);
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
}