// Ejemplo simple que muestra el funcionamiento del puerto I2C, RS232, teclado y LCD. // Envia la entrada del teclado a la eeprom (PCF8582) y al pulsar la tecla 0xF los lee. // Fernando Pardo 2005 // MPLAB C18 #include #include #include //#include // no funciona para el 2550 pues usa RB0 y RB1 #define CLKFREQ 6L #include "lcd18.h" #pragma romdata CONFIG const rom unsigned char _configuration[14] = //{0x00,0x0C,0x1F,0x1E,0x00,0x81,0x81,0x00,0x0F,0xC0,0x0F,0xE0,0x0F,0x40}; {0x10,0x0F,0x1F,0x1E,0x00,0x81,0x81,0x00,0x0F,0xC0,0x0F,0xE0,0x0F,0x40}; #pragma romdata #define ESCLAVO 0b10100000 unsigned char Tecla,TeclaRem; unsigned char Temp,Temp1,Temp2; unsigned char Pulsada; unsigned char dir; void Lee_Tecla(void) { TRISB=0b11110000; EnablePullups(); PORTB=0; Delay10TCYx(1L*CLKFREQ/4+1); // 10 us. Para establecimiento Temp1=(PORTB>>4); Temp=0; while ((Temp1 & 0x01)) // cuenta hasta que llegue a un bit set (not set) { Temp1>>=1; Temp++; } if (Temp<4) // se ha pulsado { Temp2=Temp; // Guardo columna TRISB=0b00001111; // ahora la fila EnablePullups(); PORTB=0; Delay10TCYx(1L*CLKFREQ/4+1); // 10 us. Para establecimiento Temp1=PORTB&0x0F; // parte alta a cero Temp=0; while ((Temp1 & 0x01)) // cuenta hasta que llegue a un bit set { Temp1>>=1; Temp++; } if (Temp<4) // Fila correcta { Temp1=Temp; Tecla=(Temp2<<2)+Temp1; } else Tecla=0xFF; } else Tecla=0xFF; DisablePullups(); } void RS_Ini(void) { OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, (unsigned char)(CLKFREQ*6.5104167+0.5)-1); // CLKFREQ*1000000/16/9600-1 /*// SPBRG=25; // 9600 baudios alta velocidad, 4MHz SPBRG=38; // 9600 baudios alta velocidad, 6MHz TXSTA=10100100b; // Asincrono, alta velocidad, reloj interno RCSTA=10010000b; // Habilita RS232, 8 bits, -, recepcion continua, no errores // set_tris_c(10111111b); // RC6/TX de salida, resto de entrada TRISC=(TRISC & 10111111b) | 10000000b; */ } void RS_Envia(char caracter) { while (BusyUSART()); // espera a que este libre WriteUSART(caracter); /* TXREG=caracter; // while ((PIR1&00010000b)==0); // Espera a que se envie */ } /* char RS_Recibe(void) { return(ReadUSART()); // return(RCREG); } */ void main(void) { ADCON1=0x0F; // todas las entradas digitales LCD_Prepara(); LCD_Ini(); LCD_Comando(0b00111100); // 8 bits, 2 lineas, 5x10 font LCD_Comando(0b00001111); // Disp On, Cursor On, Blink On PORTC=0; Pulsada=0; RS_Ini(); while (1) { dir=0; Tecla=0; while (Tecla!=0xF) { if (DataRdyUSART()) { TeclaRem=ReadUSART(); //RCREG; //RS_Recibe(); LCD_Dato(TeclaRem); } Lee_Tecla(); if (Tecla<16) { if (!Pulsada) { Pulsada=1; if (Tecla<10) { LCD_Dato(Tecla+'0'); RS_Envia(Tecla+'0'); } else { LCD_Dato(Tecla+55); // 55='A'-10 RS_Envia(Tecla+55); } } } else { if (Pulsada) { Pulsada=0; } } Delay10KTCYx(1L*CLKFREQ/4+1); // 10 ms. Para evitar rebotes } LCD_Comando(0b11000000); // Segunda linea del LCD LCD_Comando(0b00000010); // A home sin borrar } }