
Scan-Radio mit LCD-Anzeige
von Hermann Nieder
Im
Bild ist ein Scan-Radio mit einem KT0837 mit
einer I2C-Minischnittstelle, worüber bereits in einem
anderen Beitrag (FM-Radio KT0837 am Tiny13) berichtet worden ist, im Betrieb mit einem HT46F47 auf der Platine aus dem Lernpaket Modellbahn.
Der Mikrocontroller ist so umprogrammiert worden, dass er fortwährend
die Frequenz- und Lautstärkewerte des Radios ausliest und auf einem
LCD-Modul anzeigt.
Der
HT46F47 wird mit 3V betrieben. Das bereits auf der Platine eingelötete
Trimmpoti P1 steht etwa in Mittelstellung. Damit wurde dieser Portpin
in meinem kleinen Projekt auch als Ausgang verwendbar.
Portpin
PD0(PWM) des Mikrocontrolers wird als „normaler“ Ausgang verwendet.
Über ihn erfolgt zusätzlich die Übertragung der Frequenz- und
Lautstärkewerte des Scan-Radios an die serielle Schnittstelle eines
PCs, wo diese z. B. wie im Bild mithilfe des Terminalprogramms
von B. Kainka angezeigt werden können.
Nach
diesem Plan wird das LCD-Modul mit dem HT46F47 auf der Platine des oben
erwähnten Lernpakets verbunden. Das Programm für den HT46F47 in C
wurde in Anlehnung an die Listings LCDANZ.Bas sowie I2C.Bas, die im
Fachbuch „Messen-Steuern-Regeln mit dem C-Control/Basic-System“
von B. Kainka veröffentlicht wurden, entworfen.
Beim
Start des Programms wird zuerst der Lautstärkewert auf 8 verringert.
Dann wird fortlaufend die Empfangsfrequenz sowie die Lautstärke auf dem
LCD-Modul angezeigt. Außerdem erfolgt die Übertragung dieser Werte über
Pin PD0 des HT46F47 an die serielle Schnittstelle eines PCs.
Download: ScanRd_HT46F47.zip
...
void main(){
safeguard_init();
_pac=0;// Port a Ausgang
_pbc0=0; // hier Ausgang
_pdc0=0; // Ausgang TXD
_pbc3=0; // Ausgang SCL
_pbc2=0; // Ausgang/Eingang SDA
_pbc1=0; // Ausgang E am LCD-Modul
_pd0=1; // TXD = 1
_eadi=0; //Kein Interupt
i=0;
_pbc2=0; // pb2 SDA ist zuerst Ausgang
_pb3=0; // pb3 SCL ist stets Ausgang
//A_Reg=85; // Test
//WrCOM(); //
//A_Reg=170; // Test
//WrCOM(); //
I2c_init();
_pa=0;
mydelay(4); // ca. 15ms warten
LCD_init();
mydelay(55); // ca. 200ms warten
I2c_start(); // Zuerst Lautstaerkewert
E_Reg=0x6E; // verringern auf 8
I2c_write();
mydelay(1);
E_Reg=0x04;
I2c_write();
mydelay(1);
E_Reg=0x40;
I2c_write();
mydelay(1);
E_Reg=0x08;
I2c_write();
mydelay(1);
I2c_stop();
while(1)
{
Frq_lesen();
//Umrechnung in 'brauchbare' Werte
F=dat_hi*256;
F=F+dat_low;
mydelay(50);
F=F*5;
F=F+6400;
F_high=F /256;
F_hi=F_high & 255;
//A_Reg=F_high; // Test
//WrCOM();
mydelay(1);
F_low= F % 256;
//A_Reg=F_low; // Test
//WrCOM();
mydelay(100);
//Lautstaerkewerte
Lautst_lesen();
//A_Reg=dat; // Test
//WrCOM();
mydelay(1);
E_Reg=1;
LCD_cmd();
E_Reg=2;
LCD_cmd();
E_Reg=128;
LCD_cmd();
E_Reg=70; // F
LCD_char();
mydelay(1);
E_Reg=114; // r
LCD_char();
mydelay(1);
E_Reg=101; // e
LCD_char();
E_Reg=113; // q
LCD_char();
E_Reg=46; // .
LCD_char();
E_Reg=58; // :
LCD_char();
E_Reg=F /10000;
Null_ausbl();
F=F%10000;
E_Reg=F/1000;
E_Reg=E_Reg+48; //2. Ziffer
A_Reg=E_Reg;
WrCOM();
LCD_char();
F=F%1000; //3. Ziffer
E_Reg=F/100;
E_Reg=E_Reg+48;
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=46; // Dezimalpunkt
A_Reg=E_Reg;
WrCOM();
LCD_char();
F=F%100;
E_Reg=F/10;
E_Reg=E_Reg+48;
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=32; // Blank
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=77; // M
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=72; // H
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=122; // z
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=192; // in 2. Zeile
LCD_cmd();
A_Reg=32; // Blank
WrCOM();
A_Reg=32; // Blank
WrCOM();
E_Reg=76; // L
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=97; // a
LCD_char();
E_Reg=117; // u
LCD_char();
E_Reg=116; // t
LCD_char();
E_Reg=115; // s
LCD_char();
E_Reg=116; // t
LCD_char();
E_Reg=46; // .
LCD_char();
E_Reg=58; // :
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=32; // Blank
A_Reg=E_Reg;
WrCOM();
LCD_char();
E_Reg=dat/10; // 1. Ziffer
Null_ausbl();
E_Reg=dat%10; // 2. Ziffer
E_Reg=E_Reg+48;
A_Reg=E_Reg;
WrCOM();
LCD_char();
A_Reg=13; // CR
WrCOM();
A_Reg=10; // LF
WrCOM();
mydelay(200);
mydelay(200);
}
}
...