#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+
+#if defined(__SDCC)
#include <sdcc-lib.h>
#include <pic18fregs.h> /* ONLY FOR PIC18x */
-#include <signal.h>
#include <delay.h>
+#else
+#include <xc.h>
+#endif
+
+#include <signal.h>
#include "iodef.h"
#include "idle.h"
#include "ui.h"
#include "eeprom.h"
#include "ioports.h"
+#include "menu.h"
+#include "power.h"
+#include "adc_int.h"
+#include "i2c_eeprom.h"
+#include "backlight.h"
/*
* Config words.
//#pragma stack 0x200 256 // Set stack size to 256bytes.
#pragma config FOSC=INTIO67,BORV=190,BOREN=ON,PWRTEN=ON
#pragma config WDTEN=ON,WDTPS=32768
-#pragma config PBADEN=OFF,MCLRE=EXTMCLR,STVREN=ON,LVP=OFF,DEBUG=ON//,XINST=ON
+#pragma config PBADEN=OFF,MCLRE=EXTMCLR,STVREN=ON,LVP=OFF,DEBUG=ON,XINST=ON
//#pragma config PBADEN=OFF,MCLRE=EXTMCLR,STVREN=ON,LVP=OFF//,XINST=ON
#pragma config CP0=OFF,CP1=OFF,CPB=OFF,CPD=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRTB=OFF,WRTC=OFF,WRTD=OFF
#endif
// For 4xK20 or 2xK20 Series
#if defined(pic18f43k20) || defined(pic18f44k20) || defined(pic18f45k20) || defined(pic18f46k20) || \
- defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20)
+ defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20) || \
+ defined(_18F43K20) || defined(_18F44K20) || defined(_18F45K20) || defined(_18F46K20) || \
+ defined(_18F23K20) || defined(_18F24K20) || defined(_18F25K20) || defined(_18F26K20)
+#ifdef __SDCC
#pragma stack 0x200 256
-#pragma config FOSC=HS,FCMEN=ON,PWRT=ON,BOREN=ON,BORV=22
-#pragma config WDTEN=ON,WDTPS=32768,PBADEN=OFF,HFOFST=ON,LPT1OSC=OFF,MCLRE=ON
-#pragma config STVREN=ON,DEBUG=ON
-#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF
-#pragma config CPB=OFF,CPD=OFF
-#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
-#pragma config WRTC=OFF,WRTB=OFF,WRTD=OFF
-#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF
#endif
-//#define _LCD_DEBUG 1
+#pragma config FOSC=HS,FCMEN=ON,PWRT=ON,BOREN=NOSLP,BORV=27, \
+ WDTEN=ON,WDTPS=32768,PBADEN=OFF,HFOFST=OFF,LPT1OSC=OFF, \
+ MCLRE=ON,STVREN=ON,DEBUG=ON, \
+ XINST=OFF
+#endif
+/*
+ * Statuses
+ */
+unsigned char stereoflag;
+unsigned char tuneflag;
+unsigned char cnrlevel;
+int diffstat;
+unsigned int batlevel_6955;
+unsigned int battlevel;
+
+int recv_signal;
+unsigned char pollkeybuf[33];
+//#define _LCD_DEBUG 1
+#ifdef __XC
+void TMR0_handler(void)
+#else
SIGHANDLER(TMR0_handler)
+#endif
{
- unsigned char tmr0f;
- unsigned char t0con;
// Stop timer0
- t0con = T0CON;
- t0con &= ~_IDLEN;
- T0CON = t0con;
-
+ T0CONbits.TMR0ON = 0;
// Clear interrupt flag
- tmr0f = INTCON;
- tmr0f &= ~(_TMR0IF | _TMR0IE);
- INTCON = tmr0f;
+// INTCONbits.TMR0IF = 0;
+ INTCONbits.TMR0IE = 0;;
return;
}
-
/*
* Interrupt wake up every 1ms.
*/
+#ifdef __XC
+void TMR3_Handler(void)
+#else
SIGHANDLER(TMR3_Handler)
+#endif
{
- 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();
+ PIE2bits.TMR3IE = 0;
+ T3CONbits.TMR3ON = 0;
}
-DEF_INTLOW(intlow_handler)
- DEF_HANDLER(SIG_TMR0, TMR0_handler)
-// DEF_HANDLER(SIG_TMR3, TMR3_Handler)
-END_DEF
-
-
-unsigned int amfreq;
-unsigned int fmfreq;
-unsigned char amband;
-unsigned char fmband;
-unsigned char fm;
-unsigned char am_mode3k;
-unsigned char am_userbandnum;
-unsigned char fm_userbandnum;
-typedef struct {
- unsigned char mode3k; // mode3k if am
- unsigned char start;
- unsigned char stop;
- unsigned int freq;
-} _userband_t;
-#define USER_BAND_NUM 4
-_userband_t am_usrbands[USER_BAND_NUM];
-_userband_t fm_usrbands[USER_BAND_NUM];
-
-unsigned char enter_mode;
-unsigned char numeric_mode;
-unsigned char menu_node;
-int backlight_long;
-unsigned char help_flag;
-int help_line;
-int help_section;
-int ui_language;
-unsigned int ui_idlecount;
-unsigned char scanflag;
-
-int recv_signal;
-int backlight_counter;
-unsigned char backlight_level;
-
-unsigned int writeword_eeprom(unsigned int p, unsigned int *sum, unsigned int word)
-{
- if(eeprom_writebyte(p, word >> 8) == 0) return p; // Error
- *sum = calcsum_byte(*sum, (word >> 8));
-
- if(eeprom_writebyte(p, word & 0xff) == 0) return p+1; // Error
- *sum = calcsum_byte(*sum, word & 0xff);
- return 0xffff;
-}
-
-unsigned int writebyte_eeprom(unsigned int p, unsigned int *sum, unsigned char b)
-{
- if(eeprom_writebyte(p, b) == 0) return p; // Error
- *sum = calcsum_byte(*sum, b);
- return 0xffff;
-}
-
-void save_eeprom(void)
+#ifdef __XC
+void EXINT_Handler(void)
+#else
+SIGHANDLER(EXINT_Handler)
+#endif
{
- unsigned int p = 0;
- unsigned int sum = 0x0000;
- unsigned char i;
-
- // Magic word
- writeword_eeprom(p, &sum, 0x1298);
- p+= 2;
- // amfreq
- writeword_eeprom(p, &sum, amfreq);
- p+= 2;
- // amfreq
- writeword_eeprom(p, &sum, fmfreq);
- p+= 2;
-
- writebyte_eeprom(p, &sum, amband);
- p++;
- writebyte_eeprom(p, &sum, fmband);
- p++;
- writebyte_eeprom(p, &sum, fm);
- p++;
- writebyte_eeprom(p, &sum, am_mode3k);
- p++;
- writebyte_eeprom(p, &sum, am_userbandnum);
- p++;
- writebyte_eeprom(p, &sum, fm_userbandnum);
- p++;
+ INTCONbits.INT0IE = 0;
+ INTCONbits.INT0IF = 0;
+ INTCON3bits.INT1IF = 0;
+ INTCON3bits.INT2IF = 0;
+ INTCON3bits.INT1IE = 0;
+ INTCON3bits.INT2IE = 0;
- for(i = 0 ; i < USER_BAND_NUM; i++){
- writebyte_eeprom(p, &sum, am_usrbands[i].mode3k);
- writebyte_eeprom(p + 1, &sum, am_usrbands[i].start);
- writebyte_eeprom(p + 2, &sum, am_usrbands[i].stop);
- writeword_eeprom(p + 3, &sum, am_usrbands[i].freq);
- p += 5;
- }
- for(i = 0 ; i < USER_BAND_NUM; i++){
- writebyte_eeprom(p, &sum, fm_usrbands[i].mode3k);
- writebyte_eeprom(p + 1, &sum, fm_usrbands[i].start);
- writebyte_eeprom(p + 2, &sum, fm_usrbands[i].stop);
- writeword_eeprom(p + 3, &sum, fm_usrbands[i].freq);
- p += 5;
- }
- // Write checksum
- eeprom_writebyte(p, sum >> 8);
- eeprom_writebyte(p + 1, sum & 0xff);
- p+= 2;
}
-
-unsigned int readword_eeprom(unsigned int p, unsigned int *sum)
-{
- unsigned char h,l;
- unsigned int s;
-
- h = eeprom_readbyte(p);
- *sum = calcsum_byte(*sum, h);
-
- l = eeprom_readbyte(p + 1);
- *sum = calcsum_byte(*sum, l);
-
- s = (h << 8) + l;
- return s;
-}
-
-unsigned char readbyte_eeprom(unsigned int p, unsigned int *sum)
+#ifdef __XC
+void RBIF_handler(void)
+#else
+SIGHANDLER(RBIF_handler)
+#endif
{
- unsigned char b;
-
- b = eeprom_readbyte(p);
- *sum = calcsum_byte(*sum, b);
-
- return b;
+ power_on_inthook();
+// if(chk_powerbutton(0, 0) != 0) { // If pressed on
+// power_off(1); //
+// }
}
-
-
-unsigned char load_eeprom(void)
+#ifdef __XC
+void EEPROM_handler(void)
+#else
+SIGHANDLER(EEPROM_handler)
+#endif
{
- unsigned int p = 0;
- unsigned int sum = 0x0000;
- unsigned char i;
- unsigned int magic;
-
- // Magic word
- magic = readword_eeprom(p, &sum);
- if(magic != 0x1298) return 0x01; // NO MAGICWORD
- p+= 2;
- // amfreq
- amfreq = readword_eeprom(p, &sum);
- p+= 2;
- // fmfreq
- fmfreq = readword_eeprom(p, &sum);
- p+= 2;
-
- amband = readbyte_eeprom(p, &sum);
- p++;
- fmband = readbyte_eeprom(p, &sum);
- p++;
- fm = readbyte_eeprom(p, &sum);
- p++;
- am_mode3k = readbyte_eeprom(p, &sum);
- p++;
- am_userbandnum = readbyte_eeprom(p, &sum);
- p++;
- fm_userbandnum = readbyte_eeprom(p, &sum);
- p++;
-
- for(i = 0 ; i < USER_BAND_NUM; i++){
- am_usrbands[i].mode3k = readbyte_eeprom(p, &sum);
- am_usrbands[i].start = readbyte_eeprom(p + 1, &sum);
- am_usrbands[i].stop = readbyte_eeprom(p + 2, &sum);
- am_usrbands[i].freq = readword_eeprom(p + 3, &sum);
- p += 5;
- }
- for(i = 0 ; i < USER_BAND_NUM; i++){
- fm_usrbands[i].mode3k = readbyte_eeprom(p, &sum);
- fm_usrbands[i].start = readbyte_eeprom(p + 1, &sum);
- fm_usrbands[i].stop = readbyte_eeprom(p + 2, &sum);
- fm_usrbands[i].freq = readword_eeprom(p + 3, &sum);
- p += 5;
- }
- // Write checksum
- magic = (eeprom_readbyte(p) << 8) + eeprom_readbyte(p+1);
-
- p+= 2;
- if(sum != magic) return 0x00;
- return 0xff;
+ PIR2bits.EEIF = 0;
+ EECON1bits.WREN = 0;
+// if(chk_powerbutton(0, 0) != 0) { // If pressed on
+// power_off(1); //
+// }
}
-
-void toggle_amfm(void)
-{
- if(fm != 0){
- fm = 0;
-#ifndef _LCD_DEBUG
- akc6955_chg_fm(fm);
- akc6955_set_amband(amband);
- akc6955_set_freq(amfreq);
-#endif
- } else {
- fm = 0xff;
-#ifndef _LCD_DEBUG
- akc6955_chg_fm(fm);
- akc6955_set_fmband(fmband);
- akc6955_set_freq(fmfreq);
+#ifdef __XC
+void INADC_handler(void)
+#else
+SIGHANDLER(INADC_handler)
#endif
- }
-}
-
-static void update_status(void)
{
-#ifndef _LCD_DEBUG
- recv_signal = akc6955_read_level();
- if(fm != 0){
- fmfreq = akc6955_get_freq();
- } else {
- amfreq = akc6955_get_freq();
- }
-#endif
-
+// unsigned int a;
+// a = polladc();
+// if(a != 0xffff) {
+// battlevel = adc_rawtobatt(a);
+// }
+ PIR1bits.ADIF = 0;
}
-
-
-void set_volume(void)
+#ifdef __XC
+void I2C_handler(void)
+#else
+SIGHANDLER(I2C_handler)
+#endif
{
+ PIR1bits.SSPIF = 0;
}
-
-void update_display(void)
+#ifdef __XC
+void I2CBus_handler(void)
+#else
+SIGHANDLER(I2CBus_handler)
+#endif
{
- if(fm != 0){ // FM
- _LOCATE(0,0);
- if(fmband < AKC6955_BAND_TV1) {
- printstr("FM");
- _PUTCHAR('1' + (fmband & 7));
- } else if(fmband < AKC6955_BAND_FMUSER){
- printstr("TV");
- _PUTCHAR('1' + fmband - AKC6955_BAND_TV1);
- } else { // USER
- printstr("FMUSR");
- }
- } else { // AM
- _LOCATE(0,1);
- if(amband == AKC6955_BAND_LW) {
- printstr("LW");
- } else if(amband <AKC6955_BAND_SW1) { //MW
- printstr("MW");
- _PUTCHAR('1' + amband - AKC6955_BAND_MW1);
- } else if(amband < AKC6955_BAND_AMUSER) { //MW
- printstr("SW");
- _PUTCHAR('1' + amband - AKC6955_BAND_SW1);
- } else if(amband == AKC6955_BAND_MW4){
- printstr("MW4");
- } else {
- printstr("AMUSR");
- }
- }
- _LOCATE(16-4 ,1);
- if(fm != 0){
- printstr("MHz");
- } else {
- printstr("KHz");
- }
- _LOCATE(16-5, 1);
- if(fm != 0){
- int freq_lo = fmfreq % 100;
- int freq_hi = fmfreq / 100;
- print_numeric(freq_hi, 0xff);
- _PUTCHAR('.');
- print_numeric(freq_lo, 0xff);
- } else {
- print_numeric(amfreq, 0xff);
- }
- // Signal
- _LOCATE(0, 0);
- printstr("S=");
- print_numeric(recv_signal, 0xff);
+ PIR2bits.BCLIF = 0;
}
-void scan_start()
-{
- unsigned char input_flag;
- unsigned char c;
- do {
- if(scanflag == 0){
- // New Scan
- _CLS();
- printstr("Scan A=ABORT");
- _LOCATE(0,1);
- printstr("U=6, D=4");
- do {
- input_flag = readkey_compare();
- idle(0xff80);
- } while(input_flag == 0);
- c = pop_keyinfifo();
- if(c == charcode_6){
- akc6955_do_scan(0xff);
- } else if(c == charcode_4){
- akc6955_do_scan(0);
- } else {
- break;
- }
- scanflag = 0xff;
- } else {
- do {
- input_flag = readkey_compare();
- idle(0xff80);
- } while(input_flag == 0);
- c = pop_keyinfifo();
-
- if(c == charcode_a){
- akc6955_abort_scan();
- break;
- } else if(c == charcode_4){
- akc6955_abort_scan();
- akc6955_do_scan(0);
- continue;
- } else if(c == charcode_6){
- akc6955_abort_scan();
- akc6955_do_scan(0xff);
- continue;
- }
- if(akc6955_chk_donescan() != 0) break;
- }
- idle(0xff00);
- } while(1);
- scanflag=0;
- _CLS();
- update_status();
- update_display();
-}
-void setfreq_direct(void)
-{
- unsigned int val;
- _CLS();
- if(fm != 0){
- // FM
- _LOCATE(0,0);
- printstr("Set Freq:FM");
- val = fmfreq;
- val = read_numeric(val, 5, 7, 1);
- fmfreq = val;
- akc6955_set_freq(val);
- } else {
- // FM
- _LOCATE(0,0);
- printstr("Set Freq:AM");
- val = amfreq;
- val = read_numeric(val, 5, 7, 1);
- amfreq = val;
- akc6955_set_freq(val);
- }
- idle(0xff00);
- update_status();
- update_display();
-}
+#ifdef __SDCC
+DEF_INTLOW(intlow_handler)
+ DEF_HANDLER(SIG_TMR0, TMR0_handler)
+ DEF_HANDLER(SIG_INT0, EXINT_Handler)
+// DEF_HANDLER(SIG_TMR3, I2C_handler)
+END_DEF
-void setband_direct(void)
+DEF_INTHIGH(inthigh_handler)
+ DEF_HANDLER(SIG_RBIF, RBIF_handler)
+ DEF_HANDLER(SIG_EEIF, EEPROM_handler)
+ DEF_HANDLER(SIG_TMR3, TMR3_Handler)
+ DEF_HANDLER(SIG_INT1, EXINT_Handler)
+ DEF_HANDLER(SIG_INT2, EXINT_Handler)
+ DEF_HANDLER(SIG_AD, INADC_handler)
+ //DEF_HANDLER(SIG_SSP, I2C_handler)
+ //DEF_HANDLER(SIG_BCOL, I2CBus_handler)
+END_DEF
+#else
+void interrupt low_priority intlow_handler(void)
{
- unsigned int band;
- _CLS();
- _LOCATE(0,0);
- if(fm != 0){
- printstr("Set Band:FM");
- band = fmband & 7;
- band = read_numeric(band, 2, 7, 1);
- akc6955_set_fmband(band);
- akc6955_do_tune();
- idle(0xff00);
- } else {
- printstr("Set Band:AM");
- band = amband & 0x1f;
- band = read_numeric(band, 2, 7, 1);
- akc6955_set_amband(band);
- akc6955_do_tune();
- }
- idle(0xff00);
- update_status();
- update_display();
+ if(INTCONbits.TMR0IF) TMR0_handler();
+ if(INTCONbits.INT0IF) EXINT_Handler();
}
-void call_userband(unsigned char num)
+void interrupt high_priority inthigh_handler(void)
{
- unsigned int freq;
- unsigned int ch;
- if(num >= USER_BAND_NUM) return;
- if(fm != 0){
- freq = fm_usrbands[num].freq;
- ch = ((freq - 3000) / 25) * 10;
- akc6955_set_userband(fm_usrbands[num].start, fm_usrbands[num].stop, ch,
- fm_usrbands[num].mode3k);
- } else {
- unsigned int p = 5;
- if(am_usrbands[num].mode3k != 0) p = 3;
- freq = am_usrbands[num].freq;
- ch = freq / p;
- akc6955_set_userband(am_usrbands[num].start, am_usrbands[num].stop, ch,
- am_usrbands[num].mode3k);
- }
- if(fm != 0) {
- fmband = AKC6955_BAND_AMUSER;
- } else {
- amband = AKC6955_BAND_AMUSER;
- }
- idle(0xff00);
- update_status();
- update_display();
+ if(INTCONbits.RBIF) RBIF_handler();
+ if(PIR2bits.EEIF) EEPROM_handler();
+ if(PIR2bits.TMR3IF) TMR3_Handler();
+ // if(INTCONbits.TMR0IF) TMR0_handler();
+ if(INTCON3bits.INT1IF) EXINT_Handler();
+ if(INTCON3bits.INT2IF) EXINT_Handler();
+ if(PIR1bits.ADIF) INADC_handler();
+
+// if(PIR1bits.SSPIF) I2C_handler();
}
-void set_userband(void)
-{
- unsigned int from,to;
- unsigned char c;
- unsigned char p;
- unsigned char mode3k;
- unsigned int input_flag;
- char cc;
-
- _CLS();
- _LOCATE(0,0);
- printstr("User ch:");
- do {
- input_flag = readkey_compare();
- idle(0xff80);
- } while(input_flag == 0);
- c = pop_keyinfifo();
+#ifdef __XC
- if(c > charcode_0) return;
- if(c < charcode_1) return;
- if(c == charcode_0) {
- c = 0;
- } else {
- c = c - charcode_1 + 1;
- }
- if(c >= USER_BAND_NUM) return;
- if(fm != 0){
- from = fm_usrbands[c].start * 80 + 3000; // 32*25/10
- to = fm_usrbands[c].stop * 80 + 3000;
- _CLS();
- _LOCATE(0,0);
- printstr("FM #");
- print_numeric_nosupress(c, 1);
- printstr(" From:");
- from = read_numeric(from, 5, 7, 1);
- _CLS();
- _LOCATE(0,0);
- printstr("FM #");
- print_numeric_nosupress(c, 1);
- printstr(" To:");
- to = read_numeric(to, 5, 7, 1);
- fm_usrbands[c].start = (from - 3000) / 80;
- fm_usrbands[c].stop = (to - 3000) / 80;
- fm_usrbands[c].freq = from * 80 + 3000;
- fm_userbandnum = c;
- } else {
- mode3k = am_usrbands[c].mode3k;
- p = 96; // 3*32
- if(mode3k == 0) p = 160; // 5*32
- from = am_usrbands[c].start * p;
- to = am_usrbands[c].stop * p;
- _CLS();
- _LOCATE(0,0);
- printstr("AM #");
- print_numeric_nosupress(c, 1);
- printstr(" Step:");
- _LOCATE(0,1);
- printstr("0=3k 1=5k");
- do {
- input_flag = readkey_compare();
- idle(0xff80);
- } while(input_flag == 0);
- cc = pop_keyinfifo();
- if(cc == charcode_0){
- p = 96;
- mode3k = 0xff;
- } else if(cc = charcode_1) {
- p = 160;
- mode3k = 0;
- }
- _CLS();
- _LOCATE(0,0);
- printstr("AM #");
- print_numeric_nosupress(c, 1);
- printstr(" From:");
- from = read_numeric(from, 5, 7, 1);
- _CLS();
- _LOCATE(0,0);
- printstr("AM #");
- print_numeric_nosupress(c, 1);
- printstr(" To:");
- to = read_numeric(to, 5, 7, 1);
- am_usrbands[c].start = from / p;
- am_usrbands[c].stop = to / p;
- am_usrbands[c].mode3k = mode3k;
- am_usrbands[c].freq = from * p;
- am_userbandnum = c;
- }
- call_userband(c);
-}
-
-void input_userband(void)
-{
- unsigned char c;
- unsigned char input_flag;
- do{
- _CLS();
- _LOCATE(0,0);
- printstr("User Band");
- _LOCATE(0,1);
- printstr(" #");
- do {
- input_flag = readkey_compare();
- idle(0xff80);
- } while(input_flag == 0);
- c = pop_keyinfifo();
-
- if((c >= charcode_a) && (c <= charcode_f)){
- break;
- }
- if(c == charcode_0) {
- _PUTCHAR('0');
- if(fm != 0){
- fm_userbandnum = 0;
- } else {
- am_userbandnum = 0;
- }
- call_userband(0);
- } else {
- c = c - charcode_1 + 1;
- if(c < USER_BAND_NUM) {
- _PUTCHAR(c + '0');
- if(fm != 0){
- fm_userbandnum = c;
- } else {
- am_userbandnum = c;
- }
- call_userband(c);
- }
- }
- idle(0xff00);
- } while(1);
- _CLS();
-}
-
-
-void main_menu(void)
-{
- unsigned char c;
- unsigned int input_flag;
- _CLS();
- _LOCATE(0,0);
- printstr("Menu:F=HELP");
- _LOCATE(1,0);
- printstr("A=CANCEL");
- do{
- do {
- input_flag = readkey_compare();
- idle(0xff80);
- } while(input_flag == 0);
-
- c = pop_keyinfifo();
- if((c < charcode_1) || ( c > charcode_0)) {
- idle(0xff00);
- continue; // Error
- }
- if(c == charcode_f){
- // HELP
- } else if(c == charcode_a){
- // Cancel
- break;
- } else if(c == charcode_1){
- // AM
- fm = 0;
- akc6955_chg_fm(fm);
- akc6955_set_amband(amband);
- akc6955_set_freq(amfreq);
- break;
- } else if(c == charcode_2){
- // Band
- setband_direct();
- break;
- } else if(c == charcode_3){
- // Band
- setfreq_direct();
- break;
- } else if(c == charcode_4){
- // fm
- fm = 0xff;
- akc6955_chg_fm(fm);
- akc6955_set_fmband(fmband);
- akc6955_set_freq(fmfreq);
- break;
- } else if(c == charcode_5){
- // Scan
- break;
- } else if(c == charcode_6){
- // Set gain
- break;
- } else if(c == charcode_7){
- // Set volume
- break;
- } else if(c == charcode_8){
- // Set sensitivity
- break;
- } else if(c == charcode_9){
- // Set NF
- break;
- } else if(c == charcode_0){
- // Setup Menu
- break;
- } else if(c == charcode_b){
- // Call userband
- input_userband();
- break;
- } else if(c == charcode_c){
- // Set userband
- set_userband();
- break;
- } else if(c == charcode_d){
- // Reserve
- break;
- } else if(c == charcode_e){
- // Reserve
- break;
- }
- idle(0xff00);
- } while(1);
-}
-
-void setfreq_updown(unsigned char ctlword)
-{
-#ifndef _LCD_DEBUG
- switch(ctlword){
- case charcode_8: // Change band
- if(fm != 0){
- amband++;
- if(amband > 18) amband = 0;
-// amfreq = akc6955_setfreq(amfreq)
- akc6955_set_amband(amband);
- _AKC6955_WAIT_62_5MS(); // 62.5ms
- amband = akc6955_get_amband();
- amfreq = akc6955_get_freq();
- } else {
- fmband++;
- if(fmband > 7) fmband = 0;
-// amfreq = akc6955_setfreq(amfreq)
- akc6955_set_fmband(fmband);
- _AKC6955_WAIT_62_5MS(); // 62.5ms
- fmband = akc6955_get_fmband();
- fmfreq = akc6955_get_freq();
- }
- break;
- case charcode_2: // Change band
- if(fm != 0){
- amband--;
- if(amband == 0) amband = 18;
- if(amband >= 18) amband = 18;
-// amfreq = akc6955_setfreq(amfreq)
- akc6955_set_amband(amband);
- _AKC6955_WAIT_62_5MS(); // 62.5ms
- amband = akc6955_get_amband();
- amfreq = akc6955_get_freq();
- } else {
- fmband--;
- if(fmband == 0) fmband = 7;
- if(fmband >= 7) fmband = 7;
-// amfreq = akc6955_setfreq(amfreq)
- akc6955_set_fmband(fmband);
- _AKC6955_WAIT_62_5MS(); // 62.5ms
- fmband = akc6955_get_fmband();
- fmfreq = akc6955_get_freq();
- }
- break;
- case charcode_4: // Down Freq;
- if(fm != 0){
- fmfreq = akc6955_down_freq(10); // DOWN 100KHz
- } else {
- amfreq = akc6955_down_freq(10); // DOWN 10KHz
- }
- break;
- case charcode_6: // Down Freq;
- if(fm != 0){
- fmfreq = akc6955_up_freq(10); // UP 100KHz
- } else {
- amfreq = akc6955_up_freq(10); // UP 10KHz
- }
- break;
- case charcode_7: // Down Fast;
- if(fm != 0){
- fmfreq = akc6955_down_freq(50); // DOWN 500KHz
- } else {
- amfreq = akc6955_down_freq(50); // DOWN 50KHz
- }
- break;
- case charcode_9: // Down Fast;
- if(fm != 0){
- fmfreq = akc6955_up_freq(50); // UP 100KHz
- } else {
- amfreq = akc6955_up_freq(50); // UP 10KHz
- }
- break;
- case charcode_1: // Down Slow;
- if(fm != 0){
- fmfreq = akc6955_down_freq(5); // DOWN 50KHz
- } else {
- amfreq = akc6955_down_freq(5); // DOWN 50KHz
- }
- break;
- case charcode_3: // Down Slow;
- if(fm != 0){
- fmfreq = akc6955_up_freq(5); // UP 50KHz
- } else {
- amfreq = akc6955_up_freq(5); // UP 5KHz
- }
- break;
- case charcode_0: // Step
- if(fm == 0){
- if(am_mode3k == 0) {
- am_mode3k = 0xff;
- } else {
- am_mode3k = 0;
- }
- amfreq = akc6955_mode3k(am_mode3k);
- }
- break;
- case charcode_a: // Toggle FM
- toggle_amfm();
- break;
- case charcode_b:
- input_userband();
- break;
- case charcode_c:
- set_userband();
- break;
- case charcode_d:
- set_volume();
- break;
- case charcode_e: // Backlight ON/OFF
- if(backlight_counter > 0) {
- backlight_counter = 0;
- } else {
- backlight_counter = backlight_long;
- }
- break;
- case charcode_f:
- main_menu();
- break;
- default:
- break;
- }
#endif
-}
-/*
- *
- */
-static void setdefault(void)
-{
- char i;
- amfreq = 954;
- fmfreq = 8000; // 10KHz order.
- amband = AKC6955_BAND_MW2;
- fmband = AKC6955_BAND_FM2;
- am_mode3k = 0xff;
- fm = 0;
- recv_signal = 0;
- am_userbandnum = 0;
- fm_userbandnum = 0;
- for(i = 0; i < 4; i++){
- am_usrbands[i].start = 0x19;
- am_usrbands[i].stop = 0x32;
- }
- for(i = 0; i < 4; i++){
- fm_usrbands[i].start = 0x19;
- fm_usrbands[i].stop = 0x32;
- }
+#endif
+void lowbatt(void)
+{
+// _CLS();
+// idle_time_ms(100);
+ printhelp_2lines("Low battery X)", "Press key to suspend");
+ shutdown(1);
}
int main(void)
{
- char readchar;
- unsigned char input_flag;
unsigned char c;
- unsigned int i;
- unsigned char pa,pb,pc,pd;
-#ifdef _LCD_DEBUG
- unsigned char power_flag;
-#endif
-// OSCCON = (_IDLEN & 0b11111100) | 0b00111000;
+ unsigned char pbutton;
+ unsigned char reset_status;
+ unsigned char p;
+ unsigned char lvcount = 0;
+ unsigned char dispf = 0xff;
+
+ OSCCON = (0x80 & 0b11111100) | 0b00111000;
+// OSCCON = (0x80 & 0b11111100) | 0b00110010; // 8MHz
idle_init();
keyin_init();
keyin_ioinit();
-
- //i2c1_init();
-
- _AKC6955_WAIT_125_0MS(); // Wait 125ms
-#ifdef _LCD_DEBUG
- power_flag = 0xff;
-#endif
- backlight_long = 256;
- backlight_counter = backlight_long;
- backlight_level = 255;
- ui_idlecount = 65535 - 7182/4 + 1; // 0.25Sec
-
- acm1602_init(0xa0, 1); //Init LCD
- _AKC6955_WAIT_125_0MS(); // Wait 125ms
- _LOCATE(0,0); // It's BAD-KNOWHOW, but needs AKIZUKI'S LCD :(
- _PUTCHAR(' '); //
- _LOCATE(0,1);
- printstr("Hello;-)");
- lcd_setbacklight(0xff, 100);
-// PORTD |= _LCDPORT_CONT_RS;
-#if 1
- i = 10001;
- do {
- ClrWdt();
- set_fmlamp(i & 1);
- set_amlamp(i & 1);
- set_powerlamp(i & 1);
- 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(0xf800);
- switch(load_eeprom()) {
- case 0x01: // No magic-word
- idle(65535-7128*2+1);
- _CLS();
- setdefault();
- _LOCATE(0,0);
- printstr("EEPROM FORMATTING");
- _LOCATE(0,1);
- printstr("Press any key");
- c = charcode_null;
- do {
- c = readkey();
- idle(ui_idlecount);
-// _CLS();
- _LOCATE(0,0);
- _PUTCHAR(c + '0');
- ClrWdt();
- } while(c == charcode_null);
- _CLS();
- _LOCATE(0,0);
- printstr("Formatting...");
- _LOCATE(0,0);
- format_eeprom(0,254);
- save_eeprom();
+ i2c1_init();
+ reset_status = chk_reset();
+ idle_time_ms(300); // Wait for setup.
+ WDTCONbits.SWDTEN = 0; // WDT OFF.
+ switch(reset_status){
+ case RESET_MCLR:
+ case RESET_BOR:
+ shutdown(0); // Save and halt on BOR.
+ break;
+ case RESET_SOFTWARE: //
+ RCONbits.RI = 0;
+ pbutton = chk_powerbutton();
+ if(pbutton == 0) shutdown(0); // Not-Pressed power-button -> shutdown( not save).
+ break;
+ case RESET_POR:
+ case RESET_WDT: // Workaround random reset.
+ // shutdown(0);
break;
- case 0x00: // Checksum error
- idle(0xff80);
- _CLS();
- _LOCATE(0,0);
- printstr("X-) Sum Error");
- _LOCATE(0,1);
- printstr("Press any key to format");
- c = charcode_null;
- do {
- _CLS();
- c = readkey();
- idle(ui_idlecount);
- _PUTCHAR(c + '0');
- ClrWdt();
- } while(c == charcode_null);
- _CLS();
- _LOCATE(0,0);
- printstr("Formatting...");
- format_eeprom(0,254);
- setdefault();
- save_eeprom();
- break;
- case 0xff: // Success
- break;
- default: // Unknown error
- setdefault();
+ default:
break;
}
- // Init AKC6955
+ WDTCONbits.SWDTEN = 1; // WDT ON.
+ power_on(1);
+ intadc_init();
+ set_powerlamp(1);
+ valinit();
+ acm1602_init(0xa0, 1); //Init LCD
+ lcd_setbacklight(0xff, 255);
/* Check EEPROM */
- /* Push default parameters to AKC6955*/
- scanflag = 0;
-#if 0
- akc6955_chg_fm(fm); // Set to AM
- akc6955_set_amband(amband);
- akc6955_set_freq(amfreq); // Dummy, TBS (954KHz)
- akc6955_set_power(0xff); // Power ON
-#endif
-#if 0
- idle(0xf000);
-#else
- idle(0xff00);
-#endif
+ check_eeprom();
+ /* Push default parameters to AKC6955*/
+ setup_akc6955();
_CLS();
_LOCATE(0,0);
_PUTCHAR(' ');
- //update_status();
-// update_display();
- idle(ui_idlecount);
- _LOCATE(0,0);
- printstr("OK");
+ update_status();
+ update_display();
+ ClrWdt();
do {
- /* Main routine*/
- c = readkey();
- if(c != charcode_null){
- if((c >= charcode_1) && (c <= charcode_0)) {
- // setfreq_updown(readchar);
+ if(battlevel <= 340) { // 3.4V
+ lvcount++;
+ if(lvcount > 4) {
+ if(dispf == 0) {
+ acm1602_resume(LCD_I2CADDR);
+ dispf = 0xff;
+ }
+ lowbatt(); //Zap 4Times on LowVoltage.
+ }
} else {
- // Other is skip
+ lvcount = 0;
}
- }
- // Check battery (include idle?)
- // Read AKJC6955's status
-// update_status();
- // Putstring to LCD.
-
-// update_display();
- if(backlight_counter > 0) {
- backlight_counter--;
- lcd_setbacklight(0xff, backlight_level); // Turn ON
- } else {
- lcd_setbacklight(0x00, 0); // Turn OFF
- }
-#ifdef _LCD_DEBUG
- if(power_flag != 0x00) {
- power_flag = 0x00;
- } else {
- power_flag = 0xff;
- }
-// setsignal_tune(power_flag);
-#endif
- idle(ui_idlecount);
+ /* Main routine*/
+ c = pollkey_single_timeout(41, 1); // 23*41 = 943ms
+ p = 0;
+ if(c != charcode_null) {
+ ClrWdt();
+ if(dispf == 0) {
+ acm1602_resume(LCD_I2CADDR);
+ dispf = 0xff;
+ }
+ setfreq_updown(c);
+ }
+ ClrWdt();
+ update_status();
+ dispf = backlight_dec(dispf); // 48ms
+ if(dispf != 0) update_display();
+ idle_time_ms(9); // Pad 9ms, 1Loop = 1000ms.
+ ClrWdt();
} while(1);
-#endif
}