Enhanted timer
enhanced_timer.cpp@0:7eacf3f1a1be, 2020-11-24 (annotated)
- Committer:
- kwstasfane1
- Date:
- Tue Nov 24 15:25:42 2020 +0000
- Revision:
- 0:7eacf3f1a1be
Solution for workshop 3(interrupt). Enhanced timer is implemented that shows up to 9 lap times that reset with the push of reset button. Also, the stopwatch is reset/started again by pressing the reset button. Lap times are not scrolled;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kwstasfane1 | 0:7eacf3f1a1be | 1 | #include "mbed.h" |
kwstasfane1 | 0:7eacf3f1a1be | 2 | #include "C12832.h" |
kwstasfane1 | 0:7eacf3f1a1be | 3 | |
kwstasfane1 | 0:7eacf3f1a1be | 4 | // LCD display |
kwstasfane1 | 0:7eacf3f1a1be | 5 | C12832 lcd(p5, p7, p6, p8, p11); |
kwstasfane1 | 0:7eacf3f1a1be | 6 | |
kwstasfane1 | 0:7eacf3f1a1be | 7 | //Joystick |
kwstasfane1 | 0:7eacf3f1a1be | 8 | //DigitalIn joyU(p13); // joystick 'DOWN' resets the stopwatch |
kwstasfane1 | 0:7eacf3f1a1be | 9 | //DigitalIn joyC(p14); // joystick 'PUSH' starts and stops it |
kwstasfane1 | 0:7eacf3f1a1be | 10 | |
kwstasfane1 | 0:7eacf3f1a1be | 11 | |
kwstasfane1 | 0:7eacf3f1a1be | 12 | InterruptIn joyD(p12); // joystick 'DOWN' resets the stopwatch |
kwstasfane1 | 0:7eacf3f1a1be | 13 | InterruptIn joyC(p14); // joystick 'PUSH' starts and stops it |
kwstasfane1 | 0:7eacf3f1a1be | 14 | InterruptIn joyU(p13); // joystick 'UP' toggle the display |
kwstasfane1 | 0:7eacf3f1a1be | 15 | |
kwstasfane1 | 0:7eacf3f1a1be | 16 | void joyC_isr(); |
kwstasfane1 | 0:7eacf3f1a1be | 17 | void joyD_isr(); |
kwstasfane1 | 0:7eacf3f1a1be | 18 | void joyU_isr(); |
kwstasfane1 | 0:7eacf3f1a1be | 19 | bool joyUflag = 0; |
kwstasfane1 | 0:7eacf3f1a1be | 20 | bool joyCflag = 0; |
kwstasfane1 | 0:7eacf3f1a1be | 21 | bool joyDflag = 0; |
kwstasfane1 | 0:7eacf3f1a1be | 22 | |
kwstasfane1 | 0:7eacf3f1a1be | 23 | float saved_lap_times [8] = {0.0}; |
kwstasfane1 | 0:7eacf3f1a1be | 24 | int i= 0; |
kwstasfane1 | 0:7eacf3f1a1be | 25 | |
kwstasfane1 | 0:7eacf3f1a1be | 26 | int main() |
kwstasfane1 | 0:7eacf3f1a1be | 27 | { |
kwstasfane1 | 0:7eacf3f1a1be | 28 | float t = 0.0; // the timer a floating point counter |
kwstasfane1 | 0:7eacf3f1a1be | 29 | bool run = 1; // the state of the stopwatch run stopped |
kwstasfane1 | 0:7eacf3f1a1be | 30 | |
kwstasfane1 | 0:7eacf3f1a1be | 31 | //At startup just print a few things on the lcd and then enter a loop until the user does something |
kwstasfane1 | 0:7eacf3f1a1be | 32 | lcd.cls(); //clear screen |
kwstasfane1 | 0:7eacf3f1a1be | 33 | lcd.locate(1,20); |
kwstasfane1 | 0:7eacf3f1a1be | 34 | lcd.printf("ready push joystick to start");//ready to go |
kwstasfane1 | 0:7eacf3f1a1be | 35 | lcd.locate(10,10); |
kwstasfane1 | 0:7eacf3f1a1be | 36 | lcd.printf("Stopwatch time %4.1f",t);//display time on the stopwatch |
kwstasfane1 | 0:7eacf3f1a1be | 37 | |
kwstasfane1 | 0:7eacf3f1a1be | 38 | joyC.rise(&joyC_isr); |
kwstasfane1 | 0:7eacf3f1a1be | 39 | joyD.rise(&joyD_isr); |
kwstasfane1 | 0:7eacf3f1a1be | 40 | joyU.rise(&joyU_isr); |
kwstasfane1 | 0:7eacf3f1a1be | 41 | |
kwstasfane1 | 0:7eacf3f1a1be | 42 | while(1) |
kwstasfane1 | 0:7eacf3f1a1be | 43 | { |
kwstasfane1 | 0:7eacf3f1a1be | 44 | //reset timer if the joystick is pressed 'DOWN' |
kwstasfane1 | 0:7eacf3f1a1be | 45 | |
kwstasfane1 | 0:7eacf3f1a1be | 46 | if (joyDflag) |
kwstasfane1 | 0:7eacf3f1a1be | 47 | { |
kwstasfane1 | 0:7eacf3f1a1be | 48 | t = 0; // clear the timer |
kwstasfane1 | 0:7eacf3f1a1be | 49 | run = !run; // and stop further operation |
kwstasfane1 | 0:7eacf3f1a1be | 50 | lcd.cls(); //clear screen |
kwstasfane1 | 0:7eacf3f1a1be | 51 | lcd.locate(40,20); |
kwstasfane1 | 0:7eacf3f1a1be | 52 | lcd.printf("reset");//tell the user |
kwstasfane1 | 0:7eacf3f1a1be | 53 | lcd.locate(10,10); |
kwstasfane1 | 0:7eacf3f1a1be | 54 | lcd.printf("Stopwatch time %4.1f",t);//display time on the stopwatch |
kwstasfane1 | 0:7eacf3f1a1be | 55 | for(int j=0; j<=8; j++) |
kwstasfane1 | 0:7eacf3f1a1be | 56 | { |
kwstasfane1 | 0:7eacf3f1a1be | 57 | saved_lap_times[j] = 0.0; |
kwstasfane1 | 0:7eacf3f1a1be | 58 | } |
kwstasfane1 | 0:7eacf3f1a1be | 59 | i=0; |
kwstasfane1 | 0:7eacf3f1a1be | 60 | } |
kwstasfane1 | 0:7eacf3f1a1be | 61 | |
kwstasfane1 | 0:7eacf3f1a1be | 62 | /*this is the bit that decides if the stopwatch is running |
kwstasfane1 | 0:7eacf3f1a1be | 63 | i.e. run == 1, if so then increment the timer and print its value |
kwstasfane1 | 0:7eacf3f1a1be | 64 | otherwise just wait*/ |
kwstasfane1 | 0:7eacf3f1a1be | 65 | |
kwstasfane1 | 0:7eacf3f1a1be | 66 | //if (joyCflag) |
kwstasfane1 | 0:7eacf3f1a1be | 67 | if(run == 1) |
kwstasfane1 | 0:7eacf3f1a1be | 68 | { |
kwstasfane1 | 0:7eacf3f1a1be | 69 | t =t + 0.1; |
kwstasfane1 | 0:7eacf3f1a1be | 70 | |
kwstasfane1 | 0:7eacf3f1a1be | 71 | if(!joyUflag) |
kwstasfane1 | 0:7eacf3f1a1be | 72 | { |
kwstasfane1 | 0:7eacf3f1a1be | 73 | wait(0.1); |
kwstasfane1 | 0:7eacf3f1a1be | 74 | lcd.cls(); //clear screen |
kwstasfane1 | 0:7eacf3f1a1be | 75 | lcd.locate(10,10); |
kwstasfane1 | 0:7eacf3f1a1be | 76 | lcd.printf("Stopwatch time %4.1f",t);//display time |
kwstasfane1 | 0:7eacf3f1a1be | 77 | } |
kwstasfane1 | 0:7eacf3f1a1be | 78 | else |
kwstasfane1 | 0:7eacf3f1a1be | 79 | { |
kwstasfane1 | 0:7eacf3f1a1be | 80 | wait(0.01); |
kwstasfane1 | 0:7eacf3f1a1be | 81 | lcd.cls(); //clear screen |
kwstasfane1 | 0:7eacf3f1a1be | 82 | lcd.locate(1,1); |
kwstasfane1 | 0:7eacf3f1a1be | 83 | lcd.printf("L1:");//display time |
kwstasfane1 | 0:7eacf3f1a1be | 84 | lcd.locate(13,1); |
kwstasfane1 | 0:7eacf3f1a1be | 85 | lcd.printf("%3.1f",saved_lap_times [0]); |
kwstasfane1 | 0:7eacf3f1a1be | 86 | lcd.locate(42,1); |
kwstasfane1 | 0:7eacf3f1a1be | 87 | lcd.printf("L2:");//display |
kwstasfane1 | 0:7eacf3f1a1be | 88 | lcd.locate(54,1); |
kwstasfane1 | 0:7eacf3f1a1be | 89 | lcd.printf("%3.1f",saved_lap_times [1]); |
kwstasfane1 | 0:7eacf3f1a1be | 90 | lcd.locate(82,1); |
kwstasfane1 | 0:7eacf3f1a1be | 91 | lcd.printf("L3:");//display time |
kwstasfane1 | 0:7eacf3f1a1be | 92 | lcd.locate(95,1); |
kwstasfane1 | 0:7eacf3f1a1be | 93 | lcd.printf("%3.1f",saved_lap_times [2]); |
kwstasfane1 | 0:7eacf3f1a1be | 94 | lcd.locate(1,11); |
kwstasfane1 | 0:7eacf3f1a1be | 95 | lcd.printf("L4:");//display time |
kwstasfane1 | 0:7eacf3f1a1be | 96 | lcd.locate(13,11); |
kwstasfane1 | 0:7eacf3f1a1be | 97 | lcd.printf("%3.1f",saved_lap_times [3]); |
kwstasfane1 | 0:7eacf3f1a1be | 98 | lcd.locate(42,11); |
kwstasfane1 | 0:7eacf3f1a1be | 99 | lcd.printf("L5:");//display |
kwstasfane1 | 0:7eacf3f1a1be | 100 | lcd.locate(54,11); |
kwstasfane1 | 0:7eacf3f1a1be | 101 | lcd.printf("%3.1f",saved_lap_times [4]); |
kwstasfane1 | 0:7eacf3f1a1be | 102 | lcd.locate(82,11); |
kwstasfane1 | 0:7eacf3f1a1be | 103 | lcd.printf("L6:");//display time |
kwstasfane1 | 0:7eacf3f1a1be | 104 | lcd.locate(95,11); |
kwstasfane1 | 0:7eacf3f1a1be | 105 | lcd.printf("%3.1f",saved_lap_times [5]); |
kwstasfane1 | 0:7eacf3f1a1be | 106 | lcd.locate(1,22); |
kwstasfane1 | 0:7eacf3f1a1be | 107 | lcd.printf("L7:");//display time |
kwstasfane1 | 0:7eacf3f1a1be | 108 | lcd.locate(13,22); |
kwstasfane1 | 0:7eacf3f1a1be | 109 | lcd.printf("%3.1f",saved_lap_times [6]); |
kwstasfane1 | 0:7eacf3f1a1be | 110 | lcd.locate(42,22); |
kwstasfane1 | 0:7eacf3f1a1be | 111 | lcd.printf("L8:");//display |
kwstasfane1 | 0:7eacf3f1a1be | 112 | lcd.locate(54,22); |
kwstasfane1 | 0:7eacf3f1a1be | 113 | lcd.printf("%3.1f",saved_lap_times [7]); |
kwstasfane1 | 0:7eacf3f1a1be | 114 | lcd.locate(82,22); |
kwstasfane1 | 0:7eacf3f1a1be | 115 | lcd.printf("L9:");//display time |
kwstasfane1 | 0:7eacf3f1a1be | 116 | lcd.locate(95,22); |
kwstasfane1 | 0:7eacf3f1a1be | 117 | lcd.printf("%3.1f",saved_lap_times [8]); |
kwstasfane1 | 0:7eacf3f1a1be | 118 | } |
kwstasfane1 | 0:7eacf3f1a1be | 119 | } |
kwstasfane1 | 0:7eacf3f1a1be | 120 | |
kwstasfane1 | 0:7eacf3f1a1be | 121 | //use it to save the current time with the push of centre button |
kwstasfane1 | 0:7eacf3f1a1be | 122 | if(joyCflag) |
kwstasfane1 | 0:7eacf3f1a1be | 123 | { |
kwstasfane1 | 0:7eacf3f1a1be | 124 | joyCflag=0; |
kwstasfane1 | 0:7eacf3f1a1be | 125 | |
kwstasfane1 | 0:7eacf3f1a1be | 126 | if(i<=8) |
kwstasfane1 | 0:7eacf3f1a1be | 127 | { |
kwstasfane1 | 0:7eacf3f1a1be | 128 | saved_lap_times[i]=t; |
kwstasfane1 | 0:7eacf3f1a1be | 129 | i++; |
kwstasfane1 | 0:7eacf3f1a1be | 130 | } |
kwstasfane1 | 0:7eacf3f1a1be | 131 | } |
kwstasfane1 | 0:7eacf3f1a1be | 132 | |
kwstasfane1 | 0:7eacf3f1a1be | 133 | //toggle the display |
kwstasfane1 | 0:7eacf3f1a1be | 134 | |
kwstasfane1 | 0:7eacf3f1a1be | 135 | /* this bit toggles the run control between the run / stopped states |
kwstasfane1 | 0:7eacf3f1a1be | 136 | when the joystick is pushed 'IN' */ |
kwstasfane1 | 0:7eacf3f1a1be | 137 | |
kwstasfane1 | 0:7eacf3f1a1be | 138 | //if (run == 1) |
kwstasfane1 | 0:7eacf3f1a1be | 139 | // { |
kwstasfane1 | 0:7eacf3f1a1be | 140 | //if (!joyCflag) |
kwstasfane1 | 0:7eacf3f1a1be | 141 | //{ // was running so stop it |
kwstasfane1 | 0:7eacf3f1a1be | 142 | //run = 0; |
kwstasfane1 | 0:7eacf3f1a1be | 143 | //lcd.locate(40,20); |
kwstasfane1 | 0:7eacf3f1a1be | 144 | //lcd.printf("stopped");//timer has stopped |
kwstasfane1 | 0:7eacf3f1a1be | 145 | //} |
kwstasfane1 | 0:7eacf3f1a1be | 146 | //} |
kwstasfane1 | 0:7eacf3f1a1be | 147 | } |
kwstasfane1 | 0:7eacf3f1a1be | 148 | } |
kwstasfane1 | 0:7eacf3f1a1be | 149 | |
kwstasfane1 | 0:7eacf3f1a1be | 150 | void joyC_isr() |
kwstasfane1 | 0:7eacf3f1a1be | 151 | { |
kwstasfane1 | 0:7eacf3f1a1be | 152 | joyCflag = !joyCflag; |
kwstasfane1 | 0:7eacf3f1a1be | 153 | } |
kwstasfane1 | 0:7eacf3f1a1be | 154 | |
kwstasfane1 | 0:7eacf3f1a1be | 155 | void joyD_isr() |
kwstasfane1 | 0:7eacf3f1a1be | 156 | { |
kwstasfane1 | 0:7eacf3f1a1be | 157 | joyDflag = !joyDflag; |
kwstasfane1 | 0:7eacf3f1a1be | 158 | joyCflag = 0; |
kwstasfane1 | 0:7eacf3f1a1be | 159 | } |
kwstasfane1 | 0:7eacf3f1a1be | 160 | |
kwstasfane1 | 0:7eacf3f1a1be | 161 | void joyU_isr() |
kwstasfane1 | 0:7eacf3f1a1be | 162 | { |
kwstasfane1 | 0:7eacf3f1a1be | 163 | joyUflag = !joyUflag; |
kwstasfane1 | 0:7eacf3f1a1be | 164 | } |