[General] Use div/multiply to reduce usage of program-area.
// raw = (reflevel[0.01V] * b) / 1024 * divide :divide = 4
// Fullscale = 0.5 (1.625V, raw = 6.5V)
// raw = b * 0.5 * 4 = b * 2 (b = 1024 6.500V)
- i = b >> 3; // div = 1/8
+ i = b / 8; // div = 1/8
// Fullscale = 13.2v =
- i = (i * reflevel) >> 5;
+ i = (i * reflevel) / 32;
return i;
}
\ No newline at end of file
return b;
}
+#if 0
void akc6955_set_power(unsigned char on)
{
unsigned char b;
}
akc6955_writecmd(AKC6955_POWER, b);
}
+#endif
void akc6955_do_tune(void)
{
unsigned char band;
unsigned char fm;
unsigned char b;
- unsigned int i;
- unsigned int mod;
+ unsigned int i = ch;
fm = akc6955_readcmd(AKC6955_POWER) & 0x40;
if(fm == 0){
}
if(band == 2){
// BAND=AM && MW2
- i = i / 3; // On MW2, Channnel must be multiple of 3.
+ i = ch / 3; // On MW2, Channnel must be multiple of 3.
i = (i << 1) + i; // i = (i/3) * 3
}
if(i > 0x1fff) i = 0x1fff;
do{
// Use software-delay, but recommands hardware-delay ;-(
//_AKC6955_WAIT_12_5MS();
- idle(65535 - 100 + 1); // 0.128 * 100 = 12.8ms
+ idle(65535 - 100 + 1); // 0.125 * 100 = 12.5ms
} while(akc6955_tune() == 0);
}
fm = akc6955_readcmd(AKC6955_POWER) & 0x40;
i = l + (h << 8);
if(fm != 0){ // 25KHz
- freq = i << 1 + i >> 1 + 3000; // freq' = 25*i[KHz] = (25 / 10) *i [10KHz]
+ freq = (i * 5) / 2 + 3000; // freq' = 25*i[KHz] = (25 / 10) *i [10KHz]
// = 2.5i[10KHz]
// freq = freq' + 30MHz = freq' + 3000[10KHz]
} else { // 5K
if(b == 0) { // 5KHz
- freq = i << 2 + i; // freq = 5*i[KHz] = (4+1)*i[KHz]
+ freq = i * 5; // freq = 5*i[KHz] = (4+1)*i[KHz]
} else { // 3KHz
- freq = i << 1 + i; // freq = 3i[KHz] = (2+1)i[KHz]
+ freq = i * 3; // freq = 3i[KHz] = (2+1)i[KHz]
}
}
return freq;
unsigned int ch;
unsigned char fm;
unsigned char mode3k = 0;
+ unsigned char band;
fm = akc6955_readcmd(AKC6955_POWER) & 0x40;
if(fm != 0) { // FM
- ch = freq - 3000;
- ch = ch << 2;
- ch = ch / 10; // 10/25 = 0.4
+ band = akc6955_get_fmband() & 7;
+ if(freq < fmbands[band].start) freq = fmbands[band].start;
+ if(freq >= fmbands[band].end) freq = fmbands[band].end - 1;
+ ch = freq - 3000;
+ ch = (ch * 4) / 10;
} else {
+ band = akc6955_get_amband();
+ if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
+ if(freq < ambands[band].start) freq = ambands[band].start;
+ if(freq >= ambands[band].end) freq = ambands[band].end - 1;
mode3k = akc6955_readcmd(AKC6955_CNR_AM) & 0x80;
if(mode3k == 0){
ch = freq / 5;
unsigned char fm;
unsigned char rflevel, iflevel;
unsigned char b;
- unsigned int rssi;
+ int rssi;
unsigned int freq;
- unsigned int totallevel;
+ int totallevel;
int level;
fm = akc6955_readcmd(AKC6955_POWER) & 0x40;
iflevel = (b & 0x1c) >> 2;
totallevel = rflevel + iflevel;
- rssi = (unsigned int)(akc6955_readcmd(AKC6955_RSSI) & 0x7f);
+ rssi = (int)(akc6955_readcmd(AKC6955_RSSI) & 0x7f);
// totallevel = rssi + 6*totallevel;
- level = (int)((totallevel << 2) + (totallevel << 1) + rssi);
+ level = (int)(totallevel * 6 + rssi);
if(fm != 0){
level = 103 - level; // totallevel * 6
} else {
unsigned int akc6955_up_freq(unsigned int step)
{
unsigned int freq;
+ unsigned char fm;
+ unsigned char band;
+
+ fm = akc6955_readcmd(AKC6955_POWER) & 0x40;
freq = akc6955_get_freq();
freq += step;
+ if(fm == 0){
+ band = akc6955_get_amband();
+ if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
+ if(freq >= ambands[band].end) freq = ambands[band].end - 1;
+ } else {
+ band = akc6955_get_fmband();
+ if(band >= AKC6955_BAND_FMEND) band = AKC6955_BAND_FMEND - 1;
+ if(freq >= fmbands[band].end) freq = fmbands[band].end - 1;
+ }
akc6955_set_freq(freq);
return akc6955_get_freq();
}
unsigned int akc6955_down_freq(unsigned int step)
{
unsigned int freq;
+ unsigned char fm;
+ unsigned char band;
+
freq = akc6955_get_freq();
if(freq <= step) return freq;
freq -= step;
+ fm = akc6955_readcmd(AKC6955_POWER) & 0x40;
+ if(fm == 0){
+ band = akc6955_get_amband();
+ if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
+ if(freq < ambands[band].start) freq = ambands[band].start;
+ } else {
+ band = akc6955_get_fmband();
+ if(band >= AKC6955_BAND_FMEND) band = AKC6955_BAND_FMEND - 1;
+ if(freq < fmbands[band].start) freq = fmbands[band].start;
+ }
akc6955_set_freq(freq);
return akc6955_get_freq();
}
akc6955_writecmd(AKC6955_ENABLE, c);
}
+unsigned char akc6955_getvolumemode(void)
+{
+ unsigned char c;
+ c = akc6955_readcmd(AKC6955_ENABLE) & 0x08;
+ if(c == 0){
+ return 0;
+ } else {
+ return 0xff;
+ }
+}
+
void akc6955_setvolume(unsigned char level)
{
unsigned char c;
return 0xff;
}
-void akc6955_set_fm_threash(unsigned char val)
-{
- unsigned char c = akc6955_readcmd(AKC6955_THRESH);
- val = val & 0x03;
- c = (c & 0x3f) | (val << 6);
- akc6955_writecmd(AKC6955_THRESH, c);
-}
-
-void akc6955_set_am_threash(unsigned char val)
-{
- unsigned char c = akc6955_readcmd(AKC6955_THRESH);
- val = val & 0x03;
- c = (c & 0xcf) | (val << 4);
- akc6955_writecmd(AKC6955_THRESH, c);
-}
-
-void akc6955_set_fd_threash(unsigned char val)
-{
- unsigned char c = akc6955_readcmd(AKC6955_THRESH);
- val = val & 0x03;
- c = (c & 0xf3) | (val << 2);
- akc6955_writecmd(AKC6955_THRESH, c);
-}
-
-void akc6955_set_stereo_threash(unsigned char val)
-{
- unsigned char c = akc6955_readcmd(AKC6955_THRESH);
- val = val & 0x03;
- c = (c & 0xfc) | val ;
- akc6955_writecmd(AKC6955_THRESH, c);
-}
-
/*
* Get battery level.
* Unit = 0.01V
AKC6955_BAND_SW13, // 11400~17900KHz, 5KHz order
AKC6955_BAND_AMUSER, // User Setting
AKC6955_BAND_MW4, // 520~1730KHz, 5KHz order
+ AKC6955_BAND_AMEND
};
AKC6955_BAND_TV1, // 56.25~91.75MHz
AKC6955_BAND_TV2, // 174.75~222.25MHz
AKC6955_BAND_FMUSER, // User Setting
+ AKC6955_BAND_FMEND
};
-
+/*
+ * Band defines
+ */
+ typedef struct {
+ unsigned int start;
+ unsigned int end;
+} banddesc;
+extern const banddesc ambands[AKC6955_BAND_AMEND];
+extern const banddesc fmbands[AKC6955_BAND_FMEND];
/*
* Resister definitions
*/
extern unsigned char akc6955_get_amband(void);
extern unsigned char akc6955_get_fmband(void);
+#if 0
extern void akc6955_set_power(unsigned char on);
+#endif
extern void akc6955_do_tune(void);
extern unsigned char akc6955_tune(void);
extern void akc6955_setvolume(unsigned char level);
extern void akc6955_setvolumemode(unsigned char flag);
+extern unsigned char akc6955_getvolumemode(void);
extern unsigned char akc6955_getvolume(void);
extern unsigned char akc6955_get_prevolume(void);
extern void akc6955_set_prevolume(unsigned char level);
extern void akc6955_setline(unsigned char flag);
extern void akc6955_set_stereomode(unsigned char mode);
extern unsigned char akc6955_get_stereo(void);
-extern void akc6955_set_fm_threash(unsigned char val);
-extern void akc6955_set_am_threash(unsigned char val);
-extern void akc6955_set_fd_threash(unsigned char val);
-extern void akc6955_set_stereo_threash(unsigned char val);
extern void akc6955_set_scanrate_fm(unsigned char rate);
extern unsigned int akc6955_get_battery(void);
extern void akc6955_set_fmbandwidth(unsigned char bw);
extern unsigned char akc6955_get_fmbandwidth(void);
+extern void akc6955_set_lowboost(unsigned char flag);
#ifdef __cplusplus
}
unsigned char eeprom_readbyte(unsigned int offset)
{
- unsigned char eecon1;
// Set address.
EEADR = (offset & 0x0ff);
{
unsigned int tim;
unsigned char upper;
- unsigned char i;
if(ms == 0) return;
upper = (ms & 0xe000) >> 13;
#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 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;
SIGHANDLER(INADC_handler)
{
- unsigned int a;
+// unsigned int a;
// a = polladc();
// if(a != 0xffff) {
// battlevel = adc_rawtobatt(a);
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);
- p+= 2;
}
unsigned char load_eeprom(void)
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);
{
unsigned int adc;
-#if 0
+#if 1
recv_signal = akc6955_read_level();
+ diffstat = akc6955_get_diff();
if(fm != 0){
fmfreq = akc6955_get_freq();
fmband = akc6955_get_fmband();
}
tuneflag = akc6955_tune();
cnrlevel = akc6955_get_cnr();
- diffstat = akc6955_get_diff();
volume = akc6955_getvolume();
prevolume = akc6955_get_prevolume();
batlevel_6955 = akc6955_get_battery();
}
-
-void update_display(void)
+void print_freq(unsigned char y)
{
-// _HOME();
- _LOCATE(0,0);
- printstr("S=");
- print_numeric_nosupress(recv_signal, 3);
- _LOCATE(16-5,0);
- print_numeric_nosupress(battlevel / 100, 1);
- _PUTCHAR('.');
- print_numeric_nosupress(battlevel % 100, 2);
- _PUTCHAR('V');
- _LOCATE(0,1);
-// _PUTCHAR(' ');
+ int freq;
+ int freq_lo;
+ int freq_hi;
+ _LOCATE(0,y);
if(fm != 0){ // FM
if(fmband < AKC6955_BAND_TV1) {
printstr("FM");
}
}
// _LOCATE(15-5 ,1);
- _LOCATE(16-3-6, 1);
+ _LOCATE(16-3-6, y);
if(fm != 0){
- int freq_lo = fmfreq % 100;
- int freq_hi = fmfreq / 100;
+ 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 {
- _PUTCHAR(' ');
- print_numeric_nosupress(amfreq, 5);
+ freq = amfreq + diffstat / 10;
+ printstr(" ");
+ print_numeric_nosupress(freq, 5);
}
// Signal
- _LOCATE(16-3, 1);
+ _LOCATE(16-3, y);
if(fm != 0){
printstr("MHz");
} else {
printstr("KHz");
}
+}
+
+void update_display(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();
}
{
switch(ctlword){
case charcode_8: // Change band
- if(fm == 0){
- amband++;
- if(amband > 18) amband = 0;
- akc6955_set_freq(amfreq);
+ 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 {
- fmband++;
- if(fmband > 7) fmband = 0;
- akc6955_set_fmband(fmband);
- akc6955_set_freq(fmfreq);
- idle_time_62_5ms(); // 62.5ms
- fmband = akc6955_get_fmband();
- fmfreq = akc6955_get_freq();
+ 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){
- amband--;
- if(amband == 0) amband = 18;
- if(amband >= 18) amband = 18;
+ 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
+ idle_time_62_5ms(); // 62.5ms
amband = akc6955_get_amband();
amfreq = akc6955_get_freq();
} else {
- fmband--;
- if(fmband == 0) fmband = 7;
- if(fmband >= 7) fmband = 7;
- akc6955_set_fmband(fmband);
- idle_time_62_5ms(); // 62.5ms
- akc6955_set_freq(fmfreq);
- fmband = akc6955_get_fmband();
- fmfreq = akc6955_get_freq();
+ 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;
case charcode_a: // Toggle FM
toggle_amfm();
break;
- case charcode_d:
- //input_userband();
+ case charcode_b:
+ set_volume();
break;
case charcode_c:
- //set_userband();
+ // Scan
+ scan_start();
break;
- case charcode_b:
- //set_volume();
+ case charcode_d:
+ // FM Narrow/Wide
+ set_stereo();
break;
case charcode_e: // Backlight ON/OFF
if(backlight_counter > 0) {
void setdefault(void)
{
char i;
- amfreq = 954;
- fmfreq = 8000; // 10KHz order.
+ //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;
+ lowboost = 0xff;
+ threshold = 0b01011000;
for(i = 0; i < 4; i++){
am_usrbands[i].start = 0x19;
am_usrbands[i].stop = 0x32;
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
}
int main(void)
{
unsigned char c;
unsigned int sum = 0;
- unsigned char p;
unsigned char pbutton;
unsigned char reset_status;
- unsigned int adc;
OSCCON = (_IDLEN & 0b11111100) | 0b00111000;
idle_init();
intadc_init();
set_powerlamp(1);
idle_time_ms(125);
- backlight_long = 256;
- backlight_counter = backlight_long;
- backlight_level = 255;
- ui_idlecount = 250; // 0.25Sec
+ valinit();
power_on(1);
acm1602_init(0xa0, 1); //Init LCD
// Init AKC6955
/* 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
+ setup_akc6955();
_CLS();
_LOCATE(0,0);
_PUTCHAR(' ');
// printstr("OK");
do {
/* Main routine*/
- // c = pollkeys(pollkeybuf, 60, 1);
- // p = 0;
- // while(c > 0) {
- // setfreq_updown(pollkeybuf[p]);
- // c--;
- // p++;
- // }
+#if 0
+ 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);
- // Check battery (include idle?)
- // Read AKJC6955's status
- //update_status();
// Putstring to LCD.
_LOCATE(0,0);
pbutton = chk_powerbutton();
} else {
lcd_setbacklight(0x00, 0); // Turn OFF
}
- idle_time_ms(ui_idlecount);
+//m idle_time_ms(ui_idlecount);
update_status();
update_display();
} while(1);
*/
#include "menu.h"
-
+#include "power.h"
void toggle_amfm(void)
{
if(fm != 0){
fm = 0;
-// akc6955_chg_fm(fm);
-// akc6955_set_amband(amband);
-// akc6955_set_freq(amfreq);
+ akc6955_chg_fm(fm);
+ akc6955_set_amband(amband);
+ akc6955_set_freq(amfreq);
} else {
fm = 0xff;
-// akc6955_chg_fm(fm);
-// akc6955_set_fmband(fmband);
-// akc6955_set_freq(fmfreq);
+ akc6955_chg_fm(fm);
+ akc6955_set_fmband(fmband);
+ akc6955_set_freq(fmfreq);
}
}
+void set_thresh(void)
+{
+ unsigned char c;
+ unsigned char a;
+ a = 0;
+ _CLS();
+ _LOCATE(0,0);
+ printstr("CNR Threshold");
+ _LOCATE(4,0);
+ printstr("FM Tun");
+ _LOCATE(0,1);
+ printstr("1-4 F=exit");
+ do {
+ c = pollkey_single();
+ if(c == charcode_f) return;
+ } while((c < charcode_1) && (c>charcode_4));
+ a |= ((c - charcode_1) << 6);
+ _LOCATE(4,0);
+ printstr("AM Tun");
+ do {
+ c = pollkey_single();
+ if(c == charcode_f) return;
+ } while((c < charcode_1) && (c>charcode_4));
+ a |= ((c - charcode_1) << 4);
+ _LOCATE(4,0);
+ printstr("Diff ");
+ do {
+ c = pollkey_single();
+ if(c == charcode_f) return;
+ } while((c < charcode_1) && (c>charcode_4));
+ a |= ((c - charcode_1) << 2);
+ _LOCATE(4,0);
+ printstr("Stereo");
+ do {
+ c = pollkey_single();
+ if(c == charcode_f) return;
+ } while((c < charcode_1) && (c>charcode_4));
+ a |= (c - charcode_1);
+ akc6955_writecmd(AKC6955_THRESH, a);
+}
+
+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;
+ }
+ akc6955_set_stereomode(mode);
+}
+
+void set_stereo(void)
+{
+ if(stereo == 0xff) {// Force Mono
+ stereo = 0x00;
+ } else if(stereo == 0x00) { //Mono->Stereo
+ stereo = 0x7f;
+ } else { // Default, Stereo->auto
+ stereo = 0xff;
+ }
+ set_stereomode();
+}
+
+
void set_volume(void)
{
+ unsigned char c;
+ unsigned char d;
+ unsigned char p;
+
+ _CLS();
+ do {
+ d = akc6955_getvolumemode();
+
+ _LOCATE(0,0);
+ if(d == 0){
+ _PUTCHAR('D');
+ } else {
+ _PUTCHAR('K');
+ }
+ printstr(" F:Exit");
+ _LOCATE(0,1);
+ printstr("Vol:");
+ print_numeric_nosupress(volume, 2);
+ printstr(" Pre:");
+ _PUTCHAR('0' + (prevolume & 3));
+ if(lowboost == 0x00){
+ printstr(" ");
+ } else {
+ printstr(" LOW");
+ }
+ c = pollkeys(pollkeybuf, 60, 1);
+ p = 0;
+ while(c > 0) {
+ _LOCATE(0,1);
+ switch(pollkeybuf[p]) {
+ case charcode_6:
+ volume++;
+ if(volume > 63) volume = 63;
+ break;
+ case charcode_4:
+ volume--;
+ if(volume < 23) volume = 23;
+ break;
+ case charcode_f:
+ return;
+ case charcode_a:
+ if(d == 0){
+ akc6955_setvolumemode(0xff);
+ } else {
+ akc6955_setvolumemode(0x00);
+ }
+ break;
+ case charcode_b:
+ prevolume++;
+ if(prevolume > 3) prevolume = 0;
+ akc6955_set_prevolume(prevolume);
+ break;
+ case charcode_d:
+ if(lowboost == 0x00){
+ lowboost = 0xff;
+ } else {
+ lowboost = 0x00;
+ }
+ akc6955_set_lowboost(lowboost);
+ break;
+ default:
+ break;
+ }
+ c--;
+ p++;
+ }
+ if(volume < 24){
+ set_examp_mute(1);
+ } else {
+ set_examp_mute(0);
+ }
+ akc6955_setvolume(volume);
+ } while(1);
}
void scan_start(void)
unsigned char c;
do {
+ _CLS();
+ _LOCATE(0,0);
+ printstr("Scan A/U=6/D=4");
+ print_freq(1);
+ c = pollkey_single();
if(scanflag == 0){
- // New Scan
- _CLS();
- printstr("Scan A=ABORT");
- _LOCATE(0,1);
- printstr("U=6, D=4");
- c = pollkey_single();
- if(c == charcode_6){
-// akc6955_do_scan(0xff);
- _LOCATE(0,0);
- printstr("Scan up ");
- } else if(c == charcode_4){
-// akc6955_do_scan(0);
- printstr("Scan down ");
- } else if(c == charcode_a){
-// akc6955_abort_scan();
- } else {
- // Exit
- break;
- }
scanflag = 0xff;
} else {
- _CLS();
- printstr("Scan A=ABORT");
- _LOCATE(0,1);
- printstr("U=6, D=4");
- c = pollkey_single();
-
- 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((c == charcode_a) || (c == charcode_4) || (c == charcode_6)) {
+ akc6955_abort_scan();
+ idle_time_62_5ms();
}
-// if(akc6955_chk_donescan() != 0) break;
}
- idle(ui_idlecount);
+ // New Scan
+ if(c == charcode_6){
+ akc6955_do_scan(0xff);
+ } else if(c == charcode_4){
+ akc6955_do_scan(0);
+ } else if(c == charcode_a){
+ break;
+ } else {
+ // Not Exit
+// break;
+ }
+ scanflag = 0xff;
+
+ if(akc6955_chk_donescan() != 0) {
+ _CLS();
+ _LOCATE(0,0);
+ printstr("Scan completed");
+ print_freq(1);
+ idle_time_ms(ui_idlecount);
+ }
} while(1);
scanflag=0;
- _CLS();
- _LOCATE(0,0);
- printstr("Done.");
- idle(ui_idlecount);
- update_status();
- update_display();
}
void setfreq_direct(void)
{
unsigned int val;
_CLS();
+ _LOCATE(0,0);
+ printstr("Set Freq:");
+ _LOCATE(0,1);
if(fm != 0){
// FM
- _LOCATE(0,0);
- printstr("Set Freq:FM");
+ printstr("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");
+ printstr("AM ");
val = amfreq;
val = read_numeric(val, 5, 7, 1);
amfreq = val;
- //akc6955_set_freq(val);
}
+ akc6955_set_freq(val);
}
void setband_direct(void)
_CLS();
_LOCATE(0,0);
if(fm != 0){
- printstr("Set Band:FM");
+ printstr("Set Band:FM#");
band = fmband & 7;
fmband = read_numeric(band, 2, 7, 1);
-// akc6955_set_fmband(fmband);
-// akc6955_do_tune();
+ akc6955_set_fmband(fmband);
+ akc6955_do_tune();
} else {
- printstr("Set Band:AM");
+ printstr("Set Band:AM#");
band = amband & 0x1f;
amband = read_numeric(band, 2, 7, 1);
-// akc6955_set_amband(amband);
-// akc6955_do_tune();
+ akc6955_set_amband(amband);
+ akc6955_do_tune();
}
}
ch = ((freq - 3000) / 25) * 10;
akc6955_set_userband(fm_usrbands[num].start, fm_usrbands[num].stop, ch,
fm_usrbands[num].mode3k);
+ fmband = AKC6955_BAND_AMUSER;
} else {
unsigned int p = 5;
if(am_usrbands[num].mode3k != 0) p = 3;
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;
}
- update_status();
- update_display();
}
void set_userband(void)
to = fm_usrbands[c].stop * 80 + 3000;
_CLS();
_LOCATE(0,0);
- printstr("FM #");
+ 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:");
+ _LOCATE(6,1);
+ printstr("To:");
to = read_numeric(to, 5, 7, 1);
fm_usrbands[c].start = (from - 3000) / 80;
fm_usrbands[c].stop = (to - 3000) / 80;
to = am_usrbands[c].stop * p;
_CLS();
_LOCATE(0,0);
- printstr("AM #");
+ printstr("AM#");
print_numeric_nosupress(c, 1);
printstr(" Step:");
_LOCATE(0,1);
}
_CLS();
_LOCATE(0,0);
- printstr("AM #");
+ 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);
+ _LOCATE(6, 1);
printstr(" To:");
to = read_numeric(to, 5, 7, 1);
am_usrbands[c].start = from / p;
if(c == charcode_f) return;
c = printhelp_2lines("6: Gain", "7: Volume");
if(c == charcode_f) return;
- c = printhelp_2lines("8: Sensitivity", "9: NF");
+ c = printhelp_2lines("8: FM Wide/Narrow", "9: NF");
if(c == charcode_f) return;
c = printhelp_2lines("a: PowOFF", "b: Cancel");
if(c == charcode_f) return;
if(c == charcode_f) return;
c = printhelp_2lines("a: AM/FM", "b: Volume");
if(c == charcode_f) return;
- c = printhelp_2lines("c: Set user", "d: Input user");
+ c = printhelp_2lines("c: Scan", "d: Stereo mode");
if(c == charcode_f) return;
c = printhelp_2lines("e: Backlight", "f: (Exit) Help");
if(c == charcode_f) return;
unsigned char c;
c = printhelp_2lines("Poweroff", "A=Yes");
if(c == charcode_a) {
- save_eeprom();
-// shutdown();
+ shutdown(1);
}
}
+void setup_akc6955(void)
+{
+ akc6955_chg_fm(fm); // Set to AM
+
+ if(fm == 0) {
+ akc6955_set_amband(amband);
+ if(amband == AKC6955_BAND_AMUSER) call_userband(am_userbandnum);
+ amfreq = amfreq_bank[amband];
+ akc6955_set_freq(amfreq);
+ } else {
+ akc6955_set_fmband(fmband);
+ if(fmband == AKC6955_BAND_FMUSER) call_userband(fm_userbandnum);
+ fmfreq = fmfreq_bank[fmband];
+ akc6955_set_freq(fmfreq);
+ }// Dummy, TBS (954KHz)
+ //akc6955_set_power(0xff); // Power ON
+ akc6955_setvolume(36); // Temporally
+ akc6955_writecmd(AKC6955_THRESH, threshold);
+ akc6955_set_lowboost(lowboost);
+ set_stereomode();
+}
+
void menu_save(void)
{
unsigned char c;
void menu_load(void)
{
unsigned char c;
- c = printhelp_2lines("Load settings", "A=Yes");
+ c = printhelp_2lines("Load settings", "A=Yes B=Init");
if(c == charcode_a) {
c = load_eeprom();
if( c != 0xff) {
_CLS();
_LOCATE(0,0);
c = printhelp_2lines("X) Load Error", "A=Fix");
+ setdefault();
if(c == charcode_a){
- setdefault();
save_eeprom();
- } else {
- setdefault();
}
}
+ setup_akc6955();
+ } else if(c == charcode_b){
+ setdefault();
+ setup_akc6955();
}
}
if(c == charcode_f) return;
c = printhelp_2lines("d: Reset default", "E: BL time");
if(c == charcode_f) return;
- c = printhelp_2lines("1: Reserve", "2: Reserve");
+ c = printhelp_2lines("A: Load", "2: Threshold");
if(c == charcode_f) return;
c = printhelp_2lines("3: Reserve", "4: Reserve");
if(c == charcode_f) return;
case charcode_c:
menu_save();
break;
+ case charcode_a:
+ menu_load();
+ break;
+ case charcode_d:
+ setdefault();
+ break;
+ case charcode_e:
+ break;
+ case charcode_2:
+ set_thresh();
+ break;
}
}
/*
scan_start();
// Scan
} else if(c == charcode_6){
- // Set gain
+
+ } else if(c == charcode_4){
+
} else if(c == charcode_7){
// Set volume
+ set_volume();
} else if(c == charcode_8){
// Set sensitivity
+ fmbandwidth++;
+ if(fmbandwidth > 3) fmbandwidth = 0;
+ akc6955_set_fmbandwidth(fmbandwidth);
} else if(c == charcode_9){
// Set NF
} else if(c == charcode_0){
*/
extern unsigned int amfreq;
extern unsigned int fmfreq;
+ extern unsigned int amfreq_bank[AKC6955_BAND_AMEND];
+ extern unsigned int fmfreq_bank[AKC6955_BAND_FMEND];
extern unsigned char amband;
extern unsigned char fmband;
extern unsigned char fm;
extern unsigned char am_mode3k;
extern unsigned char am_userbandnum;
extern unsigned char fm_userbandnum;
+ extern unsigned char threshold;
+ extern unsigned char lowboost;
+ extern unsigned char stereo;
extern _userband_t am_usrbands[USER_BAND_NUM];
extern _userband_t fm_usrbands[USER_BAND_NUM];
+ extern banddesc am_userband_freq[USER_BAND_NUM];
+ extern banddesc fm_userband_freq[USER_BAND_NUM];
+ extern unsigned char volume;
+ extern unsigned char prevolume;
+ extern unsigned char fmbandwidth;
extern int backlight_long;
extern unsigned int ui_idlecount;
+
+ extern unsigned char stereoflag;
+ extern unsigned char tuneflag;
+ extern unsigned char cnrlevel;
+ extern int diffstat;
+ extern unsigned int batlevel_6955;
+ extern unsigned int battlevel;
+
extern int recv_signal;
extern int backlight_counter;
extern unsigned char backlight_level;
extern void call_userband(unsigned char num);
extern void setband_direct(void);
extern void setfreq_direct(void);
+ extern void set_stereo(void);
+
extern void scan_start(void);
extern void set_volume(void);
extern void toggle_amfm(void);
extern void updown_help(void);
extern void mainmenu_help(void);
+ extern void print_freq(unsigned char y);
+ extern void setup_akc6955(void);
#ifdef __cplusplus
}
_CLS();
_LOCATE(0,0);
printstr("Bye...");
- idle(65536 - 7182 * 2 + 1); // 2Sec
+ idle_time_ms(1500); // 1.5Sec
lcd_setbacklight(0, 0);
set_powerlamp(0);
set_amlamp(0);
set_fmlamp(0);
- power_on(0);
power_off(save);
}
INTCON2 |= _RBIP; // Priority = HIGH;
INTCON &= ~(_RBIF | _GIE | _PEIE);
INTCON |= _RBIE;
+ power_on(0);
Sleep();
// Wake up
if(INTCONbits.RBIF == 1) {
return c;
}
-void print_numeric(int i, unsigned char supressf)
-{
- if((i == 0) && (supressf != 0)){
- unsigned char c;
- c = '0';
- _CURSOR_LEFT();
- _PUTCHAR(c);
- _CURSOR_RIGHT();
- } else {
- int l;
- unsigned char supress = 0;
- if(supressf == 0) supress = 1;
- _CURSOR_LEFT();
- if(i < 0){
- _PUTCHAR('-');
- i = -i;
- }
- l = i / 10000;
- i = i % 10000;
- if(l != 0) {
- _PUTCHAR((l & 0x0f)+ '0');
- supress = 1;
- } else if(supress != 0) {
- _PUTCHAR('0');
- }
- l = i / 1000;
- i = i % 1000;
- if(supress != 0){
- _PUTCHAR((l & 0x0f)+ '0');
- } else if(l != 0){
- _PUTCHAR((l & 0x0f)+ '0');
- supress = 1;
-
- }
- l = i / 100;
- i = i % 100;
- if(supress != 0){
- _PUTCHAR((l & 0x0f)+ '0');
- } else if(l != 0){
- _PUTCHAR((l & 0x0f)+ '0');
- supress = 1;
-
- }
- l = i / 10;
- i = i % 10;
- if(supress != 0){
- _PUTCHAR((l & 0x0f)+ '0');
- } else if(l != 0){
- _PUTCHAR((l & 0x0f)+ '0');
- supress = 1;
-
- }
- _PUTCHAR((i & 0x0f) + '0');
- _CURSOR_RIGHT();
- }
-
-}
-
void printstr(char *s)
{
int p = 0;
{
unsigned char i;
for(i = 0; i < 9; i++) {
- idle(0xfffc); // 3ms?
+ idle_time_ms(2); // 2ms
readkey_io(i);
}
readkey_compare();
unsigned char c;
do {
- idle(65535 - 20 + 1); // 0.78*20 = 15.6ms.
-// idle(65535 - 2000 + 1); // 0.78*2000 = 1560ms.
- c = readkey(); // 0.78*2*8 = 11.2ms
+ idle_time_ms(10); // 0.78*20 = 15.6ms.
+ c = readkey(); //
ClrWdt();
if(c != charcode_null) {
push_keyinfifo(c);
unsigned char c;
do {
- idle(65535 - 20 + 1); // 0.78*20 = 15.6ms.
-// idle(65535 - 2000 + 1); // 0.78*2000 = 1560ms.
- c = readkey(); // 0.78*2*8 = 11.2ms
+ idle_time_ms(10); // 0.125 * 4 * 20 = 10ms.
+ c = readkey(); // 2 * 4
ClrWdt();
if(c != charcode_null) {
if(cold != c){