TH Bingen HAPO Labor 1, Prof. Altenburg, WS2022
Dependencies: mbed
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 bIdx--; 00108 } 00109 bS1Timer++; 00110 } 00111 } 00112 else{ /* Taste nicht gedrückt */ 00113 if((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)){ /* Taste wurde bereits erkannt */ 00114 bIdx++; 00115 } 00116 bS1Timer = 0; 00117 } 00118 } 00119 00120 void vTasteS2( void ){ 00121 if(pinS2 == 0){ /* User-Taste gedrückt */ 00122 if(bS2Timer < nTastLong+1){ /* Abfrage max. bis Taste lange gedrückt */ 00123 if(bS2Timer == nTastShort){ /* Taste "kurz gedrückt" erkannt */ 00124 //... 00125 } 00126 if(bS2Timer == nTastLong){ /* Taste "lange gedrückt" erkannt */ 00127 bDigit--; 00128 } 00129 bS2Timer++; 00130 } 00131 } 00132 else{ /* Taste nicht gedrückt */ 00133 if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){ /* Taste wurde bereits erkannt */ 00134 bDigit++; 00135 } 00136 bS2Timer = 0; 00137 } 00138 } 00139 00140 void vTasteS3( void ){ 00141 if(pinS3 == 0){ /* User-Taste gedrückt */ 00142 if(bS3Timer < nTastLong+1){ /* Abfrage max. bis Taste lange gedrückt */ 00143 if(bS3Timer == nTastShort){ /* Taste "kurz gedrückt" erkannt */ 00144 //... 00145 } 00146 if(bS3Timer == nTastLong){ /* Taste "lange gedrückt" erkannt */ 00147 bBargraph--; 00148 } 00149 bS3Timer++; 00150 } 00151 } 00152 else{ /* Taste nicht gedrückt */ 00153 if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){ /* Taste wurde bereits erkannt */ 00154 bBargraph++; 00155 } 00156 bS3Timer = 0; 00157 } 00158 } 00159 00160 00161 00162 void vCheckTasten( void ){ 00163 vTasteS1(); 00164 vTasteS2(); 00165 vTasteS3(); 00166 } 00167 00168 /* Ausschieben der 16 Bits für die Anzeige */ 00169 void vShiftLoad(word wLoad){ 00170 word wMask = Bit15; 00171 pinLoad = 0; 00172 while(wMask){ 00173 if(wMask & wLoad) pinSdo = 1; 00174 else pinSdo = 0; 00175 pinSck = 1; 00176 wMask >>= 1; 00177 pinSck = 0; 00178 } 00179 pinLoad = 1; 00180 } 00181 00182 /*************************************************************************** 00183 * main() 00184 ***************************************************************************/ 00185 int main() { 00186 /* Variablen initialisieren */ 00187 bIdx = 0; 00188 bDigit = 0b00000001; 00189 bLedShield = 0x00; 00190 while(1){ 00191 vCheckTasten(); 00192 wSerial = abZiffer[bIdx & 0x0f]<<8 | bDigit ; /* 7-Segmentziffer bestimmen */ 00193 vShiftLoad(wSerial); /* Segmente verschieben und Digit festlegen */ 00194 bLedShield = abBargraph[bBargraph & 0x03]; /* Bargraph bestimmen */ 00195 wait_us(10000); 00196 } 00197 }
Generated on Thu Nov 3 2022 09:18:21 by
1.7.2