Einführung HAPO WS2020 TH Bingen, Prof. Jens Altenburg, LV2

Dependencies:   mbed

main.cpp

Committer:
prof_al
Date:
2020-11-18
Revision:
0:d56a66901ae9

File content as of revision 0:d56a66901ae9:

/***************************************************************************
* Titel        : main.c
*
* Description  : Labormodul "DIBI"
*
* Revision List:
  --------------------------------------------------------------------------
  Date     | Author          | Change
  --------------------------------------------------------------------------
  16.11.15 | J. Altenburg    | Ersterstellung
  --------------------------------------------------------------------------
           |                 |
  ----------------------------------------------------------------------------
****************************************************************************/
#include "mbed.h"
#include "cdef.h"

/* Vereinbarungen zu den Tasteneingängen */
DigitalIn   pinS1(A1);
DigitalIn   pinS2(A2);
DigitalIn   pinS3(A3);

//BusOut      bLedShield(D13, D12, D11, D10);
BusOut      bLedShield(D10, D11, D12, D13);

/* Anschlüsse der Schieberegister */
DigitalOut  pinSdo(PA_9);
DigitalOut  pinSck(PA_8);
DigitalOut  pinLoad(PB_5);

/* ISR */
Ticker      stTimer;

/***************************************************************************
*   Defines und Makros                                                       *
***************************************************************************/
//#define nTEMP               /* Compilerschalter */ 


#define nTastShort    4     /* Taste 50 Millisekunden gedrückt */    
#define nTastLong   150     /* Taste 1.5 Sekunden gedrückt */ 

#define n300ms          3

#define nDsp100ms       1
#define nDsp500ms       5
#define nDsp1Sek        10
#define nDsp2Sek        20          

#define nOn             0
#define nOff            1

#define nSegA           0x01
#define nSegB           0x02
#define nSegC           0x04
#define nSegD           0x08
#define nSegE           0x10
#define nSegF           0x20
#define nSegG           0x40
#define nSegH           0x80


#define nZiffer0    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF)
#define nZiffer1    
#define nZiffer2    
#define nZiffer3    
#define nZiffer4    
#define nZiffer5    
#define nZiffer6    
#define nZiffer7    
#define nZiffer8    
#define nZiffer9    
#define nZifferA    
#define nZifferB    
#define nZifferC    
#define nZifferD    
#define nZifferE    
#define nZifferF    
#define nZifferOff   

enum{ 
     enDoNothing = 0
    ,enDisplay
    };



byte bIdx; /*
* Description : Index auf Ausgabe
*/

int8 iDir; /*
* Description : Zählrichtung
*/

byte bBlinkTime; /*
* Description : 
*/

byte bS1Timer; /*
* Description : Timer für Taste S1
*/

byte bS2Timer; /*
* Description : Timer für Taste S2
*/

byte bS3Timer; /*
* Description : Timer für Taste S3
*/

byte bDisplayState; /*
* Description : Zustandsautomat Blinker
*/

word wSerial; /*
* Description : serielles Ausgaberegister
*/

byte bDspTime; /*
* Description : Displaytimer
*/

byte bDspTimeValue; /*
* Description : Zählzeitvorgabe
*/

byte bBargraph; /*
* Description : Bargraph anzeigen 
*/

byte bBarBlink; /*
* Description : Bargraphblinker
*/

/* Bitmuster */
const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
const byte abDspTime[] = {nDsp100ms, nDsp500ms, nDsp1Sek, nDsp2Sek};


/* Tastenabfrage */
void vTasteS1( void ){
    if(pinS1 == 0){                             /* User-Taste gedrückt */
        if(bS1Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
            if(bS1Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
#if 1
//...
#endif
                }
            if(bS1Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
                //bBlinkState = enBlinkLong;
                }
            bS1Timer++;
            }
        }
    else{                                       /* Taste nicht gedrückt */ 
        if(bS1Timer >= nTastShort){             /* Taste wurde bereits erkannt */
#if 0

#endif
            }
        bS1Timer = 0;
        }
    } 

void vTasteS2( void ){
    if(pinS2 == 0){                             /* User-Taste gedrückt */
        if(bS2Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
            if(bS2Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
#if 1
//...
#endif
                }
            if(bS2Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
                }
            bS2Timer++;
            }
        }
    else{                                       /* Taste nicht gedrückt */ 
        if(bS2Timer >= nTastShort){             /* Taste wurde bereits erkannt */
            }
        bS2Timer = 0;
        }
    } 

void vTasteS3( void ){
    if(pinS3 == 0){                             /* User-Taste gedrückt */
        if(bS3Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
            if(bS3Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
#if 1
//...
#endif
                }
            if(bS3Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
                }
            bS3Timer++;
            }
        }
    else{                                       /* Taste nicht gedrückt */ 
        if(bS3Timer >= nTastShort){             /* Taste wurde bereits erkannt */
            }
        bS3Timer = 0;
        }
    } 



void vCheckTasten( void ){
    vTasteS1();
    vTasteS2();
    vTasteS3();
    }

void vDisplayLed( void ){
    switch(bDisplayState){
        case enDoNothing:                           /* Bargraph blinken lassen */
            bBarBlink++;
//...
            break;
        case enDisplay:                             /* Zählwerte für Anzeige ermitteln */
//...
            break;
        }
    wSerial = abZiffer[bIdx&0x0f];
    }

/* Ausschieben der Bits für die Anzeige */
void vShiftLoad(word wLoad){
    word wMask = Bit15;
    pinLoad = 0;
    while(wMask){
        if(wMask & wLoad) pinSdo = 1;
        else              pinSdo = 0;
        pinSck = 1;
        wMask >>= 1;
        pinSck = 0;
        }    
    pinLoad = 1;
    }


/* Ausgabe der Daten an das 7-Segment-Display im Abstand von 2.5 ms */ 
void vSegmentDisplay( void ){
    vShiftLoad(((wSerial << 8) & 0xfff0)| (1 << 3));
    }

/***************************************************************************
*   main()
***************************************************************************/
int main() {
    /* Variablen initialisieren */    
    byte i = 0;
    bIdx = 0;
    bDspTime = 0;
    bDisplayState = enDoNothing;
    stTimer.attach_us(&vSegmentDisplay, 2500);
    bBargraph = 0;
    bBarBlink = 0;
    bDspTimeValue = nDsp100ms;
    iDir = 1;
    /* Lampentest */
    bLedShield = 0x00;
    wait(1);
    bLedShield = 0x0f;
    /* Endless loop */
    while(1) {
        vCheckTasten();
        i++;
        if(i == 10){
            vDisplayLed();
            i = 0;
            }
        wait_us(10000);
        }
    }