home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 April / CHIP4_98.ISO / software / ccconrad / basic.exe / CHIP / Programme.Bas / Wetterstation / Wetterstation_02.bas < prev   
Encoding:
BASIC Source File  |  1997-12-15  |  7.6 KB  |  313 lines

  1. '**** Wetterstation **** 12.11.1997  *******************************************
  2. ' Autor Loys Nachtmann
  3. '
  4. ' Ausgabe 1. Zeile auf dem LC-Display
  5. ' Luftdruck [hPa]
  6. ' Temperatur [░C]
  7. ' Luftfeuchte [%]
  8. '
  9. ' Ausgabe 2. Zeile auf dem LC-Display
  10. ' Uhrzeit/Datum, synchronisiert mit DCF77-Antenne
  11. '
  12. ' Systemvoraussetzung:
  13. '
  14. ' - Application Board mit angeschlossenem Display
  15. '
  16. ' - Temperatursensor      an AD[1]
  17. ' - KTY-Me▀bereich -27,5..100░C
  18. '
  19. ' - Barometer/H÷hensensor an AD[2]
  20. ' - H÷he bis 510  Meter: Mode = Hight_510   'J3 = Alt-Position,  J2 = off
  21. ' - H÷he bis 2041 Meter: Mode = Hight_2041  'J3 = Alt-Position,  J2 = on
  22. ' - Barometer          : Mode = Barometer   'J3 = Baro-Position, J2 = on
  23. ' - Ausgabe des Luftdrucks in [hPa] auf dem LC-Display
  24. '
  25. ' - Luftfeuchtesensor     an AD[3]
  26. ' - Me▀bereich 0..100%
  27. '
  28. ' - Uhr/Datumausgabe auf dem LC_Display ss:mm   TT.MM.JJ
  29. '
  30. '********************************************************************************
  31.  
  32. ' ***  LCD_Integer
  33. define value     word[1]
  34. define output    word[2]
  35.  
  36. 'nur fⁿr Tendenzanzeige ben÷tigt
  37. 'define Baro_alt  word[3]
  38. 'define Temp_alt  word[4]
  39. 'define Hygro_alt word[5]
  40.  
  41.  
  42. ' *** LCD_Byte ***
  43. define lcd_buf   byte[11]
  44. define lcd_param byte[12]
  45.  
  46. ' *** Counter
  47. define i         byte[13]
  48.  
  49. ' *** LCD-Ports ***
  50. define lcd_port byteport[2]
  51. define lcd_rs port[14]
  52. define lcd_rw port[13]
  53. define lcd_e port[15]
  54.  
  55. ' ***  H÷henmesser  ***
  56. define Temp_Sample   AD[1]
  57. define Baro_Sample   AD[2]
  58. define Hyg_Sample    AD[3]
  59. define Hight_510     0
  60. define Hight_2041    2
  61. define Barometer     3
  62.  
  63. '*** ASCII-Codes ***
  64. define c_0 &H30
  65. define c_C &H43
  66. define c_E &H45
  67. define c_M &H4D
  68. define c_P &H50
  69. define c_T &H54
  70. define c_m_ &H6D
  71. define c_h_ &H68
  72. define c_a_ &H61
  73. define c_s_ &H73
  74.  
  75. define esc         &H1B
  76. define c_Leer      &H20
  77. define c_Prozent   &H25
  78. define c_plus      &H2B
  79. define c_Minus     &H2D
  80. define c_Dot       &H2E
  81.  
  82. define c_colon     &H3A
  83. define c_Gleich    &H3D
  84. define c_Grad      &HDF
  85. define c_steigend  126
  86. define c_fallend   127
  87.  
  88.  
  89. '***  Hauptprogramm  ***
  90.  
  91. 'Nur fⁿr Tendenzanzeige ben÷tigt
  92. 'Baro_alt  = 0
  93. 'Temp_alt  = 0
  94. 'Hygro_alt = 0
  95.  
  96. hour = 10 : minute =30 : day =15 : month = 12 : year = 97
  97. gosub LCD_INIT
  98.  
  99. #Loop
  100.   gosub LCD_CLS
  101.   LCD_param = 1 : gosub LCD_GOTOLINE
  102.   gosub baro                                'J3 = Baro-Position, J2 = on
  103.   gosub temperatur
  104.   gosub Hygrometer
  105.  
  106.   LCD_param = 2 : gosub LCD_GOTOLINE
  107.   gosub DCF77_Uhr
  108.   gosub DCF77_Datum
  109.  
  110.   PAUSE 100
  111.   goto Loop
  112. END
  113.  
  114.  
  115. #baro
  116.   LOOKTAB Baro_Tab,Baro_Sample,value : gosub LCD_Write_Integer
  117.   lcd_param = c_h_   : gosub LCD_WriteChar
  118.   lcd_param = c_P    : gosub LCD_WriteChar
  119. 'Tendenz
  120. '  if value > Baro_alt then lcd_param = c_steigend
  121. '  if value = Baro_alt then lcd_param = c_gleich
  122. '  if value < Baro_alt then lcd_param = c_fallend
  123.  
  124.   lcd_param = c_Leer
  125.   gosub LCD_WriteChar
  126. '  Baro_alt = value
  127. return
  128.  
  129. #temperatur
  130.   LOOKTAB Temp_Tab,Temp_Sample,value
  131.   if value >= 0 then lcd_param = c_Plus else lcd_param = c_minus
  132.   gosub LCD_WriteChar
  133.   gosub LCD_Write_Integer
  134.   lcd_param = c_Grad : gosub LCD_WriteChar
  135. 'Tendenz
  136. '  if value > Temp_alt then lcd_param = c_steigend
  137. '  if value = Temp_alt then lcd_param = c_gleich
  138. '  if value < Temp_alt then lcd_param = c_fallend
  139.   lcd_param = c_Leer
  140.   gosub LCD_WriteChar
  141. '  Temp_alt = value
  142. return
  143.  
  144. #Hygrometer
  145.   LOOKTAB Hyg_Tab,Hyg_Sample,value : gosub LCD_Write_Integer
  146.   lcd_param = c_Prozent : gosub LCD_WriteChar
  147. 'Tendenz
  148. '  if value > Hygro_alt then lcd_param = c_steigend
  149. '  if value = Hygro_alt then lcd_param = c_gleich
  150. '  if value < Hygro_alt then lcd_param = c_fallend
  151. '  gosub LCD_WriteChar
  152. '  Hygro_alt = value
  153. return
  154.  
  155. #DCF77_Uhr
  156.   if hour < 10 then gosub LCD_0    ' Stunde
  157.   value = hour : gosub LCD_Write_Integer : gosub LCD_Colon
  158.  
  159.   if minute < 10 then gosub LCD_0  ' Minute
  160.   value = minute : gosub LCD_Write_Integer ': gosub LCD_Colon
  161.  
  162.   'if second < 10 then gosub LCD_0  ' Sekunde
  163.   'value = second : gosub LCD_Write_Integer
  164.  
  165.   for i = 1 to 3
  166.     gosub LCD_Leerzeichen
  167.   next
  168. return
  169.  
  170.  
  171.  
  172. #DCF77_Datum
  173.   if day < 10 then gosub LCD_0    ' Tag
  174.   value = day : gosub LCD_Write_Integer : gosub LCD_Dot
  175.  
  176.   if month < 10 then gosub LCD_0   ' Monat
  177.   value = month : gosub LCD_Write_Integer : gosub LCD_Dot
  178.  
  179.   if year < 10 then gosub LCD_0    ' Jahr
  180.   value = year : gosub LCD_Write_Integer
  181. return
  182.  
  183.  
  184.  
  185.  
  186. '***  Output Integer to LCD ***
  187. #LCD_Write_Integer
  188.   output = abs(value)
  189.   'negatives Vorzeichen oder Leerzeichen
  190.   if value < 0 then gosub LCD_Minus 'else gosub LCD_Leerzeichen
  191.  
  192.   'Zehntausender-Dezimalstelle oder Leerzeichen
  193.   if abs(value) >= 10000 then gosub LCD_Zehntausend 'else gosub LCD_Leerzeichen
  194.   output = output mod 10000
  195.  
  196.   ' Tausender-Dezimalstelle oder Leerzeichen
  197.   if abs(value) >= 1000 then gosub LCD_Tausend 'else gosub LCD_Leerzeichen
  198.   output = output mod 1000
  199.  
  200.   ' Hunderter-Dezimalstelle oder Leerzeichen
  201.   if abs(value) >= 100 then gosub LCD_Hundert 'else gosub LCD_Leerzeichen
  202.   output = output mod 100
  203.  
  204.   ' Zehner-Dezimalstelle oder Leerzeichen
  205.   if abs(value) >= 10 then gosub LCD_Zehn 'else gosub LCD_Leerzeichen
  206.  
  207.   ' Einer Dezimalstelle
  208.   lcd_param = c_0 + output mod 10 : gosub LCD_WriteChar
  209. return
  210.  
  211. #LCD_Leerzeichen
  212.   lcd_param = c_Leer : goto LCD_WriteChar
  213.  
  214. #LCD_Minus
  215.   lcd_param = c_Minus : goto LCD_WriteChar
  216.  
  217. #LCD_0      ' schreibe "0"
  218.   lcd_param = c_0 : goto LCD_WriteChar
  219.  
  220. #LCD_Dot    ' schreibe "."
  221.   lcd_param = c_Dot : goto LCD_WriteChar
  222.  
  223. #LCD_Colon  ' schreibe ":"
  224.   lcd_param = c_Colon : goto LCD_WriteChar
  225.  
  226. #LCD_Zehntausend
  227.   lcd_param = c_0 + output/10000 : goto LCD_WriteChar
  228.  
  229. #LCD_Tausend
  230.   lcd_param = c_0 + output/1000 : goto LCD_WriteChar
  231.  
  232. #LCD_Hundert
  233.   lcd_param = c_0 + output/100 : gosub LCD_WriteChar
  234. return
  235.  
  236. #LCD_Zehn
  237.   lcd_param = c_0 + output/10 : goto LCD_WriteChar
  238.  
  239.  
  240. '*** LCD_Interface ***
  241. '( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden)
  242.  
  243. #LCD_INIT
  244.  
  245. ' alle ports 0
  246.   lcd_port = OFF
  247.  
  248. ' 8-Bit-Modus aktivieren
  249.   lcd_param=&H38 : gosub LCD_WRITECMD
  250.  
  251. ' mit 8-Bit-Command in 4-Bit-Modus umschalten
  252.   lcd_port=&B00000010
  253.   tog lcd_e
  254.   tog lcd_e
  255.  
  256. ' ab jetzt 4-Bit-Modus
  257.   lcd_param = &H28 : gosub LCD_WRITECMD
  258.   lcd_param = &H0C : gosub LCD_WRITECMD
  259.  
  260. ' Display loeschen
  261. #LCD_CLS
  262.   lcd_param = &H02 : gosub LCD_WRITECMD
  263.   lcd_param = &H01 : gosub LCD_WRITECMD
  264. return
  265.  
  266. #LCD_Clear_Line_1                           ' **** L÷sche Zeile 1
  267.   lcd_param = 1 : gosub LCD_GOTOLINE        ' Wechsel in die erste Zeile
  268.   for i = 1 to 16
  269.     gosub LCD_Leerzeichen
  270.   next
  271.   lcd_param = 1 : gosub LCD_GOTOLINE        ' Wechsel in die erste Zeile
  272. return
  273.  
  274. #LCD_Clear_Line_2                           ' **** L÷sche Zeile 2
  275.   lcd_param = 2 : gosub LCD_GOTOLINE        ' Wechsel in die zweite Zeile
  276.   for i = 1 to 16
  277.     gosub LCD_Leerzeichen
  278.   next
  279.   lcd_param = 2 : gosub LCD_GOTOLINE        ' Wechsel in die erste Zeile
  280. return
  281.  
  282. ' Zeilenwechsel
  283. #LCD_GOTOLINE
  284.   if lcd_param = 1 then lcd_param = &H80
  285.   if lcd_param = 2 then lcd_param = &HC0
  286.   goto LCD_WRITECMD
  287.  
  288. ' LCD-Kommando
  289. #LCD_WRITECMD
  290.   lcd_buf = OFF
  291.   goto LCD_WRITE
  292.  
  293. ' Zeichenausgabe
  294. #LCD_WRITECHAR
  295.   lcd_buf = &B00100000
  296.  
  297. ' Kommando oder Zeichen an Display senden
  298. #LCD_WRITE
  299.   lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
  300.   tog lcd_e
  301.   tog lcd_e
  302.   lcd_port = lcd_buf or (lcd_param and &H0F)  ' Lo-Nibble
  303.   tog lcd_e
  304.   tog lcd_e
  305. return
  306.  
  307. table Baro_Tab "Baro.tab"   'Tabelle mu▀ im Programmverzeichnis stehen)
  308. table Temp_Tab "kty.tab"    'Tabelle mu▀ im Programmverzeichnis stehen)
  309. table Hyg_Tab  "Hyg.tab"    'Tabelle mu▀ im Programmverzeichnis stehen)
  310.  
  311.  
  312.  
  313.