/* Programa con el 12f675 y un HT12E que sirve para leer un teclado analógico usando una cadena de resistencias de 1k formando un divisor de tensión con otra de 10K a Una fuente de voltaje regulado (Vi). Dependiendo de la tecla presionada y del voltaje convertido se traduce en el numero BCD de la tecla que corresponda. Alfredo Segura enero de 2011, México. */ #include <12f675.h> #define adc = 10 #fuses INTRC_IO, NOMCLR, NOWDT, PUT, NOBROWNOUT, NOCPD, NOPROTECT #use delay(clock = 4000000) #use fast_io(a) #byte Port_A = 0x05 #bit ra0 = 0x05.0 // Entrada Analógica #bit ra1 = 0x05.1 // D0 #bit ra2 = 0x05.2 // D1 #bit ra3 = 0x05.3 #bit ra4 = 0x05.4 // D2 #bit ra5 = 0x05.5 // D3 #rom 0x03FF = {0x3438 } // solo poner si se usa el programador USP 3.0 int i = 0, cod1, cod2, dato, comd; void enviar(comd) { // comd viene como 0b000001, 0b0000111 cod1 = comd << 1; // Recorre una vez para acomodar D0 en D1 y D1 en D2 cod2 = cod1 << 1; // Recorre otra vez para acomodar D2 en D4 y D3 en D5 cod1 = cod1 & 0x0F; // Protege nibble bajo cod2 = cod2 & 0xF0; // Protege nibble alto comd = cod1 | cod2; // Reúne ambas partes Port_A = comd; // saca dato por el puerto delay_us(200); // lo exhibe un momento } void ini(void) { setup_adc(adc_clock_internal); setup_adc_ports(san0); setup_comparator(nc_nc_nc_nc); set_tris_A(0b00001001); Port_A = 0x00; i = 0; } void main(void) { ini(); delay_ms(300); // Retardo de 300 ms al encender el pic while (true) { dato = read_adc(); delay_ms(100); if ((dato >= 111) && (dato <= 120)) { // no hay dato } if ((dato >= 0) && (dato <= 5)) { // tecla "1" comd = 0x01; // Tecla "1" enviar(comd); // envía dato } if ((dato >= 18) && (dato <= 30)) { // tecla "2" comd = 0x02; // Tecla "2" enviar(comd); // envía dato } if ((dato >= 36) && (dato <= 49)) { // tecla "3" comd = 0x03; // Tecla "3" enviar(comd); // envía dato } if ((dato >= 55) && (dato <= 65)) { // tecla "4" comd = 0x04; // Tecla "4" enviar(comd); // envía dato } if ((dato >= 68) && (dato <= 78)) { // tecla "5" comd = 0x05; // Tecla "5" enviar(comd); // envía dato } if ((dato >= 80) && (dato <= 89)) { // tecla "6" comd = 0x06; // Tecla "6" enviar(comd); // envía dato } if ((dato >= 91) && (dato <= 99)) { // tecla "7" comd = 0x07; // Tecla "7" enviar(comd); // envía dato } if ((dato >= 101) && (dato <= 108)) { // tecla "8" comd = 0x08; // Tecla "8" enviar(comd); // envía dato } } } |