G240uhr.cpp

 

 

 

 

 

 


Dieses Programm ist ein Ausgabeprogramm für Datum und Uhrzeit einer DOS-PCuhr, so wie sie auch im RTOS von IPC@CHIP Webservern vorkommt. Zeit und Datum werden fortschreitend auf dem grafikfähigen Touchdisplays EAeDIP240 ausgegeben. Das Display zeigt zwei Touch-Tasten. Mit einer kann das Licht der Anzeige eingeschaltet werden, wenn diese nach etwa 20 Sekunden die Ausgabe verdunkelt hat, mit der zweiten Taste kann das Programm verlassen werden.

Verwendete Schnittstelle
Je nach verwendetem dip240x.h -Treiber kann eine der Schnittstellen RS232, I2C-Bus oder SPI-Bus. Benutzt werden. Hierzu muss im unteren Programm eine der Headerdateien dip240x.h aktiviert werden (x= i|s|p).

ESC-Sequenzen des Display
Die eigentlichen Grafikfunktionen und die der Touchfolie die auf den Protokollen der Schnittstellentreiber fussen und im Datenblatt beschrieben werden, sind in zwei weiteren Headerdateien mit den Namen G240dip.h und F240dip.h untergebracht. Auch diese müssen im unteren Programm eingebunden sein. Dabei sind in diesen Dateien mehr Unterprogramme enthalten, als das Programm benötigt. Wer will, kann die nicht benötigten ESC-Sequenzen aus diesen Headerdateien löschen.

Spannungsversorgung des Modells
Wird die 5V Versorgungsgleichspannung über den jeweiligen Schnittstellenanschluss übertragen, kann das Display ohne Benutzung der 2,1mm Klinkenbuchse betrieben werden. (Hierzu ist bei der seriellen Verbindung der Pin RI hierfür vorgesehen, es muss im Display der Drahtschalter geschlossen sein). Es ist zwingend darauf zu achten, dass nur eine Spannungsversorgung aktiv ist.


 

 

 


Headerdateien
Die in diesem Programm verwendeten Treiber-Includedateien für die IPC@CHIP Webserver sind, dem benutzten Bus entsprechend, durch Setzen oder Entfernen der Kommentarstriche im Programm unten zu aktivieren oder zu deaktivieren. Alle benutzten Headerdateien sollten grundsätzlich im gleichen Verzeichnis wie das Hauptprogramm liegen.




.. serielle RS 232 Schnittstelle



dip240s.h

Protokoll- und Schnittstellentreiber für RS232 Schnittstelle des Touchdisplay. Diese Datei lädt die serial.h Includedatei.




serial.h Treiber für die RS232-Schnittstellen am IPC@CHIP Webserver


 

 

.. I2C-Bus

 


dip240i.h

Protokoll- und Schnittstellentreiber für die I2C-Bus Schnittstelle des Touchdisplay. Diese Datei lädt die i2c.h Includedatei.




i2c.h Treiber für den I2C-Bus am IPC@CHIP Webserver


 

 

.. SPI-Bus

 


dip240p.h

Protokoll- und Schnittstellentreiber für die SPI-Bus Schnittstelle des Touchdisplay. Diese Datei lädt die spi.h Includedatei.




spi.h Treiber für den SPI-Bus am IPC@CHIP Webserver


 

 

 

 







.. Funktionensammlung für Grafikdisplay und Touchfolie



Gdip240.h

Funktionen zur Ansteuerung der Grafikeigenschaften der EA eDIP240 Anzeige. Diese Programme wirken über die zuvor aufgeführten Treibern der Schnittstellen.



Fdip240.h

Funktionen zur Ansteuerung der Touchfolie der EA eDIP240 Anzeige. Diese Programme wirken über die zuvor aufgeführten Treibern der Schnittstellen.









// 240uhr.cpp
// ------------  Version 10.04.2007
//               Borland IDE C++ 3.1 oder 5.02
//               Model:  SMALL
//               Char:   unsigned
//               bearbeitet: www.GoBlack.de, D.Schwarzer
// ----------------------------------------------------------------

// Testprogramm für die Grafikanzeige und die Touchfolie des
// TouchDisplays EA eDIP240-7 ..
// .. an einer der Schnittstellen: I2C-Bus| serielle Schnittstelle|
//    SPI-Bus

// Die Schnittstellentreiber für das TouchDisplay befinden sich in
// einer der Include-Dateien 'dip240x.h'. Eine dieser Dateien muss
// aktiviert sein.

  #include "dip240s.h"       // RS232-Schnittst, (benöt serial.h)
//#include "dip240i.h"       // I2C-Bus,         (benötigt i2c.h)
//#include "dip240p.h"       // SPI-Bus,         (benötigt spi.h)

// Die Steuerfunktionen für die Anzeige und die Touchfolie befinden
// sich in den nachfolgenden Include-Dateien ..
  #include "Fdip240.h"        // Steuerfkt. für die Touchfolie
  #include "Gdip240.h"        // Steuerfkt. für die Grafikanzeige


  #include <stdio.h>          // C-Bibliothek für printf()


// DOS_zeit()
// Holt die Zeit der DOS-Uhr im RTOS Betriebssystem und wandelt
// die Angaben zu Stunde (CH), Minute (CL) und Sekunde (DH) in
// einen nullterminierten String, bei dem die Angaben
// durch das Zeichen ':' getrennt sind. Der Buffer 'zeit' zur
// Ablage des Strings muss mit 9 Speicherzellen übergeben werden.
// Die Funktion gibt die Sekundenangabe zurück.

char DOS_zeit (char far* zeit)
{
 asm{ mov AH, 2Ch             // SoftINT 21h, Funktion 2Ch
      int 21h                 // DOS_Uhr, Zeit holen

      les DI,zeit             // Zeiger auf Zeitstring
      mov BL,10
      mov AH,0
      mov AL,CH               // Stunde in CH
      div BL
      add AL,30h
      mov ES:[DI+0],AL
      add AH,30h
      mov ES:[DI+1],AH        // Stunde zum String
      mov AH,':'
      mov ES:[DI+2],AH        // : zum String
      mov AH,0
      mov AL,CL               // Minute in CL
      div BL
      add AL,30h
      mov ES:[DI+3], AL
      add AH,30h
      mov ES:[DI+4],AH        // Minute zum String
      mov AH,':'
      mov ES:[DI+5],AH        // : zum String
      mov AH,0
      mov AL,DH               // Sekunde in DH
      div BL
      add AL,30h
      mov ES:[DI+6], AL
      add AH,30h
      mov ES:[DI+7],AH        // Sekunde zum String
      mov AH,0
      mov ES:[DI+8],AH        // Nullterminierung
    }
    return(_DH);
}


// DOS_datum()
// Holt das Datum der DOS-Uhr im RTOS Betriebssystem und wandelt
// die Angaben zu Tag (DL), Minute (DH) und Jahr (CX) in
// einen nullterminierten String, bei dem die Angaben
// durch das Zeichen '.' getrennt sind. Der Buffer 'datum' zur
// Ablage des Strings muss mit 14 Speicherzellen übergeben werden.
void DOS_datum(char far* datum)
{
 char* wotag[]= {"So","Mo","Di","Mi","Do","Fr","Sa","So"};
 char* tag;
 char  n=0;
 
 asm{ mov AH, 2Ah             // SoftINT 21h, Funktion 2Ah
      int 21h                 // DOS-Uhr, Datum holen
      mov n, AL               // Kennummer für Tagesnamen
      pusha  }

      tag=wotag[n];           // tag= adresse für Tagesnamen 
 asm{ popa
      les DI,datum            // Zeiger auf String
      mov BX, tag
      mov AL, [BX+0]          // 1. Zeichen Tagesname
      mov ES:[DI+0],AL
      mov AL, [BX+1]
      mov ES:[DI+1],AL        // 2.Zeichen Tagesname
      mov AL, ' '
      mov ES:[DI+2],AL        // Freizeichen
      mov BL,10
      mov AH,0
      mov AL,DL               // Tag in DL
      div BL
      add AL,30h
      mov ES:[DI+3],AL
      add AH,30h
      mov ES:[DI+4],AH        // Tag zum String

      mov AH,'.'
      mov ES:[DI+5],AH        // . zum String

      mov AH,0
      mov AL,DH               // Monat in DH
      div BL
      add AL,30h
      mov ES:[DI+6], AL
      add AH,30h
      mov ES:[DI+7],AH        // Monat zum String

      mov AH,'.'
      mov ES:[DI+8],AH        // . zum String

      mov DX,0
      mov AX,CX               // Jahr in CX
      mov BX, 1000
      div BX                  // Jahr / 1000 erg: AX
      add AL,30h
      mov ES:[DI+9], AL
      mov AX,DX
      mov BL,100
      div BL                  // Jahr /  100
      add AL,30h
      mov ES:[DI+10], AL
      mov AL,AH
      mov AH,0
      mov BL,10
      div BL                  // Jahr /   10
      add AL,30h
      mov ES:[DI+11], AL
      add AH,30h
      mov ES:[DI+12],AH       // Jahr zum String

      mov AH,0
      mov ES:[DI+13],AH       // Nullterminierung
    }
}


// main()
// Dieses Testprogramm initialisiert die benutzte Schnittstelle,
// (RS232, I2C-Bus oder SPI-Bus) und nimmt lesend und schreibend
// Kontakt zu einem EA eDIP240-7 Touchdisplay im Grafik und im
// Touchmodus auf.
// Es werden zur Eingabe einige Touch-Taster benutzt.
void main(void)
{
 char datum[14]="";              // Buffer für Datumstring
 char zeit[9]="";                // Buffer für Zeitstring
 char c=0;                       // Zeichen vom Touch-Taster
 char sek=0, oldsek=1;           // gelesene Sekunde
 char dimm=20;                   // Hellzeit in Sekunden

  // Meldungen die zum Terminalbildschirm gesendet werden
 printf("\r\n [Start] .. EAeDIP240 Uhr");
 printf("\r\n ------------------------\r\n");
 setStdio(2);

 // EAeDIP240-Display bezüglich der verwendeten Schnittstelle
 // initialisieren (in dip240x.h)
 if(!dip240init()){
   printf("\r\n         .. Anzeige nicht erreicht"); goto ende;
 }

 // Sendebuffer des TouchDisplay durch lesen ohne nachfolgende
 // Verwertung leeren. Normalerweise sollte der Buffer leer sein.
 isTouch('T');                   // Sendebuffer d.Anzeige lesen
                                 // Lesetyp, hier 'T' ist egal.



 G240reset();
 F240tsmfont(2,2);               // Tast/Schalt.font u. Tastmenü
 F240frame(11);                  // normale Touchfeldumrandung
 F240defbut('T',120, 109, 180, 125, 'L' ,0, 'C', "Licht an");
 F240frame(12);                  // invertierte Touchfeld-Umrandung
 F240defbut('T',187, 109, 237, 125, ESC ,0, 'C', "Ende");

 while(1){
  c=isTouch('T');                // Sendebuf. der Anzeige abfragen
  switch(c){
    case 'L': dimm=20;
              G240dimm(255);     // Anzeige auf 100% Leuchtkraft
              break;
    case ESC: goto ende;         // Programmende 
  }
  if(sek==0){                    // jeden Minuteanfang 
     DOS_datum(datum);           // Datum holen
     G240txtfont(4);             // Text Zeichensatz 4 einstellen
     G240txtout(46, 15,'C',datum);   // Datum ausgeben
     G240txtfont(6);             // Text Zeichensatz 6 einstellen
   }
   if(sek!=oldsek){              // jede neue Sekunde
     G240txtout(164,5,'C', zeit);    // Zeit ausgeben
     oldsek=sek;
     if(dimm){dimm--;            // Hellzeit bis auf 0 vermindern
        if(!dimm) G240dimm(5);   // Anzeige auf 5% Leuchtkraft
     }
   }
  sek=DOS_zeit(zeit);            // DOS-Zeit lesen
  api_sleep(50);                 // 50ms warten  
 }

 // ---------------------------------------------------------------
 ende:
 F240clrbut(0,1);              // alle Touchber.unsichtbar löschen
 G240dimm(5);                  // Anzeige auf 5% Leuchtkraft
 dip240release();              // Schnittstelle abmelden
 printf("\r\n [Ende]  .. EAeDIP240 Uhr\r\n");
 setStdio(3);
}


 

 

 

www.GoBlack.de