Control de Contador Up/Down con display 7 seg, LCD2x16, módulo AD, teclado 4x4, manejo de leds

Dependencies:   TextLCD

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?

UserRevisionLine numberNew 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 */