OSDN Git Service

[UI] Add some features, for using akc6955.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 26 Jun 2013 19:09:37 +0000 (04:09 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 26 Jun 2013 19:09:37 +0000 (04:09 +0900)
[General] Use div/multiply to reduce usage of program-area.

adc_int.c
akc6955.c
akc6955.h
eeprom.c
idle.c
main.c
menu.c
menu.h
power.c
ui.c

index 6404475..d2d7422 100644 (file)
--- a/adc_int.c
+++ b/adc_int.c
@@ -117,8 +117,8 @@ unsigned int adc_rawtobatt(unsigned int b, unsigned int reflevel)
     // 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
index 4d6dabf..c4e2a52 100644 (file)
--- a/akc6955.c
+++ b/akc6955.c
@@ -104,6 +104,7 @@ unsigned char akc6955_get_fmband(void)
     return b;
 }
 
+#if 0
 void akc6955_set_power(unsigned char on)
 {
     unsigned char b;
@@ -115,6 +116,7 @@ void akc6955_set_power(unsigned char on)
     }
     akc6955_writecmd(AKC6955_POWER, b);
 }
+#endif
 
 void akc6955_do_tune(void)
 {
@@ -159,8 +161,7 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
     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){
@@ -171,7 +172,7 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
     }
     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;
@@ -189,7 +190,7 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
     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);
 }
 
@@ -248,14 +249,14 @@ unsigned int akc6955_get_freq(void)
     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;
@@ -266,13 +267,20 @@ void akc6955_set_freq(unsigned int 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;
@@ -317,9 +325,9 @@ int akc6955_read_level(void)
     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;
@@ -328,9 +336,9 @@ int akc6955_read_level(void)
     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 {
@@ -367,8 +375,21 @@ int akc6955_get_diff(void)
 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();
 }
@@ -377,9 +398,22 @@ unsigned int akc6955_up_freq(unsigned int step)
 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();
 }
@@ -393,6 +427,17 @@ void akc6955_setvolumemode(unsigned char flag)
     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;
@@ -480,38 +525,6 @@ unsigned char akc6955_get_stereo(void)
     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
index 4262374..50343ce 100644 (file)
--- a/akc6955.h
+++ b/akc6955.h
@@ -92,6 +92,7 @@ extern "C" {
         AKC6955_BAND_SW13,   // 11400~17900KHz, 5KHz order
         AKC6955_BAND_AMUSER, // User Setting
         AKC6955_BAND_MW4,    // 520~1730KHz, 5KHz order
+        AKC6955_BAND_AMEND
     };
 
 
@@ -104,8 +105,17 @@ extern "C" {
         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
  */
@@ -143,7 +153,9 @@ extern void akc6955_set_fmband(unsigned char band);
      
 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);
 
@@ -165,6 +177,7 @@ extern int akc6955_get_diff(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);
@@ -173,14 +186,11 @@ extern void akc6955_setphase(unsigned char flag);
 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
 }
index a12da14..96e0f5e 100644 (file)
--- a/eeprom.c
+++ b/eeprom.c
@@ -37,7 +37,6 @@
 
 unsigned char eeprom_readbyte(unsigned int offset)
 {
-    unsigned char eecon1;
 
     // Set address.
     EEADR = (offset & 0x0ff);
diff --git a/idle.c b/idle.c
index 0dddf0b..373bb7f 100644 (file)
--- a/idle.c
+++ b/idle.c
@@ -82,7 +82,6 @@ void idle_time_ms(unsigned int ms)
 {
     unsigned int tim;
     unsigned char upper;
-    unsigned char i;
 
     if(ms == 0) return;
     upper = (ms & 0xe000) >> 13;
diff --git a/main.c b/main.c
index 06ef066..dd90dc9 100644 (file)
--- a/main.c
+++ b/main.c
 #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;
@@ -167,7 +207,7 @@ SIGHANDLER(EEPROM_handler)
 
 SIGHANDLER(INADC_handler)
 {
-    unsigned int a;
+//    unsigned int a;
 //    a = polladc();
 //    if(a != 0xffff) {
 //        battlevel = adc_rawtobatt(a);
@@ -236,10 +276,23 @@ void save_eeprom(void)
         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)
@@ -287,6 +340,20 @@ 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);
 
@@ -301,8 +368,9 @@ void update_status(void)
 {
 
     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();
@@ -314,7 +382,6 @@ void update_status(void)
         }
         tuneflag = akc6955_tune();
         cnrlevel = akc6955_get_cnr();
-        diffstat = akc6955_get_diff();
         volume = akc6955_getvolume();
         prevolume = akc6955_get_prevolume();
         batlevel_6955 = akc6955_get_battery();
@@ -329,20 +396,12 @@ void update_status(void)
 
 }
 
-
-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");
@@ -381,24 +440,74 @@ void update_display(void)
         }
      }
 //     _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();
 }
 
@@ -407,43 +516,65 @@ void setfreq_updown(unsigned char ctlword)
 {
     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;
@@ -527,14 +658,16 @@ void setfreq_updown(unsigned char ctlword)
         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) {
@@ -561,15 +694,16 @@ void setfreq_updown(unsigned char ctlword)
 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;
@@ -578,18 +712,48 @@ void setdefault(void)
         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();
@@ -625,10 +789,7 @@ int main(void)
     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
@@ -689,13 +850,7 @@ int main(void)
     // 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(' ');
@@ -706,17 +861,19 @@ int main(void)
 //    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();
@@ -728,7 +885,7 @@ int main(void)
         } else {
             lcd_setbacklight(0x00, 0); // Turn OFF
         }
-        idle_time_ms(ui_idlecount);
+//m          idle_time_ms(ui_idlecount);
         update_status();
         update_display();
     } while(1);
diff --git a/menu.c b/menu.c
index 1ffd56b..d61b38d 100644 (file)
--- a/menu.c
+++ b/menu.c
  */
 
 #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)
@@ -53,80 +197,64 @@ 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)
@@ -135,17 +263,17 @@ 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();
     }
 }
 
@@ -159,6 +287,7 @@ void call_userband(unsigned char num)
         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;
@@ -166,14 +295,8 @@ void call_userband(unsigned char num)
         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)
@@ -202,15 +325,12 @@ 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;
@@ -224,7 +344,7 @@ void set_userband(void)
         to = am_usrbands[c].stop * p;
         _CLS();
         _LOCATE(0,0);
-        printstr("AM #");
+        printstr("AM#");
         print_numeric_nosupress(c, 1);
         printstr(" Step:");
         _LOCATE(0,1);
@@ -239,14 +359,11 @@ void set_userband(void)
         }
         _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;
@@ -338,7 +455,7 @@ void mainmenu_help(void)
         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;
@@ -373,7 +490,7 @@ void updown_help(void)
         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;
@@ -387,11 +504,32 @@ void menu_poweroff(void)
     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;
@@ -404,20 +542,22 @@ void menu_save(void)
 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();
     }
 }
 
@@ -432,7 +572,7 @@ void setup_help(void)
         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;
@@ -464,6 +604,17 @@ void setup_menu(void)
         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;
     }
 }
 /*
@@ -504,11 +655,17 @@ void main_menu(void)
             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){
diff --git a/menu.h b/menu.h
index 280f27b..6f0aec2 100644 (file)
--- a/menu.h
+++ b/menu.h
@@ -61,18 +61,36 @@ extern "C" {
      */
     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;
@@ -95,11 +113,15 @@ extern "C" {
     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
 }
diff --git a/power.c b/power.c
index 8a7cb45..1fc0628 100644 (file)
--- a/power.c
+++ b/power.c
@@ -100,12 +100,11 @@ void shutdown(unsigned char save)
     _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);
 }
 
@@ -122,6 +121,7 @@ void power_off(unsigned char save)
         INTCON2 |= _RBIP; // Priority = HIGH;
         INTCON &= ~(_RBIF | _GIE | _PEIE);
         INTCON |= _RBIE;
+        power_on(0);
         Sleep();
         // Wake up
         if(INTCONbits.RBIF == 1) {
diff --git a/ui.c b/ui.c
index 976cdc3..6e63806 100644 (file)
--- a/ui.c
+++ b/ui.c
@@ -111,64 +111,6 @@ char pop_keyinfifo(void) __critical
     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;
@@ -342,7 +284,7 @@ unsigned char readkey(void)
 {
     unsigned char i;
     for(i = 0; i < 9; i++) {
-        idle(0xfffc); // 3ms?
+        idle_time_ms(2); // 2ms
         readkey_io(i);
     }
     readkey_compare();
@@ -364,9 +306,8 @@ unsigned char pollkeys(unsigned char *p, unsigned int limit, unsigned char repea
     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);
@@ -403,9 +344,8 @@ unsigned char pollkey_single(void)
     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){