* the executable file might be covered by the GNU General Public License.
*/
-#include "iodef.h"
#include <sdcc-lib.h>
#include <pic18fregs.h> /* ONLY FOR PIC18x */
#include <signal.h>
+#include "iodef.h"
+#include "ui.h"
+#include "eeprom.h"
+#include "idle.h"
+#include "ioports.h"
unsigned char eeprom_readbyte(unsigned int offset)
{
unsigned char eeprom_writebyte(unsigned int offset, unsigned char data)
{
- unsigned char eecon1;
-
+ EEDATA = data;
// Set address.
EEADR = (offset & 0x0ff);
#if defined(pic46k20) || defined(pic26k20)
EEADRH = (offset & 0x300)>>8;
#endif
- EEDATA = data;
// set eecon to read.
- eecon1 = EECON1;
- eecon1 &= ~(_EEPGD | _CFGS );
- EECON1 = eecon1 | _WREN;
+ EECON1bits.EEPGD = 0;
+ EECON1bits.CFGS = 0;
+ EECON1bits.WREN = 1;
+
INTCONbits.GIE = 0; // Disable Interrupt
// Dummy write , needs from datasheet.
EECON2 = 0x55;
- Nop();
EECON2 = 0xaa;
- Nop();
- eecon1 = EECON1;
- Nop();
+ EECON1bits.WR = 1;
+// do {
+// Nop();
+// Nop();
+// } while(EECON1bits.WR != 0);
+
+ if(EECON1bits.WRERR != 0){
+ EECON1bits.WREN = 0;
+ INTCONbits.GIE = 1;
+ return 0; // Error
+ }
INTCONbits.GIE = 1; // Enable Interrupt
- EECON1 = eecon1 & ~_WREN;
-
// Verify
- if(eeprom_readbyte(offset) != data) {
- return 0x00; // Bad
- } else {
- return 0xff;
- }
+// if(eeprom_readbyte(offset) != data) {
+// return 0x00; // Bad
+// } else {
+// return 0xff;
+// }
+ EECON1bits.WREN = 0;
+ return 0xff;
}
unsigned int calcsum_byte(unsigned int seed, unsigned char byte)
unsigned int p = start;
for(i = 0; i < bytes; i++) {
- if(eeprom_writebyte(p, 0xff) == 0) return p;
- p++;
+ ClrWdt();
+ set_fmlamp(p & 1);
+ if(eeprom_writebyte(p, 0xff) == 0) {
+ _LOCATE(1,1);
+ printstr("Error");
+ return p;
+ }
+ p = p + 1;
}
return 0xffff; // Normal end
}
\ No newline at end of file
#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
+//#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
unsigned int writeword_eeprom(unsigned int p, unsigned int *sum, unsigned int word)
{
+ ClrWdt();
if(eeprom_writebyte(p, word >> 8) == 0) return p; // Error
*sum = calcsum_byte(*sum, (word >> 8));
unsigned int writebyte_eeprom(unsigned int p, unsigned int *sum, unsigned char b)
{
+ ClrWdt();
if(eeprom_writebyte(p, b) == 0) return p; // Error
*sum = calcsum_byte(*sum, b);
return 0xffff;
unsigned char h,l;
unsigned int s;
+ ClrWdt();
+
h = eeprom_readbyte(p);
*sum = calcsum_byte(*sum, h);
{
unsigned char b;
+ ClrWdt();
+
b = eeprom_readbyte(p);
*sum = calcsum_byte(*sum, b);
{
if(fm != 0){
fm = 0;
-#ifndef _LCD_DEBUG
- akc6955_chg_fm(fm);
- akc6955_set_amband(amband);
- akc6955_set_freq(amfreq);
-#endif
+// akc6955_chg_fm(fm);
+// akc6955_set_amband(amband);
+// akc6955_set_freq(amfreq);
} else {
fm = 0xff;
-#ifndef _LCD_DEBUG
- akc6955_chg_fm(fm);
- akc6955_set_fmband(fmband);
- akc6955_set_freq(fmfreq);
-#endif
+// akc6955_chg_fm(fm);
+// akc6955_set_fmband(fmband);
+// akc6955_set_freq(fmfreq);
}
}
void update_display(void)
{
+// _HOME();
+ _LOCATE(0,0);
+ printstr("S=");
+ print_numeric_nosupress(recv_signal, 3);
+ _LOCATE(0,1);
+// _PUTCHAR(' ');
if(fm != 0){ // FM
- _LOCATE(0,0);
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("FMUSR");
}
} else { // AM
- _LOCATE(0,1);
if(amband == AKC6955_BAND_LW) {
- printstr("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(" ");
+ } 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");
+ printstr("MW4 ");
} else {
printstr("AMUSR");
}
}
- _LOCATE(16-4 ,1);
- if(fm != 0){
- printstr("MHz");
- } else {
- printstr("KHz");
- }
- _LOCATE(16-5, 1);
+// _LOCATE(15-5 ,1);
+ _LOCATE(15-4-6, 1);
if(fm != 0){
int freq_lo = fmfreq % 100;
int freq_hi = fmfreq / 100;
- print_numeric(freq_hi, 0xff);
+ print_numeric_nosupress(freq_hi, 3);
_PUTCHAR('.');
- print_numeric(freq_lo, 0xff);
+ print_numeric_nosupress(freq_lo, 2);
} else {
- print_numeric(amfreq, 0xff);
+ _PUTCHAR(' ');
+ print_numeric_nosupress(amfreq, 5);
}
// Signal
- _LOCATE(0, 0);
- printstr("S=");
- print_numeric(recv_signal, 0xff);
+ _LOCATE(15-4, 1);
+ if(fm != 0){
+ printstr("MHz");
+ } else {
+ printstr("KHz");
+ }
+ _HOME();
}
void scan_start()
{
switch(ctlword){
case charcode_8: // Change band
- if(fm != 0){
+ if(fm == 0){
amband++;
if(amband > 18) amband = 0;
// amfreq = akc6955_setfreq(amfreq)
}
break;
case charcode_2: // Change band
- if(fm != 0){
+ if(fm == 0){
amband--;
if(amband == 0) amband = 18;
if(amband >= 18) amband = 18;
break;
case charcode_4: // Down Freq;
if(fm != 0){
+ fmfreq -= 10;
// fmfreq = akc6955_down_freq(10); // DOWN 100KHz
} else {
+ amfreq -= 10;
// amfreq = akc6955_down_freq(10); // DOWN 10KHz
}
break;
case charcode_6: // Down Freq;
if(fm != 0){
+ fmfreq += 10;
// fmfreq = akc6955_up_freq(10); // UP 100KHz
} else {
+ amfreq += 10;
+
// amfreq = akc6955_up_freq(10); // UP 10KHz
}
break;
int main(void)
{
- char readchar;
- unsigned char input_flag;
unsigned char c;
- unsigned int i;
- unsigned char pa,pb,pc,pd;
+ unsigned int sum = 0;
+ unsigned char p;
+
#ifdef _LCD_DEBUG
unsigned char power_flag;
#endif
_CLS();
_LOCATE(0,0);
printstr("Formatting...");
+// format_eeprom(2,200);
+// writeword_eeprom(0, &sum, 0x1298);
+
+ // _CLS();
_LOCATE(0,0);
- format_eeprom(0,254);
- save_eeprom();
+ printstr("Save defaults");
+ setdefault();
+// save_eeprom();
break;
case 0x00: // Checksum error
idle(65535-7128*2+1);
_CLS();
_LOCATE(0,0);
printstr("Formatting...");
- format_eeprom(0,254);
+ format_eeprom(2,250);
+ writeword_eeprom(0, &sum, 0x1298);
+ _CLS();
+ _LOCATE(0,0);
+ printstr("Save defaults");
setdefault();
save_eeprom();
break;
_PUTCHAR(' ');
//update_status();
// update_display();
+ ClrWdt();
idle(ui_idlecount);
_LOCATE(0,0);
printstr("OK");
do {
/* Main routine*/
- c = pollkeys(pollkeybuf, 60, 1);
- if(c != 0){
- if((pollkeybuf[0] >= charcode_1) && (pollkeybuf[0] <= charcode_0)) {
- // setfreq_updown(readchar);
- } else {
- // Other is skip
- }
- }
+ c = pollkeys(pollkeybuf, 60, 1);
+ p = 0;
+ while(c > 0) {
+ setfreq_updown(pollkeybuf[p]);
+ c--;
+ p++;
+ }
// Check battery (include idle?)
// Read AKJC6955's status
// update_status();
// Putstring to LCD.
-
+ _LOCATE(0,0);
update_display();
if(backlight_counter > 0) {
backlight_counter--;
} 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);
+// idle(ui_idlecount);
} while(1);
#endif
}