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

Dependencies:   TextLCD

Revision:
6:af720a3e8d0b
Parent:
4:20d7dabbd3b5
--- a/main.cpp	Mon Aug 13 13:46:15 2018 -0500
+++ b/main.cpp	Sat Jan 19 15:05:36 2019 +0000
@@ -1,6 +1,239 @@
 #include "mbed.h"
+#include "Keypad.h"
+#include "TextLCD.h"
+#include "rtos.h"
+//<\>
+
+AnalogIn Canal0(A0); //PTB2
+AnalogIn Canal1(A1); //PTB3
+
+DigitalOut   bjtUnd(PTB11,1);
+DigitalOut   bjtDec(PTC11,1);
+DigitalOut   led(LED_BLUE,1);
+DigitalOut   led1(PTA2);
+DigitalOut   led2(PTC4);
+
+DigitalIn    btnInc(PTE25);
+DigitalIn    btnDcr(PTE24);
+
+EventQueue queue(32 * EVENTS_EVENT_SIZE);
+EventQueue queue2(32 * EVENTS_EVENT_SIZE);
+
+InterruptIn btn1(PTB10);
+
+Keypad  kpad(PTD0,PTD1,PTD2,PTD3, PTC17,PTB9,PTA1,PTB23);
+
+PortOut  OutC(PortC, 0x000103A3);
+
+TextLCD LCD(PTC2, PTC3, PTD0, PTD1, PTD2, PTD3); //rs, en, D4, D5, D6, D7
+
+Thread   th_btn1;
+Thread   th_LCD;
+Thread   th_Mux;
+
+Ticker   tk_cuenta; 
+Ticker   tk_blink;
+Ticker   tk_LCD;
+
+unsigned char unidades=0, decenas=0;
+unsigned int val_display[10] = {0x80, 0x0102A2, 0x0120, 0x010020, 0x010202,
+                                0x010001, 0x01, 0x0100A2, 0x00, 0x010000};
+char key;
+char user[7];
+char mask[7];
+char clave[] = "6D1#8A";
+int released = 1;
+int cnt1 = 0;
+int i = 0;
+int j = 0;
+int CH0_Val;
+int CH1_Val;
+float CH0_Volt;
+float CH1_Volt;
+
+void Clear_Str(){
+    for (i=0;i<=6;i++){ user[i] = '\0';}
+    for (i=0;i<=6;i++){ mask[i] = '\0';}  
+    i = 0; 
+}
+
+void LCD_Show(){
+    switch (cnt1){
+        case 0: LCD.locate(0,0);
+                LCD.printf("CH0 Valor: %5d",CH0_Val);
+                LCD.locate(0,1);
+                LCD.printf("CH1 Valor: %5d",CH1_Val);
+                break;
+                    
+        case 1: LCD.locate(0,0);
+                LCD.printf("CH0 Volts: %.3f",CH0_Volt);
+                LCD.locate(0,1);
+                LCD.printf("CH1 Volts: %.3f",CH1_Volt);
+                break;
+                    
+        case 2: LCD.locate(0,0);
+                LCD.printf("   Led2 State:  ");
+                LCD.locate(0,1);
+                if (!led2){ LCD.printf("    SHUT OFF    ");}
+                else { LCD.printf("    ACTIVATE    ");}
+                break;
+                
+        case 3: LCD.locate(0,0);
+                LCD.printf("    PASSWORD:   ");
+                LCD.locate(0,1);
+                LCD.printf("    ");
+                LCD.locate(5,1);
+                j = 0;
+                while (mask[j]=='*'){
+                    LCD.putc(mask[j]);
+                    j ++;    
+                }
+                LCD.locate(11,1);
+                LCD.printf("      ");
+                break;
+                
+        case 4: if (strcmp(user,clave)==0){ 
+                    LCD.locate(0,0);
+                    LCD.printf("     PUERTA      ");
+                    LCD.locate(0,1);
+                    LCD.printf("     ABIERTA!    "); 
+                    led1 = 1;
+                    wait(2);
+                    led1 = 0;
+                }
+                else { LCD.locate(0,0);
+                       LCD.printf("     CLAVE      ");
+                       LCD.locate(0,1);
+                       LCD.printf("   INCORRECTA   ");
+                       wait(2);
+                }
+                LCD.cls();
+                Clear_Str();
+                cnt1 = 0; 
+                wait_ms(100);
+                break;              
+    }
+}
 
-DigitalOut led1(LED1);
+void ISR_led2(){
+    wait_ms(100);
+    led2 = !led2;
+}
+
+void Blink_led(){
+    led = !led;
+}
+
+void multiplexado_display()
+{
+    while(1){
+        OutC.write(val_display[unidades]);
+        bjtUnd = 0;
+        bjtDec = 1;
+        wait_ms(10);
+        OutC.write(val_display[decenas]);
+        bjtUnd = 1;
+        bjtDec = 0;
+        wait_ms(10);
+    }       
+}
+
+void contador_up_down()
+{
+    if (!btnInc){
+        unidades ++;
+        if (unidades==10){
+            unidades = 0;
+            decenas ++;
+            if (decenas==10){
+                decenas = 0;
+            }
+        }
+    }
+    else { 
+        if (!btnDcr){
+            unidades --;
+            if (unidades==0xFF){
+                unidades = 9;
+                decenas --;
+                if (decenas==0xFF){
+                    decenas = 9;
+                }
+            }
+        }
+    }
+}
+
+int main()
+{   
+    LCD.cls(); 
+
+    th_LCD.start(callback(&queue, &EventQueue::dispatch_forever));
+    tk_LCD.attach(queue.event(LCD_Show), 0.5);
+    
+    btn1.mode(PullUp);
+    th_btn1.start(callback(&queue2, &EventQueue::dispatch_forever));
+    btn1.rise(queue2.event(ISR_led2));
+    
+    tk_blink.attach(&Blink_led, 0.25);
+    
+    th_Mux.start(multiplexado_display);
+    tk_cuenta.attach(&contador_up_down, 0.25);
+    
+    led2 = 0;
+    Clear_Str();
+    
+    while (1) 
+    {
+        CH0_Val = Canal0.read_u16();
+        CH1_Val = Canal1.read_u16();
+        CH0_Volt = Canal0.read_u16()*3.3/65536;
+        CH1_Volt = Canal1.read_u16()*3.3/65536;
+        
+        key = kpad.ReadKey();
+/*
+        if (key == '\0'){ released = 1;}
+        if ((key!='\0')&&(released == 1)){
+            LCD.locate(0,0);
+            LCD.printf("%c",key);
+            printf("%c\n",key);
+            released = 0;
+        }
+        led = !led;
+        wait_ms(100);
+*/      
+        if (key == '\0'){ released = 1;}
+        if ((key!='\0')&&(released == 1)){
+            if (key == 'C'){
+                LCD.cls();
+                cnt1 ++;
+                if (cnt1 == 3){ i = 0;}
+                if (cnt1 == 4){
+                    cnt1 = 0;
+                    Clear_Str();
+                }
+                key = '\0';
+                released = 0;
+            }
+            else { if (cnt1 == 3){
+                       if (i == 6){
+                           if (key == 'D'){ cnt1 = 4;}
+                       }
+                       else { user[i] = key;
+                              mask[i] = '*';
+                              i ++;
+                       }
+                   }
+            }
+            key = '\0';
+            released = 0;
+        }
+        wait_ms(100);  
+    }      
+}
+
+/*
+DigitalOut led1(PTA2);
 InterruptIn sw(SW2);
 EventQueue queue(32 * EVENTS_EVENT_SIZE);
 Thread t;
@@ -26,3 +259,4 @@
     // The 'fall' handler will execute in the context of thread 't'
     sw.fall(queue.event(fall_handler));
 }
+*/