Carlos Quintana
/
Event_Queue1
Control de Contador Up/Down con display 7 seg, LCD2x16, módulo AD, teclado 4x4, manejo de leds
main.cpp@7:a20b9ae110d5, 2019-01-19 (annotated)
- Committer:
- Otakutronics
- Date:
- Sat Jan 19 15:10:50 2019 +0000
- Revision:
- 7:a20b9ae110d5
- Parent:
- 6:af720a3e8d0b
Programa de prueba de la EventQueueAPI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mab5449 | 0:aea2e03f5625 | 1 | #include "mbed.h" |
Otakutronics | 6:af720a3e8d0b | 2 | #include "Keypad.h" |
Otakutronics | 6:af720a3e8d0b | 3 | #include "TextLCD.h" |
Otakutronics | 6:af720a3e8d0b | 4 | #include "rtos.h" |
Otakutronics | 6:af720a3e8d0b | 5 | //<\> |
Otakutronics | 6:af720a3e8d0b | 6 | |
Otakutronics | 6:af720a3e8d0b | 7 | AnalogIn Canal0(A0); //PTB2 |
Otakutronics | 6:af720a3e8d0b | 8 | AnalogIn Canal1(A1); //PTB3 |
Otakutronics | 6:af720a3e8d0b | 9 | |
Otakutronics | 6:af720a3e8d0b | 10 | DigitalOut bjtUnd(PTB11,1); |
Otakutronics | 6:af720a3e8d0b | 11 | DigitalOut bjtDec(PTC11,1); |
Otakutronics | 6:af720a3e8d0b | 12 | DigitalOut led(LED_BLUE,1); |
Otakutronics | 6:af720a3e8d0b | 13 | DigitalOut led1(PTA2); |
Otakutronics | 6:af720a3e8d0b | 14 | DigitalOut led2(PTC4); |
Otakutronics | 6:af720a3e8d0b | 15 | |
Otakutronics | 6:af720a3e8d0b | 16 | DigitalIn btnInc(PTE25); |
Otakutronics | 6:af720a3e8d0b | 17 | DigitalIn btnDcr(PTE24); |
Otakutronics | 6:af720a3e8d0b | 18 | |
Otakutronics | 6:af720a3e8d0b | 19 | EventQueue queue(32 * EVENTS_EVENT_SIZE); |
Otakutronics | 6:af720a3e8d0b | 20 | EventQueue queue2(32 * EVENTS_EVENT_SIZE); |
Otakutronics | 6:af720a3e8d0b | 21 | |
Otakutronics | 6:af720a3e8d0b | 22 | InterruptIn btn1(PTB10); |
Otakutronics | 6:af720a3e8d0b | 23 | |
Otakutronics | 6:af720a3e8d0b | 24 | Keypad kpad(PTD0,PTD1,PTD2,PTD3, PTC17,PTB9,PTA1,PTB23); |
Otakutronics | 6:af720a3e8d0b | 25 | |
Otakutronics | 6:af720a3e8d0b | 26 | PortOut OutC(PortC, 0x000103A3); |
Otakutronics | 6:af720a3e8d0b | 27 | |
Otakutronics | 6:af720a3e8d0b | 28 | TextLCD LCD(PTC2, PTC3, PTD0, PTD1, PTD2, PTD3); //rs, en, D4, D5, D6, D7 |
Otakutronics | 6:af720a3e8d0b | 29 | |
Otakutronics | 6:af720a3e8d0b | 30 | Thread th_btn1; |
Otakutronics | 6:af720a3e8d0b | 31 | Thread th_LCD; |
Otakutronics | 6:af720a3e8d0b | 32 | Thread th_Mux; |
Otakutronics | 6:af720a3e8d0b | 33 | |
Otakutronics | 6:af720a3e8d0b | 34 | Ticker tk_cuenta; |
Otakutronics | 6:af720a3e8d0b | 35 | Ticker tk_blink; |
Otakutronics | 6:af720a3e8d0b | 36 | Ticker tk_LCD; |
Otakutronics | 6:af720a3e8d0b | 37 | |
Otakutronics | 6:af720a3e8d0b | 38 | unsigned char unidades=0, decenas=0; |
Otakutronics | 6:af720a3e8d0b | 39 | unsigned int val_display[10] = {0x80, 0x0102A2, 0x0120, 0x010020, 0x010202, |
Otakutronics | 6:af720a3e8d0b | 40 | 0x010001, 0x01, 0x0100A2, 0x00, 0x010000}; |
Otakutronics | 6:af720a3e8d0b | 41 | char key; |
Otakutronics | 6:af720a3e8d0b | 42 | char user[7]; |
Otakutronics | 6:af720a3e8d0b | 43 | char mask[7]; |
Otakutronics | 6:af720a3e8d0b | 44 | char clave[] = "6D1#8A"; |
Otakutronics | 6:af720a3e8d0b | 45 | int released = 1; |
Otakutronics | 6:af720a3e8d0b | 46 | int cnt1 = 0; |
Otakutronics | 6:af720a3e8d0b | 47 | int i = 0; |
Otakutronics | 6:af720a3e8d0b | 48 | int j = 0; |
Otakutronics | 6:af720a3e8d0b | 49 | int CH0_Val; |
Otakutronics | 6:af720a3e8d0b | 50 | int CH1_Val; |
Otakutronics | 6:af720a3e8d0b | 51 | float CH0_Volt; |
Otakutronics | 6:af720a3e8d0b | 52 | float CH1_Volt; |
Otakutronics | 6:af720a3e8d0b | 53 | |
Otakutronics | 6:af720a3e8d0b | 54 | void Clear_Str(){ |
Otakutronics | 6:af720a3e8d0b | 55 | for (i=0;i<=6;i++){ user[i] = '\0';} |
Otakutronics | 6:af720a3e8d0b | 56 | for (i=0;i<=6;i++){ mask[i] = '\0';} |
Otakutronics | 6:af720a3e8d0b | 57 | i = 0; |
Otakutronics | 6:af720a3e8d0b | 58 | } |
Otakutronics | 6:af720a3e8d0b | 59 | |
Otakutronics | 6:af720a3e8d0b | 60 | void LCD_Show(){ |
Otakutronics | 6:af720a3e8d0b | 61 | switch (cnt1){ |
Otakutronics | 6:af720a3e8d0b | 62 | case 0: LCD.locate(0,0); |
Otakutronics | 6:af720a3e8d0b | 63 | LCD.printf("CH0 Valor: %5d",CH0_Val); |
Otakutronics | 6:af720a3e8d0b | 64 | LCD.locate(0,1); |
Otakutronics | 6:af720a3e8d0b | 65 | LCD.printf("CH1 Valor: %5d",CH1_Val); |
Otakutronics | 6:af720a3e8d0b | 66 | break; |
Otakutronics | 6:af720a3e8d0b | 67 | |
Otakutronics | 6:af720a3e8d0b | 68 | case 1: LCD.locate(0,0); |
Otakutronics | 6:af720a3e8d0b | 69 | LCD.printf("CH0 Volts: %.3f",CH0_Volt); |
Otakutronics | 6:af720a3e8d0b | 70 | LCD.locate(0,1); |
Otakutronics | 6:af720a3e8d0b | 71 | LCD.printf("CH1 Volts: %.3f",CH1_Volt); |
Otakutronics | 6:af720a3e8d0b | 72 | break; |
Otakutronics | 6:af720a3e8d0b | 73 | |
Otakutronics | 6:af720a3e8d0b | 74 | case 2: LCD.locate(0,0); |
Otakutronics | 6:af720a3e8d0b | 75 | LCD.printf(" Led2 State: "); |
Otakutronics | 6:af720a3e8d0b | 76 | LCD.locate(0,1); |
Otakutronics | 6:af720a3e8d0b | 77 | if (!led2){ LCD.printf(" SHUT OFF ");} |
Otakutronics | 6:af720a3e8d0b | 78 | else { LCD.printf(" ACTIVATE ");} |
Otakutronics | 6:af720a3e8d0b | 79 | break; |
Otakutronics | 6:af720a3e8d0b | 80 | |
Otakutronics | 6:af720a3e8d0b | 81 | case 3: LCD.locate(0,0); |
Otakutronics | 6:af720a3e8d0b | 82 | LCD.printf(" PASSWORD: "); |
Otakutronics | 6:af720a3e8d0b | 83 | LCD.locate(0,1); |
Otakutronics | 6:af720a3e8d0b | 84 | LCD.printf(" "); |
Otakutronics | 6:af720a3e8d0b | 85 | LCD.locate(5,1); |
Otakutronics | 6:af720a3e8d0b | 86 | j = 0; |
Otakutronics | 6:af720a3e8d0b | 87 | while (mask[j]=='*'){ |
Otakutronics | 6:af720a3e8d0b | 88 | LCD.putc(mask[j]); |
Otakutronics | 6:af720a3e8d0b | 89 | j ++; |
Otakutronics | 6:af720a3e8d0b | 90 | } |
Otakutronics | 6:af720a3e8d0b | 91 | LCD.locate(11,1); |
Otakutronics | 6:af720a3e8d0b | 92 | LCD.printf(" "); |
Otakutronics | 6:af720a3e8d0b | 93 | break; |
Otakutronics | 6:af720a3e8d0b | 94 | |
Otakutronics | 6:af720a3e8d0b | 95 | case 4: if (strcmp(user,clave)==0){ |
Otakutronics | 6:af720a3e8d0b | 96 | LCD.locate(0,0); |
Otakutronics | 6:af720a3e8d0b | 97 | LCD.printf(" PUERTA "); |
Otakutronics | 6:af720a3e8d0b | 98 | LCD.locate(0,1); |
Otakutronics | 6:af720a3e8d0b | 99 | LCD.printf(" ABIERTA! "); |
Otakutronics | 6:af720a3e8d0b | 100 | led1 = 1; |
Otakutronics | 6:af720a3e8d0b | 101 | wait(2); |
Otakutronics | 6:af720a3e8d0b | 102 | led1 = 0; |
Otakutronics | 6:af720a3e8d0b | 103 | } |
Otakutronics | 6:af720a3e8d0b | 104 | else { LCD.locate(0,0); |
Otakutronics | 6:af720a3e8d0b | 105 | LCD.printf(" CLAVE "); |
Otakutronics | 6:af720a3e8d0b | 106 | LCD.locate(0,1); |
Otakutronics | 6:af720a3e8d0b | 107 | LCD.printf(" INCORRECTA "); |
Otakutronics | 6:af720a3e8d0b | 108 | wait(2); |
Otakutronics | 6:af720a3e8d0b | 109 | } |
Otakutronics | 6:af720a3e8d0b | 110 | LCD.cls(); |
Otakutronics | 6:af720a3e8d0b | 111 | Clear_Str(); |
Otakutronics | 6:af720a3e8d0b | 112 | cnt1 = 0; |
Otakutronics | 6:af720a3e8d0b | 113 | wait_ms(100); |
Otakutronics | 6:af720a3e8d0b | 114 | break; |
Otakutronics | 6:af720a3e8d0b | 115 | } |
Otakutronics | 6:af720a3e8d0b | 116 | } |
mab5449 | 0:aea2e03f5625 | 117 | |
Otakutronics | 6:af720a3e8d0b | 118 | void ISR_led2(){ |
Otakutronics | 6:af720a3e8d0b | 119 | wait_ms(100); |
Otakutronics | 6:af720a3e8d0b | 120 | led2 = !led2; |
Otakutronics | 6:af720a3e8d0b | 121 | } |
Otakutronics | 6:af720a3e8d0b | 122 | |
Otakutronics | 6:af720a3e8d0b | 123 | void Blink_led(){ |
Otakutronics | 6:af720a3e8d0b | 124 | led = !led; |
Otakutronics | 6:af720a3e8d0b | 125 | } |
Otakutronics | 6:af720a3e8d0b | 126 | |
Otakutronics | 6:af720a3e8d0b | 127 | void multiplexado_display() |
Otakutronics | 6:af720a3e8d0b | 128 | { |
Otakutronics | 6:af720a3e8d0b | 129 | while(1){ |
Otakutronics | 6:af720a3e8d0b | 130 | OutC.write(val_display[unidades]); |
Otakutronics | 6:af720a3e8d0b | 131 | bjtUnd = 0; |
Otakutronics | 6:af720a3e8d0b | 132 | bjtDec = 1; |
Otakutronics | 6:af720a3e8d0b | 133 | wait_ms(10); |
Otakutronics | 6:af720a3e8d0b | 134 | OutC.write(val_display[decenas]); |
Otakutronics | 6:af720a3e8d0b | 135 | bjtUnd = 1; |
Otakutronics | 6:af720a3e8d0b | 136 | bjtDec = 0; |
Otakutronics | 6:af720a3e8d0b | 137 | wait_ms(10); |
Otakutronics | 6:af720a3e8d0b | 138 | } |
Otakutronics | 6:af720a3e8d0b | 139 | } |
Otakutronics | 6:af720a3e8d0b | 140 | |
Otakutronics | 6:af720a3e8d0b | 141 | void contador_up_down() |
Otakutronics | 6:af720a3e8d0b | 142 | { |
Otakutronics | 6:af720a3e8d0b | 143 | if (!btnInc){ |
Otakutronics | 6:af720a3e8d0b | 144 | unidades ++; |
Otakutronics | 6:af720a3e8d0b | 145 | if (unidades==10){ |
Otakutronics | 6:af720a3e8d0b | 146 | unidades = 0; |
Otakutronics | 6:af720a3e8d0b | 147 | decenas ++; |
Otakutronics | 6:af720a3e8d0b | 148 | if (decenas==10){ |
Otakutronics | 6:af720a3e8d0b | 149 | decenas = 0; |
Otakutronics | 6:af720a3e8d0b | 150 | } |
Otakutronics | 6:af720a3e8d0b | 151 | } |
Otakutronics | 6:af720a3e8d0b | 152 | } |
Otakutronics | 6:af720a3e8d0b | 153 | else { |
Otakutronics | 6:af720a3e8d0b | 154 | if (!btnDcr){ |
Otakutronics | 6:af720a3e8d0b | 155 | unidades --; |
Otakutronics | 6:af720a3e8d0b | 156 | if (unidades==0xFF){ |
Otakutronics | 6:af720a3e8d0b | 157 | unidades = 9; |
Otakutronics | 6:af720a3e8d0b | 158 | decenas --; |
Otakutronics | 6:af720a3e8d0b | 159 | if (decenas==0xFF){ |
Otakutronics | 6:af720a3e8d0b | 160 | decenas = 9; |
Otakutronics | 6:af720a3e8d0b | 161 | } |
Otakutronics | 6:af720a3e8d0b | 162 | } |
Otakutronics | 6:af720a3e8d0b | 163 | } |
Otakutronics | 6:af720a3e8d0b | 164 | } |
Otakutronics | 6:af720a3e8d0b | 165 | } |
Otakutronics | 6:af720a3e8d0b | 166 | |
Otakutronics | 6:af720a3e8d0b | 167 | int main() |
Otakutronics | 6:af720a3e8d0b | 168 | { |
Otakutronics | 6:af720a3e8d0b | 169 | LCD.cls(); |
Otakutronics | 6:af720a3e8d0b | 170 | |
Otakutronics | 6:af720a3e8d0b | 171 | th_LCD.start(callback(&queue, &EventQueue::dispatch_forever)); |
Otakutronics | 6:af720a3e8d0b | 172 | tk_LCD.attach(queue.event(LCD_Show), 0.5); |
Otakutronics | 6:af720a3e8d0b | 173 | |
Otakutronics | 6:af720a3e8d0b | 174 | btn1.mode(PullUp); |
Otakutronics | 6:af720a3e8d0b | 175 | th_btn1.start(callback(&queue2, &EventQueue::dispatch_forever)); |
Otakutronics | 6:af720a3e8d0b | 176 | btn1.rise(queue2.event(ISR_led2)); |
Otakutronics | 6:af720a3e8d0b | 177 | |
Otakutronics | 6:af720a3e8d0b | 178 | tk_blink.attach(&Blink_led, 0.25); |
Otakutronics | 6:af720a3e8d0b | 179 | |
Otakutronics | 6:af720a3e8d0b | 180 | th_Mux.start(multiplexado_display); |
Otakutronics | 6:af720a3e8d0b | 181 | tk_cuenta.attach(&contador_up_down, 0.25); |
Otakutronics | 6:af720a3e8d0b | 182 | |
Otakutronics | 6:af720a3e8d0b | 183 | led2 = 0; |
Otakutronics | 6:af720a3e8d0b | 184 | Clear_Str(); |
Otakutronics | 6:af720a3e8d0b | 185 | |
Otakutronics | 6:af720a3e8d0b | 186 | while (1) |
Otakutronics | 6:af720a3e8d0b | 187 | { |
Otakutronics | 6:af720a3e8d0b | 188 | CH0_Val = Canal0.read_u16(); |
Otakutronics | 6:af720a3e8d0b | 189 | CH1_Val = Canal1.read_u16(); |
Otakutronics | 6:af720a3e8d0b | 190 | CH0_Volt = Canal0.read_u16()*3.3/65536; |
Otakutronics | 6:af720a3e8d0b | 191 | CH1_Volt = Canal1.read_u16()*3.3/65536; |
Otakutronics | 6:af720a3e8d0b | 192 | |
Otakutronics | 6:af720a3e8d0b | 193 | key = kpad.ReadKey(); |
Otakutronics | 6:af720a3e8d0b | 194 | /* |
Otakutronics | 6:af720a3e8d0b | 195 | if (key == '\0'){ released = 1;} |
Otakutronics | 6:af720a3e8d0b | 196 | if ((key!='\0')&&(released == 1)){ |
Otakutronics | 6:af720a3e8d0b | 197 | LCD.locate(0,0); |
Otakutronics | 6:af720a3e8d0b | 198 | LCD.printf("%c",key); |
Otakutronics | 6:af720a3e8d0b | 199 | printf("%c\n",key); |
Otakutronics | 6:af720a3e8d0b | 200 | released = 0; |
Otakutronics | 6:af720a3e8d0b | 201 | } |
Otakutronics | 6:af720a3e8d0b | 202 | led = !led; |
Otakutronics | 6:af720a3e8d0b | 203 | wait_ms(100); |
Otakutronics | 6:af720a3e8d0b | 204 | */ |
Otakutronics | 6:af720a3e8d0b | 205 | if (key == '\0'){ released = 1;} |
Otakutronics | 6:af720a3e8d0b | 206 | if ((key!='\0')&&(released == 1)){ |
Otakutronics | 6:af720a3e8d0b | 207 | if (key == 'C'){ |
Otakutronics | 6:af720a3e8d0b | 208 | LCD.cls(); |
Otakutronics | 6:af720a3e8d0b | 209 | cnt1 ++; |
Otakutronics | 6:af720a3e8d0b | 210 | if (cnt1 == 3){ i = 0;} |
Otakutronics | 6:af720a3e8d0b | 211 | if (cnt1 == 4){ |
Otakutronics | 6:af720a3e8d0b | 212 | cnt1 = 0; |
Otakutronics | 6:af720a3e8d0b | 213 | Clear_Str(); |
Otakutronics | 6:af720a3e8d0b | 214 | } |
Otakutronics | 6:af720a3e8d0b | 215 | key = '\0'; |
Otakutronics | 6:af720a3e8d0b | 216 | released = 0; |
Otakutronics | 6:af720a3e8d0b | 217 | } |
Otakutronics | 6:af720a3e8d0b | 218 | else { if (cnt1 == 3){ |
Otakutronics | 6:af720a3e8d0b | 219 | if (i == 6){ |
Otakutronics | 6:af720a3e8d0b | 220 | if (key == 'D'){ cnt1 = 4;} |
Otakutronics | 6:af720a3e8d0b | 221 | } |
Otakutronics | 6:af720a3e8d0b | 222 | else { user[i] = key; |
Otakutronics | 6:af720a3e8d0b | 223 | mask[i] = '*'; |
Otakutronics | 6:af720a3e8d0b | 224 | i ++; |
Otakutronics | 6:af720a3e8d0b | 225 | } |
Otakutronics | 6:af720a3e8d0b | 226 | } |
Otakutronics | 6:af720a3e8d0b | 227 | } |
Otakutronics | 6:af720a3e8d0b | 228 | key = '\0'; |
Otakutronics | 6:af720a3e8d0b | 229 | released = 0; |
Otakutronics | 6:af720a3e8d0b | 230 | } |
Otakutronics | 6:af720a3e8d0b | 231 | wait_ms(100); |
Otakutronics | 6:af720a3e8d0b | 232 | } |
Otakutronics | 6:af720a3e8d0b | 233 | } |
Otakutronics | 6:af720a3e8d0b | 234 | |
Otakutronics | 6:af720a3e8d0b | 235 | /* |
Otakutronics | 6:af720a3e8d0b | 236 | DigitalOut led1(PTA2); |
mab5449 | 0:aea2e03f5625 | 237 | InterruptIn sw(SW2); |
mab5449 | 0:aea2e03f5625 | 238 | EventQueue queue(32 * EVENTS_EVENT_SIZE); |
mab5449 | 0:aea2e03f5625 | 239 | Thread t; |
mab5449 | 0:aea2e03f5625 | 240 | |
mab5449 | 0:aea2e03f5625 | 241 | void rise_handler(void) { |
Jennifer Plunkett |
4:20d7dabbd3b5 | 242 | printf("rise_handler in context %p\r\n", Thread::gettid()); |
mab5449 | 0:aea2e03f5625 | 243 | // Toggle LED |
mab5449 | 0:aea2e03f5625 | 244 | led1 = !led1; |
mab5449 | 0:aea2e03f5625 | 245 | } |
mab5449 | 0:aea2e03f5625 | 246 | |
mab5449 | 0:aea2e03f5625 | 247 | void fall_handler(void) { |
mab5449 | 0:aea2e03f5625 | 248 | printf("fall_handler in context %p\r\n", Thread::gettid()); |
mab5449 | 0:aea2e03f5625 | 249 | // Toggle LED |
mab5449 | 0:aea2e03f5625 | 250 | led1 = !led1; |
mab5449 | 0:aea2e03f5625 | 251 | } |
mab5449 | 0:aea2e03f5625 | 252 | |
mab5449 | 0:aea2e03f5625 | 253 | int main() { |
mab5449 | 0:aea2e03f5625 | 254 | // Start the event queue |
mab5449 | 0:aea2e03f5625 | 255 | t.start(callback(&queue, &EventQueue::dispatch_forever)); |
mab5449 | 0:aea2e03f5625 | 256 | printf("Starting in context %p\r\n", Thread::gettid()); |
mab5449 | 0:aea2e03f5625 | 257 | // The 'rise' handler will execute in IRQ context |
mab5449 | 0:aea2e03f5625 | 258 | sw.rise(rise_handler); |
mab5449 | 0:aea2e03f5625 | 259 | // The 'fall' handler will execute in the context of thread 't' |
mab5449 | 0:aea2e03f5625 | 260 | sw.fall(queue.event(fall_handler)); |
mab5449 | 0:aea2e03f5625 | 261 | } |
Otakutronics | 6:af720a3e8d0b | 262 | */ |