TH Bingen HAPO Labor 1, Prof. Altenburg, WS2022

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /***************************************************************************
00002 * Titel        : main.c
00003 *
00004 * Description  : Labormodul "DIBI"
00005 *
00006 * Revision List:
00007   --------------------------------------------------------------------------
00008   Date     | Author          | Change
00009   --------------------------------------------------------------------------
00010   24.10.22 | J. Altenburg    | Ersterstellung
00011   --------------------------------------------------------------------------
00012            |                 |
00013   ----------------------------------------------------------------------------
00014 ****************************************************************************/
00015 #include "mbed.h"
00016 #include "cdef.h"
00017 
00018 /* Vereinbarungen zu den Tasteneingängen */
00019 DigitalIn   pinS1(A1);
00020 DigitalIn   pinS2(A2);
00021 DigitalIn   pinS3(A3);
00022 
00023 BusOut      bLedShield(D10, D11, D12, D13);
00024 
00025 /* Anschlüsse der Schieberegister */
00026 DigitalOut  pinSdo(PA_9);
00027 DigitalOut  pinSck(PA_8);
00028 DigitalOut  pinLoad(PB_5);
00029 
00030 /* ISR */
00031 Ticker      stTimer;
00032 
00033 /***************************************************************************
00034 *   Defines und Makros                                                       *
00035 ***************************************************************************/
00036 #define nTastShort    4     /* Taste 50 Millisekunden gedrückt */    
00037 #define nTastLong   150     /* Taste 1.5 Sekunden gedrückt */ 
00038 
00039 #define nSegA           0x01
00040 #define nSegB           0x02
00041 #define nSegC           0x04
00042 #define nSegD           0x08
00043 #define nSegE           0x10
00044 #define nSegF           0x20
00045 #define nSegG           0x40
00046 #define nSegH           0x80
00047 
00048 #define nZiffer0    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF)
00049 #define nZiffer1    ~(nSegB | nSegC)
00050 #define nZiffer2    ~(nSegA | nSegB | nSegD | nSegE | nSegG)
00051 #define nZiffer3    ~(nSegA | nSegB | nSegC | nSegD | nSegG)
00052 #define nZiffer4    ~(nSegB | nSegC | nSegF | nSegG)
00053 #define nZiffer5    ~(nSegA | nSegC | nSegD | nSegF | nSegG)
00054 #define nZiffer6    ~(nSegA | nSegC | nSegD | nSegE | nSegF | nSegG)
00055 #define nZiffer7    ~(nSegA | nSegB | nSegC)
00056 #define nZiffer8    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG)
00057 #define nZiffer9    ~(nSegA | nSegB | nSegC | nSegD | nSegF | nSegG)
00058 #define nZifferA    ~(nSegA | nSegB | nSegC | nSegE | nSegF | nSegG)
00059 #define nZifferB    ~(nSegC | nSegD | nSegE | nSegF | nSegG)
00060 #define nZifferC    ~(nSegA | nSegD | nSegE | nSegF)
00061 #define nZifferD    ~(nSegB | nSegC | nSegD | nSegE | nSegG)
00062 #define nZifferE    ~(nSegA | nSegD | nSegE | nSegF | nSegG)
00063 #define nZifferF    ~(nSegA | nSegE | nSegF | nSegG)
00064 #define nZifferOff   (nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG | nSegH)
00065 
00066 byte bIdx; /*
00067 * Description : Index auf Ausgabe
00068 */
00069 
00070 byte bDigit; /*
00071 * Description : aktives Digit
00072 */
00073 
00074 byte bBargraph; /*
00075 * Description : Bargraph durchschalten
00076 */
00077 
00078 byte bS1Timer; /*
00079 * Description : Timer für Taste S1
00080 */
00081 
00082 byte bS2Timer; /*
00083 * Description : Timer für Taste S2
00084 */
00085 
00086 byte bS3Timer; /*
00087 * Description : Timer für Taste S3
00088 */
00089 
00090 word wSerial; /*
00091 * Description : serielles Ausgaberegister
00092 */
00093 
00094 /* Bitmuster */
00095 const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
00096 const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
00097 
00098 
00099 /* Tastenabfrage */
00100 void vTasteS1( void ){
00101     if(pinS1 == 0){                             /* User-Taste gedrückt */
00102         if(bS1Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
00103             if(bS1Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
00104                 //...
00105                 }
00106             if(bS1Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
00107                 if(bIdx <= 0x0f || bIdx > 0x01) bIdx--;
00108                 else bIdx = 0x0f;
00109                 }
00110             bS1Timer++;
00111             }
00112         }
00113     else{                                       /* Taste nicht gedrückt */ 
00114         if((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
00115             if(bIdx < 0x0f || bIdx >= 0x01) bIdx++;
00116             else bIdx = 0x01;
00117             }
00118         bS1Timer = 0;
00119         }
00120     } 
00121 
00122 void vTasteS2( void ){
00123     if(pinS2 == 0){                             /* User-Taste gedrückt */
00124         if(bS2Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
00125             if(bS2Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
00126                 //...
00127                 }
00128             if(bS2Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
00129                 if(bDigit <= 0x08 || bDigit > 0x01) bDigit>>1;
00130                 else bDigit = 0b00001000;
00131                 }
00132             bS2Timer++;
00133             }
00134         }
00135     else{                                       /* Taste nicht gedrückt */ 
00136         if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
00137             if(bDigit < 0x08 || bDigit >= 0x01) bDigit<<1;
00138             else bDigit = 0b00000001;
00139             }
00140         bS2Timer = 0;
00141         }
00142     } 
00143 
00144 void vTasteS3( void ){
00145     if(pinS3 == 0){                             /* User-Taste gedrückt */
00146         if(bS3Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
00147             if(bS3Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
00148                 //...
00149                 }
00150             if(bS3Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
00151                 bBargraph--;
00152                 }
00153             bS3Timer++;
00154             }
00155         }
00156     else{                                       /* Taste nicht gedrückt */ 
00157         if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
00158             bBargraph++;
00159             }
00160         bS3Timer = 0;
00161         }
00162     } 
00163 
00164 
00165 
00166 void vCheckTasten( void ){
00167     vTasteS1();
00168     vTasteS2();
00169     vTasteS3();
00170     }
00171 
00172 /* Ausschieben der 16 Bits für die Anzeige */
00173 void vShiftLoad(word wLoad){
00174     word wMask = Bit15;
00175     pinLoad = 0;
00176     while(wMask){
00177         if(wMask & wLoad) pinSdo = 1;
00178         else              pinSdo = 0;
00179         pinSck = 1;
00180         wMask >>= 1;
00181         pinSck = 0;
00182         }    
00183     pinLoad = 1;
00184     }
00185 
00186 /***************************************************************************
00187 *   main()
00188 ***************************************************************************/
00189 int main() {
00190     /* Variablen initialisieren */    
00191     bIdx = 0;
00192     bDigit = 0b00000001;
00193     bLedShield = 0x00;
00194     while(1){
00195         vCheckTasten();
00196         wSerial = abZiffer[bIdx]<<8 | bDigit ;            /* 7-Segmentziffer bestimmen */
00197         vShiftLoad(wSerial);          /* Segmente verschieben und Digit festlegen */
00198         bLedShield = abBargraph[bBargraph & 0x03];          /* Bargraph bestimmen */
00199         wait_us(10000);
00200         }
00201     }