#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"
//#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
-unsigned int amfreq;
-unsigned int fmfreq;
-unsigned int amfreq_bank[AKC6955_BAND_AMEND];
-unsigned int fmfreq_bank[AKC6955_BAND_FMEND];
-
-const banddesc ambands[19] = {
- {150,285},
- {520,1710},
- {522,1620},
- {520,1710},
- {4700, 10000},
- {3200, 4100},
- {4700, 5600},
- {5700, 6400},
- {6800, 7600},
- {9200, 10000},
- {11400,12200},
- {13500,14300},
- {15000,15900},
- {17400,17900},
- {18900,19700},
- {21400,21900},
- {11400, 17900},
- {4000,8000}, // USER
- {520,1730}
-};
-const
-const banddesc fmbands[8] = {
- {8700, 10800},
- {7600, 10800},
- {7000, 9300},
- {7600, 9000},
- {6400, 8800},
- {5625, 9175},
- {17475, 22225},
- {5000, 7000} // User
-};
-unsigned char amband;
-unsigned char fmband;
-unsigned char fm;
-unsigned char am_mode3k;
-unsigned char am_userbandnum;
-unsigned char fm_userbandnum;
-unsigned char threshold; // Reg 0x08
-_userband_t am_usrbands[USER_BAND_NUM];
-_userband_t fm_usrbands[USER_BAND_NUM];
-banddesc am_userband_freq[USER_BAND_NUM];
-banddesc fm_userband_freq[USER_BAND_NUM];
-unsigned char stereo;
-unsigned char volume;
-unsigned char prevolume;
-unsigned char fmbandwidth;
-unsigned char lowboost;
-
-int backlight_long;
-unsigned int ui_idlecount;
-unsigned char scanflag;
+#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
*/
int recv_signal;
int backlight_counter;
-unsigned char backlight_level;
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
{
PIR2bits.TMR3IF = 0;
PIE2bits.TMR3IE = 0;
T3CONbits.TMR3ON = 0;
}
+#ifdef __XC
+void EXINT_Handler(void)
+#else
SIGHANDLER(EXINT_Handler)
+#endif
{
INTCONbits.INT0IE = 0;
INTCONbits.INT0IF = 0;
INTCON3bits.INT2IE = 0;
}
+#ifdef __XC
+void RBIF_handler(void)
+#else
SIGHANDLER(RBIF_handler)
+#endif
{
power_on_inthook();
// if(chk_powerbutton(0, 0) != 0) { // If pressed on
// power_off(1); //
// }
}
-
+#ifdef __XC
+void EEPROM_handler(void)
+#else
SIGHANDLER(EEPROM_handler)
+#endif
{
PIR2bits.EEIF = 0;
EECON1bits.WREN = 0;
// }
}
+#ifdef __XC
+void INADC_handler(void)
+#else
SIGHANDLER(INADC_handler)
+#endif
{
// unsigned int a;
// a = polladc();
// if(a != 0xffff) {
// battlevel = adc_rawtobatt(a);
// }
+ PIR1bits.ADIF = 0;
}
-
+#ifdef __XC
+void I2C_handler(void)
+#else
SIGHANDLER(I2C_handler)
+#endif
{
PIR1bits.SSPIF = 0;
}
-
+#ifdef __XC
+void I2CBus_handler(void)
+#else
SIGHANDLER(I2CBus_handler)
+#endif
{
PIR2bits.BCLIF = 0;
}
+
+#ifdef __SDCC
DEF_INTLOW(intlow_handler)
DEF_HANDLER(SIG_TMR0, TMR0_handler)
DEF_HANDLER(SIG_INT0, EXINT_Handler)
- DEF_HANDLER(SIG_TMR3, I2C_handler)
+// DEF_HANDLER(SIG_TMR3, I2C_handler)
END_DEF
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_TMR0, TMR0_handler)
- DEF_HANDLER(SIG_INT1, EXINT_Handler)
- DEF_HANDLER(SIG_INT2, EXINT_Handler)
- DEF_HANDLER(SIG_AD, INADC_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
-
-
-
-
-void save_eeprom(void)
+#else
+void interrupt low_priority intlow_handler(void)
{
- 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++;
-
- 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;
- }
- for(i = 0; i < 19; i++){
- writeword_eeprom(p , &sum, amfreq_bank[i]);
- p += 2;
- }
- for(i = 0; i < 8; i++){
- writeword_eeprom(p , &sum, fmfreq_bank[i]);
- p += 2;
- }
- writebyte_eeprom(p, &sum, threshold);
- p++;
- writebyte_eeprom(p, &sum, lowboost);
- p++;
- writebyte_eeprom(p, &sum, stereo);
- p++;
- // Write checksum
- eeprom_writebyte(p, sum >> 8);
- eeprom_writebyte(p + 1, sum & 0xff);
+ if(INTCONbits.TMR0IF) TMR0_handler();
+ if(INTCONbits.INT0IF) EXINT_Handler();
}
-unsigned char load_eeprom(void)
+void interrupt high_priority inthigh_handler(void)
{
- 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;
- }
- for(i = 0; i < 19; i++){
- amfreq_bank[i] = readword_eeprom(p , &sum);
- p += 2;
- }
- for(i = 0; i < 8; i++){
- fmfreq_bank[i] = readword_eeprom(p , &sum);
- p += 2;
- }
- threshold = readbyte_eeprom(p , &sum);
- p++;
- lowboost = readbyte_eeprom(p , &sum);
- p++;
- stereo = readbyte_eeprom(p , &sum);
- p++;
- // Write checksum
- magic = (eeprom_readbyte(p) << 8) + eeprom_readbyte(p+1);
-
- p+= 2;
- if(sum != magic) return 0x00;
- return 0xff;
+ 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();
}
+#ifdef __XC
-void update_status(void)
-{
-
- unsigned int adc;
- fm = akc6955_get_fm();
-
- recv_signal = akc6955_read_level();
- diffstat = akc6955_get_diff();
- volume = akc6955_getvolume();
- prevolume = akc6955_get_prevolume();
- if(fm != 0){
- fmfreq = akc6955_get_freq();
- fmband = akc6955_get_fmband();
- stereoflag = akc6955_get_stereo();
- } else {
- amfreq = akc6955_get_freq();
- amband = akc6955_get_amband();
- stereoflag = 0x00;
- }
-#if 1
- tuneflag = akc6955_tune();
- cnrlevel = akc6955_get_cnr();
-// batlevel_6955 = akc6955_get_battery();
- akc6955_get_fmbandwidth(fmbandwidth);
-#else
- batlevel_6955 = 330;
#endif
- batlevel_6955 = 330;
- startadc(7);
- idle_time_ms(1);
- polladc2(adc);
- battlevel = adc_rawtobatt(adc, batlevel_6955);
-// battlevel = adc;
-}
+#endif
-void print_freq(unsigned char y)
-{
- int freq;
- int freq_lo;
- int freq_hi;
- _LOCATE(0,y);
- if(fm != 0){ // FM
- if(fmband < AKC6955_BAND_TV1) {
- printstr("FM");
- _PUTCHAR('1' + (fmband & 7));
- printstr(" ");
- } else if(fmband < AKC6955_BAND_FMUSER){
- printstr("TV");
- _PUTCHAR('1' + fmband - AKC6955_BAND_TV1);
- printstr(" ");
- } else { // USER
- printstr("FMU");
- _PUTCHAR('0' + fm_userbandnum);
- _PUTCHAR(' ');
- }
- } else { // AM
- if(amband == AKC6955_BAND_LW) {
- printstr("LW");
- } else if(amband <AKC6955_BAND_SW1) { //MW
- printstr("MW");
- _PUTCHAR('1' + amband - AKC6955_BAND_MW1);
- printstr(" ");
- } else if(amband <AKC6955_BAND_SW10) { //MW
- printstr("SW");
- _PUTCHAR('1' + amband - AKC6955_BAND_SW1);
- printstr(" ");
- } else if(amband < AKC6955_BAND_AMUSER) { //MW
- printstr("SW1");
- _PUTCHAR('0' + amband - AKC6955_BAND_SW10);
- _PUTCHAR(' ');
- } else if(amband == AKC6955_BAND_MW4){
- printstr("MW4 ");
- } else {
- printstr("AMU");
- _PUTCHAR('0' + am_userbandnum);
- _PUTCHAR(' ');
- }
- }
-// _LOCATE(15-5 ,1);
- _LOCATE(16-3-6, y);
- if(fm != 0){
- if(stereoflag != 0){
- printstr("ST");
- } else {
- printstr(" ");
- }
- freq = fmfreq + diffstat / 100;
- freq_lo = freq % 100;
- freq_hi = freq / 100;
- print_numeric_nosupress(freq_hi, 3);
- _PUTCHAR('.');
- print_numeric_nosupress(freq_lo, 2);
- } else {
- freq = amfreq + diffstat / 10;
- printstr(" ");
- print_numeric_nosupress(freq, 5);
- }
- // Signal
- _LOCATE(16-3, y);
- if(fm != 0){
- printstr("MHz");
- } else {
- printstr("KHz");
- }
-}
-void update_display(void)
+void lowbatt(void)
{
-
- unsigned int vol;
- int lv;
-// _HOME();
- _LOCATE(0,0);
- printstr("S");
- if(recv_signal < 0){
- _PUTCHAR('-');
- lv = - recv_signal;
- print_numeric_nosupress(lv / 20, 1);
- } else {
- lv = recv_signal;
- print_numeric_nosupress(lv / 20, 1); // MAX=123
- _PUTCHAR(' ');
- }
- if(fm == 0){
- set_amlamp(1);
- set_fmlamp(0);
- } else {
- set_amlamp(0);
- set_fmlamp(1);
- }
- // vol = volume * 1.5 + prevolume * 3.5[dB]
- if(volume > 24) {
- vol = volume - 24;
- vol = (vol * 3 + prevolume * 7) / 2;
- printstr("V:");
- print_numeric_nosupress(vol,2);
- } else {
- printstr("MUTE");
- }
-
- _LOCATE(16-5,0);
- print_numeric_nosupress(battlevel / 100, 1);
- _PUTCHAR('.');
- print_numeric_nosupress(battlevel % 100, 2);
- _PUTCHAR('V');
- print_freq(1);
-// _PUTCHAR(' ');
- _HOME();
-}
-
-
-void setfreq_updown(unsigned char ctlword)
-{
- switch(ctlword){
- case charcode_8: // Change band
- if(fm == 0){
- amfreq_bank[amband] = amfreq;
- if(amband >= AKC6955_BAND_MW4) {
- amband = 0;
- } else {
- amband++;
- }
- amfreq = amfreq_bank[amband];
- akc6955_set_amband(amband);
- akc6955_set_freq(amfreq);
- idle_time_62_5ms(); // 62.5ms
- amband = akc6955_get_amband();
- amfreq = akc6955_get_freq();
- } else {
- fmfreq_bank[fmband] = fmfreq;
- if(fmband >= AKC6955_BAND_FMUSER) {
- fmband = 0;
- } else {
- fmband++;
- }
- fmfreq = fmfreq_bank[fmband];
- akc6955_set_fmband(fmband);
- idle_time_62_5ms(); // 62.5ms
- akc6955_set_freq(fmfreq);
- fmband = akc6955_get_fmband();
- fmfreq = akc6955_get_freq();
- }
- break;
- case charcode_2: // Change band
- if(fm == 0){
- amfreq_bank[amband] = amfreq;
- if(amband == 0) {
- amband = AKC6955_BAND_MW4;
- } else if(amband > AKC6955_BAND_MW4) {
- amband = AKC6955_BAND_MW4;
- } else {
- amband--;
- }
- amfreq = amfreq_bank[amband];
- akc6955_set_amband(amband);
- akc6955_set_freq(amfreq);
- idle_time_62_5ms(); // 62.5ms
- amband = akc6955_get_amband();
- amfreq = akc6955_get_freq();
- } else {
- fmfreq_bank[fmband] = fmfreq;
- if(fmband == 0) {
- fmband = AKC6955_BAND_FMUSER;
- } else if(fmband > AKC6955_BAND_FMUSER) {
- fmband = AKC6955_BAND_FMUSER;
- } else {
- fmband--;
- }
- fmfreq = fmfreq_bank[fmband];
- akc6955_set_fmband(fmband);
- idle_time_62_5ms(); // 62.5ms
- akc6955_set_freq(fmfreq);
- fmband = akc6955_get_fmband();
- fmfreq = akc6955_get_freq();
- }
- break;
- case charcode_4: // Down Freq;
- if(fm != 0){
- fmfreq = akc6955_down_freq(25); // DOWN 250KHz
- } else {
- amfreq = akc6955_down_freq(30); // DOWN 30KHz
- }
- break;
- case charcode_6: // Down Freq;
- if(fm != 0){
- // fmfreq += 10;
- fmfreq = akc6955_up_freq(25); // UP 250KHz
- } else {
- // amfreq += 10;
- amfreq = akc6955_up_freq(30); // UP 30KHz
- }
- break;
- case charcode_9: // Down Fast;
- if(fm != 0){
- // fmfreq += 50;
- fmfreq = akc6955_up_freq(50); // DOWN 500KHz
- } else {
- // amfreq += 50;
- amfreq = akc6955_up_freq(100); // DOWN 100KHz
- }
- break;
- case charcode_7: // Down Fast;
- if(fm != 0){
-// fmfreq -= 50;
- fmfreq = akc6955_down_freq(50); // UP 500KHz
- } else {
-// amfreq -= 50;
- amfreq = akc6955_down_freq(100); // UP 10KHz
- }
- break;
- case charcode_1: // Down Slow;
- if(fm != 0){
- // fmfreq -= 3;
- fmfreq = akc6955_down_freq(3); // DOWN 30KHz
- } else {
- // amfreq -= 3;
- if(amband == AKC6955_BAND_MW2) {
- amfreq = akc6955_down_freq(9);
- } else if(amband == AKC6955_BAND_MW3) {
- amfreq = akc6955_down_freq(10);
- } else if(am_mode3k == 0x00) {
- amfreq = akc6955_down_freq(3); // DOWN 50KHz
- } else {
- amfreq = akc6955_down_freq(5); // DOWN 50KHz
- }
- }
- break;
- case charcode_3: // Down Slow;
- if(fm != 0){
-// fmfreq += 3;
- fmfreq = akc6955_up_freq(3); // UP 30KHz
- } else {
-// amfreq += 3;
- if(amband == AKC6955_BAND_MW2){
- amfreq = akc6955_up_freq(9);
- } else if(amband == AKC6955_BAND_MW3) {
- amfreq = akc6955_up_freq(10);
- } else if(am_mode3k == 0x00) {
- amfreq = akc6955_up_freq(3); // DOWN 50KHz
- } else {
- amfreq = akc6955_up_freq(5); // DOWN 50KHz
- }
- }
- 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:
- set_volume();
- break;
- case charcode_c:
- // Scan
- scan_start();
- break;
- case charcode_d:
- // FM Narrow/Wide
- set_stereo();
- break;
- case charcode_e: // Backlight ON/OFF
- if(backlight_counter > 0) {
- backlight_counter = 0;
- } else {
- backlight_counter = backlight_long;
- }
- break;
- case charcode_5:
- main_menu();
- break;
- case charcode_f:
- updown_help();
- _CLS();
- _LOCATE(0,0);
- break;
- default:
- break;
- }
-}
-/*
- *
- */
-void setdefault(void)
-{
- char i;
- //amfreq = 954;
- //fmfreq = 8000; // 10KHz order.
- amband = AKC6955_BAND_MW2;
- fmband = AKC6955_BAND_FM2;
- am_mode3k = 0xff;
- fm = 0;
- am_userbandnum = 0;
- fm_userbandnum = 0;
- lowboost = 0xff;
- threshold = 0b01011000;
- 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;
- }
- for(i =0; i < 18; i++){
- amfreq_bank[i] = ((ambands[i].end - ambands[i].start) >> 1) + ambands[i].start;
- }
- for(i =0; i < 8; i++){
- fmfreq_bank[i] = ((fmbands[i].end - fmbands[i].start) >> 1) + fmbands[i].start;
- }
- fmfreq = fmfreq_bank[fmband];
- amfreq = amfreq_bank[amband];
- stereo = 0xff; // Auto
-}
-
-void valinit(void)
-{
- // UI
- backlight_long = 256;
- backlight_counter = backlight_long;
- backlight_level = 255;
- ui_idlecount = 250; // 0.25Sec
- // Statuses
- scanflag = 0;
- cnrlevel = 0;
- recv_signal = 103;
- battlevel = 0;
- batlevel_6955 = 330; // 3.30V(temporally).
- if(amband > 18) amband = 18;
- if(fmband > 7) fmband = 7;
- if(am_userbandnum >= USER_BAND_NUM) am_userbandnum = USER_BAND_NUM - 1;
- if(fm_userbandnum >= USER_BAND_NUM) fm_userbandnum = USER_BAND_NUM - 1;
- volume = 0;
- prevolume = 0;
- fmbandwidth = 0;
- diffstat = 0;
- cnrlevel = 103;
- stereoflag = 0x00; // Auto
+// _CLS();
+// idle_time_ms(100);
+ printhelp_2lines("Low battery X)", "Press key to suspend");
+ shutdown(1);
}
int main(void)
{
unsigned char c;
- unsigned int sum = 0;
unsigned char pbutton;
unsigned char reset_status;
unsigned char p;
+ unsigned char lvcount = 0;
+ unsigned char dispf = 0xff;
- OSCCON = (_IDLEN & 0b11111100) | 0b00111000;
+ OSCCON = (0x80 & 0b11111100) | 0b00111000;
+// OSCCON = (0x80 & 0b11111100) | 0b00110010; // 8MHz
idle_init();
keyin_init();
keyin_ioinit();
-
- batlevel_6955 = 0;
- battlevel = 0;
- WDTCONbits.SWDTEN = 1; // WDT ON.
+ i2c1_init();
reset_status = chk_reset();
-#if 1
+ idle_time_ms(300); // Wait for setup.
+ WDTCONbits.SWDTEN = 0; // WDT OFF.
switch(reset_status){
- case RESET_POR:
case RESET_MCLR:
- power_off(0);
- break;
case RESET_BOR:
- power_off(1); // Save and halt on BOR.
+ shutdown(0); // Save and halt on BOR.
break;
case RESET_SOFTWARE: //
- do {
- pbutton = chk_powerbutton();
- ClrWdt();
- if(pbutton == 0) power_off(0); // Button not pressed.
- } while(pbutton == 0);
+ 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;
default:
break;
}
-#endif
- i2c1_init();
+ WDTCONbits.SWDTEN = 1; // WDT ON.
power_on(1);
intadc_init();
set_powerlamp(1);
- idle_time_ms(125);
valinit();
acm1602_init(0xa0, 1); //Init LCD
- idle_time_ms(125);
- _LOCATE(0,0); // It's BAD-KNOWHOW, but needs AKIZUKI'S LCD :(
- _PUTCHAR(' '); //
- _LOCATE(0,1);
- printstr("Hello;-)");
- lcd_setbacklight(0xff, 100);
- idle_time_ms(1000);
-#if 1
- switch(load_eeprom()) {
- case 0x01: // No magic-word
- idle_time_ms(2000);
- _CLS();
- setdefault();
- _LOCATE(0,0);
- printstr("EEPROM FORMATTING");
- _LOCATE(0,1);
- printstr("Press any key");
- c = pollkey_single();
- _CLS();
- _LOCATE(0,0);
- printstr("Formatting...");
- format_eeprom(2,250);
- _CLS();
- _LOCATE(0,0);
- printstr("Save defaults");
- setdefault();
- save_eeprom();
- break;
- case 0x00: // Checksum error
- idle_time_ms(2000);
- _CLS();
- _LOCATE(0,0);
- printstr("X-) Sum Error");
- _LOCATE(0,1);
- printstr("Press any key to format");
- c = pollkey_single();
- _CLS();
- _LOCATE(0,0);
- printstr("Formatting...");
- format_eeprom(2,250);
-// writeword_eeprom(0, &sum, 0x1298);
- _CLS();
- _LOCATE(0,0);
- printstr("Save defaults");
- setdefault();
- save_eeprom();
- break;
- case 0xff: // Success
- break;
- default: // Unknown error
- setdefault();
- break;
- }
-#endif
- // Init AKC6955
+// idle_time_ms(125);
+// _LOCATE(0,0); // It's BAD-KNOWHOW, but needs AKIZUKI'S LCD :(
+ // _PUTCHAR(' '); //
+ // _LOCATE(0,1);
+// printstr("Hello;-)");
+ lcd_setbacklight(0xff, 255);
+// idle_time_ms(1000);
/* Check EEPROM */
- /* Push default parameters to AKC6955*/
+ check_eeprom();
+ /* Push default parameters to AKC6955*/
setup_akc6955();
_CLS();
_LOCATE(0,0);
_PUTCHAR(' ');
- update_status();
- update_display();
+ update_status();
+ update_display();
ClrWdt();
-// _LOCATE(0,0);
-// printstr("OK");
+ lcd_setbacklight(0xff, 255);
do {
+ if(battlevel <= 340) { // 3.4V
+ lvcount++;
+ if(lvcount > 4) {
+ if(dispf == 0) {
+ acm1602_resume(LCD_I2CADDR);
+ dispf = 0xff;
+ }
+ lowbatt(); //Zap 4Times on LowVoltage.
+ }
+ } else {
+ lvcount = 0;
+ }
/* Main routine*/
-#if 1
- c = pollkeys(pollkeybuf, 60, 1);
- p = 0;
- while(c > 0) {
- setfreq_updown(pollkeybuf[p]);
- c--;
- p++;
- }
-#else
- c = pollkey_single();
- setfreq_updown(c);
-#endif
-// idle_time_ms(ui_idlecount);
- // Putstring to LCD.
- _LOCATE(0,0);
- pbutton = chk_powerbutton();
- if(pbutton != 0) shutdown(1); // Button pressed.
-
- if(backlight_counter > 0) {
- backlight_counter--;
- lcd_setbacklight(0xff, backlight_level); // Turn ON
- } else {
- lcd_setbacklight(0x00, 0); // Turn OFF
+ c = pollkeys(pollkeybuf, 19, 1); // 23*19=437ms
+ p = 0;
+ while(c > 0) {
+ ClrWdt();
+ if(dispf == 0) {
+ acm1602_resume(LCD_I2CADDR);
+ dispf = 0xff;
+ }
+ setfreq_updown(pollkeybuf[p]);
+ c--;
+ p++;
+ }
+// _LOCATE(0,0);
+ pbutton = chk_powerbutton(); // 48ms
+ if(pbutton != 0) shutdown(1); // Button pressed.
+ ClrWdt();
+ update_status();
+ if(backlight_counter > 0) {
+ if(dispf == 0) {
+ acm1602_resume(LCD_I2CADDR);
+ dispf = 0xff;
+ }
+ backlight_counter--;
+ lcd_setbacklight(0xff, setup.backlight_level); // Turn ON
+ update_display();
+ } else {
+ lcd_setbacklight(0x00, 0); // Turn OFF
+ acm1602_suspend(LCD_I2CADDR);
+ dispf = 0;
}
- update_status();
- update_display();
+ ClrWdt();
} while(1);
}