document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. // Ereigniszähler mit Gabellichtschranke auf der Basis des "Pollin Spiel 1"
  2.  
  3. # include <stdlib.h>
  4. # include <avr/interrupt.h> // Das ist vor allem für den Ton
  5. # include "display.h"
  6. # include "util/delay.h"
  7. # include "auslagerung.c"
  8.  
  9. // Diese Werte werden von der Funktion ZahlZuString() benötigt:
  10. #define BASE_DEZ 10 // Dezimalzahlen verwenden
  11. #define STRING_LAENGE_utoa 6
  12.  
  13. // Taster-Pins
  14. // Taster1: Hängt an Pin 0 vom Port D
  15. // Taster2: an Pin 1 vom Port D
  16. # define DELAY 20 // Millisekunden
  17.  
  18. #define GABELLICHTSCHRANKE 5 // Hängt an Pin 5 von Port B
  19.  
  20. // Zum Zahlen umwandeln und ausgeben:
  21. char* ZahlZuString(uint16_t Val, char* String)
  22. {
  23.     uint8_t p;
  24.     uint8_t i = STRING_LAENGE_utoa;
  25.  
  26.     String[i] = \'\\0\';
  27.  
  28.     while(i>0)
  29.     {
  30.         i--;
  31.         String[i] = \'0\' + Val % BASE_DEZ;
  32.         Val /= BASE_DEZ;
  33.  
  34.         if(String[i]==\'0\' && Val==0)
  35.         {
  36.             p=i;
  37.             while(p<=STRING_LAENGE_utoa)
  38.             {
  39.                 String[p]=String[p+1];
  40.                 p++;
  41.             }
  42.  
  43.         }
  44.  
  45.     }
  46. return String;
  47. }
  48.  
  49. int main(void)
  50.  
  51. {
  52. AVRInit();
  53. InitDisplay();
  54.  
  55. DDRB  &= ~((1<<GABELLICHTSCHRANKE)); // definiert Port-Pin als Eingang
  56.  
  57. char OutputString[8]; // Wird für Umwanbdlung der Zahlen in Zeichen benötigt
  58. int Zaehlwert = 0;
  59. uint8_t LichtschrankeAlt=0;
  60. uint8_t LichtschrankeNeu=0;
  61.  
  62. // Es wird auf Zeile 1 ausgegeben "Zaehler:"
  63. // Es wird auf Zeile 2 ausgegeben "0"
  64.  
  65. ClearDisplay();
  66. SetDisplayCursor(1,0);
  67. WriteDisplayString("Zaehler:");
  68. SetDisplayCursor(2,0);
  69. WriteDisplayString("0");
  70.    
  71.     while(1)
  72.     {
  73.         // Der neue, aktuelle Zustand des Taster1 (links) wird abgefragt
  74.         LichtschrankeNeu=(PINB & (1<<GABELLICHTSCHRANKE));
  75.         // Bei steigender Schaltflanke wird gezählt (Taster gedrückt)
  76.         if((LichtschrankeNeu)& ~(LichtschrankeAlt))
  77.         {
  78.             Zaehlwert++;
  79.             SetDisplayCursor(2,0);
  80.             ZahlZuString(Zaehlwert, OutputString);
  81.             WriteDisplayString(OutputString);
  82.             _delay_ms(DELAY); // Warten bis Tastenprellen zu Ende      
  83.         }
  84.         // Bei fallender Schaltflanke wird nur das Prellen kompensiert
  85.         if(~(LichtschrankeNeu)& (LichtschrankeAlt))
  86.         {
  87.             _delay_ms(DELAY); // Warten, bis Tastenprellen zu Ende     
  88.         }
  89.        
  90.         // Taster2 (rechts) setzt den Zähler auf 0 zurück
  91.         if(PIND & (1<<TASTER2))
  92.         {
  93.             Zaehlwert=0;
  94.             ClearDisplay();
  95.             SetDisplayCursor(1,0);
  96.             WriteDisplayString("Zaehler:");
  97.             SetDisplayCursor(2,0);
  98.             WriteDisplayString("0");
  99.            
  100.         }
  101.         LichtschrankeAlt=LichtschrankeNeu;
  102.     }
  103.  
  104. }
');