Auf den letzten Metern

Dependencies:   mbed

Committer:
swali
Date:
Mon Nov 07 14:48:34 2022 +0000
Revision:
4:ab3f709c4d2e
Parent:
3:916c3a72cbd0
Child:
5:5c9b508670cf
All buttons are working now

Who changed what in which revision?

UserRevisionLine numberNew contents of line
prof_al 0:5ac32d240694 1 /***************************************************************************
prof_al 0:5ac32d240694 2 * Titel : main.c
prof_al 0:5ac32d240694 3 *
prof_al 0:5ac32d240694 4 * Description : Labormodul "DIBI"
prof_al 0:5ac32d240694 5 *
prof_al 0:5ac32d240694 6 * Revision List:
prof_al 0:5ac32d240694 7 --------------------------------------------------------------------------
prof_al 0:5ac32d240694 8 Date | Author | Change
prof_al 0:5ac32d240694 9 --------------------------------------------------------------------------
prof_al 0:5ac32d240694 10 24.10.22 | J. Altenburg | Ersterstellung
prof_al 0:5ac32d240694 11 --------------------------------------------------------------------------
prof_al 0:5ac32d240694 12 | |
prof_al 0:5ac32d240694 13 ----------------------------------------------------------------------------
prof_al 0:5ac32d240694 14 ****************************************************************************/
prof_al 0:5ac32d240694 15 #include "mbed.h"
prof_al 0:5ac32d240694 16 #include "cdef.h"
prof_al 0:5ac32d240694 17
prof_al 0:5ac32d240694 18 /* Vereinbarungen zu den Tasteneingängen */
prof_al 0:5ac32d240694 19 DigitalIn pinS1(A1);
prof_al 0:5ac32d240694 20 DigitalIn pinS2(A2);
prof_al 0:5ac32d240694 21 DigitalIn pinS3(A3);
prof_al 0:5ac32d240694 22
prof_al 0:5ac32d240694 23 BusOut bLedShield(D10, D11, D12, D13);
prof_al 0:5ac32d240694 24
prof_al 0:5ac32d240694 25 /* Anschlüsse der Schieberegister */
prof_al 0:5ac32d240694 26 DigitalOut pinSdo(PA_9);
prof_al 0:5ac32d240694 27 DigitalOut pinSck(PA_8);
prof_al 0:5ac32d240694 28 DigitalOut pinLoad(PB_5);
prof_al 0:5ac32d240694 29
prof_al 0:5ac32d240694 30 /* ISR */
prof_al 0:5ac32d240694 31 Ticker stTimer;
prof_al 0:5ac32d240694 32
prof_al 0:5ac32d240694 33 /***************************************************************************
prof_al 0:5ac32d240694 34 * Defines und Makros *
prof_al 0:5ac32d240694 35 ***************************************************************************/
prof_al 0:5ac32d240694 36 #define nTastShort 4 /* Taste 50 Millisekunden gedrückt */
prof_al 0:5ac32d240694 37 #define nTastLong 150 /* Taste 1.5 Sekunden gedrückt */
prof_al 0:5ac32d240694 38
prof_al 0:5ac32d240694 39 #define nSegA 0x01
prof_al 0:5ac32d240694 40 #define nSegB 0x02
prof_al 0:5ac32d240694 41 #define nSegC 0x04
prof_al 0:5ac32d240694 42 #define nSegD 0x08
prof_al 0:5ac32d240694 43 #define nSegE 0x10
prof_al 0:5ac32d240694 44 #define nSegF 0x20
prof_al 0:5ac32d240694 45 #define nSegG 0x40
prof_al 0:5ac32d240694 46 #define nSegH 0x80
prof_al 0:5ac32d240694 47
prof_al 0:5ac32d240694 48 #define nZiffer0 ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF)
prof_al 0:5ac32d240694 49 #define nZiffer1 ~(nSegB | nSegC)
prof_al 0:5ac32d240694 50 #define nZiffer2 ~(nSegA | nSegB | nSegD | nSegE | nSegG)
prof_al 0:5ac32d240694 51 #define nZiffer3 ~(nSegA | nSegB | nSegC | nSegD | nSegG)
prof_al 0:5ac32d240694 52 #define nZiffer4 ~(nSegB | nSegC | nSegF | nSegG)
prof_al 0:5ac32d240694 53 #define nZiffer5 ~(nSegA | nSegC | nSegD | nSegF | nSegG)
prof_al 0:5ac32d240694 54 #define nZiffer6 ~(nSegA | nSegC | nSegD | nSegE | nSegF | nSegG)
prof_al 0:5ac32d240694 55 #define nZiffer7 ~(nSegA | nSegB | nSegC)
prof_al 0:5ac32d240694 56 #define nZiffer8 ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG)
prof_al 0:5ac32d240694 57 #define nZiffer9 ~(nSegA | nSegB | nSegC | nSegD | nSegF | nSegG)
prof_al 0:5ac32d240694 58 #define nZifferA ~(nSegA | nSegB | nSegC | nSegE | nSegF | nSegG)
prof_al 0:5ac32d240694 59 #define nZifferB ~(nSegC | nSegD | nSegE | nSegF | nSegG)
prof_al 0:5ac32d240694 60 #define nZifferC ~(nSegA | nSegD | nSegE | nSegF)
prof_al 0:5ac32d240694 61 #define nZifferD ~(nSegB | nSegC | nSegD | nSegE | nSegG)
prof_al 0:5ac32d240694 62 #define nZifferE ~(nSegA | nSegD | nSegE | nSegF | nSegG)
prof_al 0:5ac32d240694 63 #define nZifferF ~(nSegA | nSegE | nSegF | nSegG)
prof_al 0:5ac32d240694 64 #define nZifferOff (nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG | nSegH)
prof_al 0:5ac32d240694 65
prof_al 0:5ac32d240694 66 byte bIdx; /*
prof_al 0:5ac32d240694 67 * Description : Index auf Ausgabe
prof_al 0:5ac32d240694 68 */
prof_al 0:5ac32d240694 69
prof_al 0:5ac32d240694 70 byte bDigit; /*
prof_al 0:5ac32d240694 71 * Description : aktives Digit
prof_al 0:5ac32d240694 72 */
prof_al 0:5ac32d240694 73
prof_al 0:5ac32d240694 74 byte bBargraph; /*
prof_al 0:5ac32d240694 75 * Description : Bargraph durchschalten
prof_al 0:5ac32d240694 76 */
prof_al 0:5ac32d240694 77
prof_al 0:5ac32d240694 78 byte bS1Timer; /*
prof_al 0:5ac32d240694 79 * Description : Timer für Taste S1
prof_al 0:5ac32d240694 80 */
prof_al 0:5ac32d240694 81
prof_al 0:5ac32d240694 82 byte bS2Timer; /*
prof_al 0:5ac32d240694 83 * Description : Timer für Taste S2
prof_al 0:5ac32d240694 84 */
prof_al 0:5ac32d240694 85
prof_al 0:5ac32d240694 86 byte bS3Timer; /*
prof_al 0:5ac32d240694 87 * Description : Timer für Taste S3
prof_al 0:5ac32d240694 88 */
prof_al 0:5ac32d240694 89
prof_al 0:5ac32d240694 90 word wSerial; /*
prof_al 0:5ac32d240694 91 * Description : serielles Ausgaberegister
prof_al 0:5ac32d240694 92 */
prof_al 0:5ac32d240694 93
prof_al 0:5ac32d240694 94 /* Bitmuster */
prof_al 0:5ac32d240694 95 const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
prof_al 0:5ac32d240694 96 const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
prof_al 0:5ac32d240694 97
prof_al 0:5ac32d240694 98
prof_al 0:5ac32d240694 99 /* Tastenabfrage */
prof_al 0:5ac32d240694 100 void vTasteS1( void ){
prof_al 0:5ac32d240694 101 if(pinS1 == 0){ /* User-Taste gedrückt */
prof_al 0:5ac32d240694 102 if(bS1Timer < nTastLong+1){ /* Abfrage max. bis Taste lange gedrückt */
prof_al 0:5ac32d240694 103 if(bS1Timer == nTastShort){ /* Taste "kurz gedrückt" erkannt */
prof_al 0:5ac32d240694 104 //...
prof_al 0:5ac32d240694 105 }
prof_al 0:5ac32d240694 106 if(bS1Timer == nTastLong){ /* Taste "lange gedrückt" erkannt */
swali 4:ab3f709c4d2e 107 if(bIdx > 0) bIdx--;
swali 4:ab3f709c4d2e 108 else bIdx = 16;
prof_al 0:5ac32d240694 109 }
prof_al 0:5ac32d240694 110 bS1Timer++;
prof_al 0:5ac32d240694 111 }
prof_al 0:5ac32d240694 112 }
prof_al 0:5ac32d240694 113 else{ /* Taste nicht gedrückt */
prof_al 0:5ac32d240694 114 if((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)){ /* Taste wurde bereits erkannt */
swali 4:ab3f709c4d2e 115 if(bIdx < 16) bIdx++;
swali 4:ab3f709c4d2e 116 else bIdx = 0;
prof_al 0:5ac32d240694 117 }
prof_al 0:5ac32d240694 118 bS1Timer = 0;
prof_al 0:5ac32d240694 119 }
prof_al 0:5ac32d240694 120 }
prof_al 0:5ac32d240694 121
prof_al 0:5ac32d240694 122 void vTasteS2( void ){
alexander0707 1:d400ca81c517 123 if(pinS2 == 0){ /* User-Taste gedrückt */
alexander0707 1:d400ca81c517 124 if(bS2Timer < nTastLong+1){ /* Abfrage max. bis Taste lange gedrückt */
alexander0707 1:d400ca81c517 125 if(bS2Timer == nTastShort){ /* Taste "kurz gedrückt" erkannt */
alexander0707 1:d400ca81c517 126 //...
alexander0707 1:d400ca81c517 127 }
alexander0707 1:d400ca81c517 128 if(bS2Timer == nTastLong){ /* Taste "lange gedrückt" erkannt */
swali 4:ab3f709c4d2e 129 if(bDigit > 0b00000001) bDigit = bDigit>>1;
alexander0707 2:063b68bbc135 130 else bDigit = 0b00001000;
alexander0707 1:d400ca81c517 131 }
alexander0707 1:d400ca81c517 132 bS2Timer++;
alexander0707 1:d400ca81c517 133 }
alexander0707 1:d400ca81c517 134 }
alexander0707 1:d400ca81c517 135 else{ /* Taste nicht gedrückt */
alexander0707 1:d400ca81c517 136 if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){ /* Taste wurde bereits erkannt */
swali 4:ab3f709c4d2e 137 if(bDigit < 0b00001000) bDigit = bDigit<<1;
alexander0707 2:063b68bbc135 138 else bDigit = 0b00000001;
alexander0707 1:d400ca81c517 139 }
alexander0707 1:d400ca81c517 140 bS2Timer = 0;
alexander0707 1:d400ca81c517 141 }
prof_al 0:5ac32d240694 142 }
prof_al 0:5ac32d240694 143
prof_al 0:5ac32d240694 144 void vTasteS3( void ){
alexander0707 1:d400ca81c517 145 if(pinS3 == 0){ /* User-Taste gedrückt */
alexander0707 1:d400ca81c517 146 if(bS3Timer < nTastLong+1){ /* Abfrage max. bis Taste lange gedrückt */
alexander0707 1:d400ca81c517 147 if(bS3Timer == nTastShort){ /* Taste "kurz gedrückt" erkannt */
alexander0707 1:d400ca81c517 148 //...
alexander0707 1:d400ca81c517 149 }
alexander0707 1:d400ca81c517 150 if(bS3Timer == nTastLong){ /* Taste "lange gedrückt" erkannt */
alexander0707 1:d400ca81c517 151 bBargraph--;
alexander0707 1:d400ca81c517 152 }
alexander0707 1:d400ca81c517 153 bS3Timer++;
alexander0707 1:d400ca81c517 154 }
alexander0707 1:d400ca81c517 155 }
alexander0707 1:d400ca81c517 156 else{ /* Taste nicht gedrückt */
alexander0707 1:d400ca81c517 157 if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){ /* Taste wurde bereits erkannt */
alexander0707 1:d400ca81c517 158 bBargraph++;
alexander0707 1:d400ca81c517 159 }
alexander0707 1:d400ca81c517 160 bS3Timer = 0;
alexander0707 1:d400ca81c517 161 }
prof_al 0:5ac32d240694 162 }
prof_al 0:5ac32d240694 163
prof_al 0:5ac32d240694 164
prof_al 0:5ac32d240694 165
prof_al 0:5ac32d240694 166 void vCheckTasten( void ){
prof_al 0:5ac32d240694 167 vTasteS1();
prof_al 0:5ac32d240694 168 vTasteS2();
prof_al 0:5ac32d240694 169 vTasteS3();
prof_al 0:5ac32d240694 170 }
prof_al 0:5ac32d240694 171
prof_al 0:5ac32d240694 172 /* Ausschieben der 16 Bits für die Anzeige */
prof_al 0:5ac32d240694 173 void vShiftLoad(word wLoad){
prof_al 0:5ac32d240694 174 word wMask = Bit15;
prof_al 0:5ac32d240694 175 pinLoad = 0;
prof_al 0:5ac32d240694 176 while(wMask){
prof_al 0:5ac32d240694 177 if(wMask & wLoad) pinSdo = 1;
prof_al 0:5ac32d240694 178 else pinSdo = 0;
prof_al 0:5ac32d240694 179 pinSck = 1;
prof_al 0:5ac32d240694 180 wMask >>= 1;
prof_al 0:5ac32d240694 181 pinSck = 0;
prof_al 0:5ac32d240694 182 }
prof_al 0:5ac32d240694 183 pinLoad = 1;
prof_al 0:5ac32d240694 184 }
prof_al 0:5ac32d240694 185
prof_al 0:5ac32d240694 186 /***************************************************************************
prof_al 0:5ac32d240694 187 * main()
prof_al 0:5ac32d240694 188 ***************************************************************************/
prof_al 0:5ac32d240694 189 int main() {
prof_al 0:5ac32d240694 190 /* Variablen initialisieren */
prof_al 0:5ac32d240694 191 bIdx = 0;
alexander0707 1:d400ca81c517 192 bDigit = 0b00000001;
prof_al 0:5ac32d240694 193 bLedShield = 0x00;
prof_al 0:5ac32d240694 194 while(1){
prof_al 0:5ac32d240694 195 vCheckTasten();
alexander0707 3:916c3a72cbd0 196 wSerial = abZiffer[bIdx]<<8 | bDigit ; /* 7-Segmentziffer bestimmen */
alexander0707 1:d400ca81c517 197 vShiftLoad(wSerial); /* Segmente verschieben und Digit festlegen */
alexander0707 1:d400ca81c517 198 bLedShield = abBargraph[bBargraph & 0x03]; /* Bargraph bestimmen */
prof_al 0:5ac32d240694 199 wait_us(10000);
prof_al 0:5ac32d240694 200 }
prof_al 0:5ac32d240694 201 }