Benutzer: gast • Besitzer: matthias • Zuletzt geändert am: 2010/11/04 10:48:07


Hier zunächst der vollständige Quelltext des Programmes:

define LCD_Port byteport[2]   'Programm KEYBLCD.BAS
define LCD_EN        port[15] 'stellt das auf der Folientastatur eingegebene
define LCD_Status    byte     'Zeichen in der ersten LCD-Displayzeile dar
define LCD_Position1 byte     'und sendet es über den Telemetriesender;
define LCD_Position2 byte     'empfängt entsprechend Zeichen über den
define Daten         byte     'Telemetrie-Empfänger und stellt sie in der 
define Send_EN       port[16] 'zweiten Displayzeile dar 
define KBD_port      ad[8]
define KBD_Code      byte
define KBD_AltTaste  byte
define i             byte
define h             byte
'*****Initialisierungen****************************************************
baud R2400
gosub LCD_Init
pause 10
'*****Hauptprogramm********************************************************
#Loop
 if rxd then gosub receive
 for i = 0 to 11
  looktab KBD_codetab, i, KBD_Code
  if abs(KBD_Port-KBD_Code)<3 then gosub send
 next
goto Loop
end
'**************************************************************************
'*****Empfangsroutine******************************************************
'* setzt den Cursor in die zweite Zeile des Displays, holt das Zeichen von
'* der seriellen Schnittstelle und gibt es im Display aus
#receive
 get h
 beep 400,25,10
 if LCD_Position2=0 then gosub LCD_Cls2
 Daten=&HC0+LCD_Position2 : gosub LCD_WriteCmd
 if LCD_Position2<15 then LCD_Position2=LCD_Position2+1 else LCD_Position2=0
 daten=h : gosub LCD_WriteChr : h=0
return
'*****Senderoutine*********************************************************
'* setzt den Cursor in die erste Zeile des Displays, schreibt das zu sendende Zeichen
'* dorthin und gibt es dann über die serielle Schnittstelle aus
#send
 looktab LCD_tab,i,h
 Send_EN=On : pause 5 : put h : Send_EN=Off
 if rxd then get daten                          'verhindert den Empfang des selbst 
 if LCD_Position1=0 then gosub LCD_Cls1         'gesendeten Zeichens
 Daten=&H80+LCD_Position1 : gosub LCD_WriteCmd
 if LCD_Position1<15 then LCD_Position1=LCD_Position1+1 else LCD_Position1=0
 Daten=h : LCD_WriteChr
 i=11
return
'*****LCD-Steuerroutinen***************************************************
#LCD_Init
 LCD_Position1=0 : LCD_Position2=0 : LCD_Port=0
 Daten=&H38 : gosub LCD_WriteCmd
 LCD_Port=&H02 : pulse LCD_EN
 Daten=&H0E : gosub LCD_WriteCmd

#LCD_ClS
 Daten=&H02 : gosub LCD_WriteCmd
 Daten=&H01 : gosub LCD_WriteCmd
return

#LCD_WriteCmd
 LCD_Status=&B00000000
 goto LCD_Write
#LCD_WriteChr
 LCD_Status=&B00100000
#LCD_Write
 LCD_Port = LCD_Status or (Daten shr 4)
 pulse LCD_EN
 LCD_Port = LCD_Status or (Daten and &H0F)
 pulse LCD_EN
return

#LCD_Cls1
 for i=15 to 0 step -1
  daten=&H80+i : gosub LCD_WriteCmd
  daten=&H20   : gosub LCD_WriteChr
 next
return

#LCD_Cls2
 for i=15 to 0 step -1
  daten=&HC0+i : gosub LCD_WriteCmd
  daten=&H20   : gosub LCD_WriteChr
 next
return
'*****Tabellen*************************************************************
table KBD_codetab                                'enthält die den anlaogen
 90 68 153 235 46 132 214 23 111 194 0 173       'Spannungswerten der Tasten
 '0  1   2   3  4   5   6  7   8   9 *   #       'entsprechenden digitalen
tabend                                           'Werte

table LCD_tab                              'enthält die ASCII-Codes der mit der
 &H30 &H31 &H32 &H33 &H34 &H35             'Tastatur darstellbaren Zeichen
 &H36 &H37 &H38 &H39 &H2A &H23 
tabend