//------------------------------------------------------ // void LCD_write(UWORD dato, LCD_TIPO tipo) // // Descripción: // Función para escribir en el LCD // // Parámetros: // char dato // instrucción o carácter a escribir en el display // LCD_TIPO tipo // LCD_CHAR si dato es un carácter a escribir // LCD_INST si dato es una instrucción para el LCD //------------------------------------------------------ void LCD_write(UWORD dato, LCD_TIPO tipo) { UWORD salida; if(tipo == LCD_CHAR){ dato = dato << 8; // El dato debe estar en los 8 bits más significativos } set16_puertoS(dato | tipo | BIT_ENABLE); // Enable + dato: Activamos LCD e indicamos el tipo de dato retardo(RET_3MS); set16_puertoS(dato | tipo); // Disable: carga el dato en el LCD retardo(RET_3MS); }
//------------------------------------------------------ // char teclado(void) // // Descripción: // Explora el teclado matr<icial y devuelve la tecla // pulsada //------------------------------------------------------ char teclado(void) { //char tecla; BYTE fila, columna, fila_mask; static char teclas[4][4] = {{"123C"}, {"456D"}, {"789E"}, {"A0BF"}}; // Bucle de exploración del teclado while (TRUE) { // Excitamos una columna for (columna = NUM_COLS - 1; columna >= 0; columna--) { salida = salida & 0xFFF0; // Realizamos un AND binario con el valor actual de salida y 0xFFF0 para no interferir salida = salida | (EXCIT << columna); set16_puertoS (salida); // Se envía la excitación de columna retardo(20000); // Esperamos respuesta de optoacopladores // Exploramos las filas en busca de respuesta for (fila = NUM_FILAS - 1; fila >= 0; fila--) { fila_mask = EXCIT << fila; // Máscara para leer el bit de la fila actual if (lee16_puertoE() & fila_mask) { // Si encuentra tecla pulsada, while (lee_puertoE() & fila_mask); // Esperamos a que se suelte retardo(20000); // Retardo antirrebotes return teclas[fila][columna]; // Devolvemos la tecla pulsada } } // Siguiente columna } // Exploración finalizada sin encontrar una tecla pulsada } // Reiniciamos exploración }
//--------------------------------------------------------- // void leds_ColumnaEncender(columnas) // // Descripción: // Método que excita la columna que introducimos como parametro //--------------------------------------------------------- void leds_ColumnaEncender(int columna) { // suponemos que valor contiene el último dato enviado al puerto // pone a 0 los bits de columnas; valor = valor & MASCARA_COLUMNAS; // pone a 1 el bit de la columna que queremos excitar switch(columna){ case 0: valor = valor | MASCARA_C0; set16_puertoS(valor); break; case 1: valor = valor | MASCARA_C1; set16_puertoS(valor); break; case 2: valor = valor | MASCARA_C2; set16_puertoS(valor); break; case 3: valor = valor | MASCARA_C3; set16_puertoS(valor); break; case 4: valor = valor | MASCARA_C4; set16_puertoS(valor); break; case 5: valor = valor | MASCARA_C5; set16_puertoS(valor); break; case 6: valor = valor | MASCARA_C6; set16_puertoS(valor); break; case 7: valor = valor | MASCARA_C7; set16_puertoS(valor); break; } }
//--------------------------------------------------------- // void puerto_FilaEncender(fila) // // Descripción: // Método que excita la fila que introducimos como parametro //--------------------------------------------------------- void leds_FilaEncender(int fila) { // suponemos que valor contiene el último dato enviado al puerto // pone a 0 el bit adecuado switch(fila){ case 0: valor = valor & MASCARA_F0; set16_puertoS(valor); break; case 1: valor = valor & MASCARA_F1; set16_puertoS(valor); break; case 2: valor = valor & MASCARA_F2; set16_puertoS(valor); break; case 3: valor = valor & MASCARA_F3; set16_puertoS(valor); break; case 4: valor = valor & MASCARA_F4; set16_puertoS(valor); break; case 5: valor = valor & MASCARA_F5; set16_puertoS(valor); break; case 6: valor = valor & MASCARA_F6; set16_puertoS(valor); break; case 7: valor = valor & MASCARA_F7; set16_puertoS(valor); break; } }
void columnasBarrer(void) { puerto.variableAux=puerto.variableAux & BORRA_COLUMNA; if(led.controladorColumna==0) { //las columnas no se iluminan simultaneamente puerto.variableAux=led.columna1; } if(led.controladorColumna==1) { puerto.variableAux=led.columna2; } if(led.controladorColumna==2) { puerto.variableAux=led.columna3; } led.controladorColumna++; if(led.controladorColumna==3) { led.controladorColumna=0; } puerto.variableAux=puerto.variableAux&NO_TOCAR_BITS_TECLADO; //desactivamos los bits 1,2 y 3 del //puerto de salida. set16_puertoS(puerto.variableAux); //enviamos la información al puerto }
//--------------------------------------------------------- // void puerto_FilaApagar(void) // // Descripción: // Método que excita la fila que introducimos como parametro //--------------------------------------------------------- void leds_FilaApagar(void){ valor=valor | MASCARA_FILAS; set16_puertoS(valor); }