/**************************************
Libreria de Retardos en milisegundos
**************************************/
void Ret_ms(short Time_ms){
for(;Time_ms>=0;Time_ms--)
Delay_ms(1);}
/*************************************
LIBRERIA LCD + teclado
Autor: Luis Alberto Vargas Tijerino.
Pais: Leon, Nicaragua
Fecha: 13/11/09
Forma de Conexion de 4bits por Defecto
para un nucleo PIC
PORTB= D7..4 y filas teclado
RB3 = EN
RB2 = RS
PORTB 0..3=columnas teclado
Descripcion de Funciones
Lcd_caracter(caracter);
Esta funcion imprime un solo caracter en la posicion actual del Lcd
Lcd_comando(comando);
Esta funcion envia un comando al Lcd.
Lcd_Pos(Fila,Columna);
Esta funcion envia la posicion de:
la fila 0 hasta 1
la Columna 0 hasta 15.
Lcd_print(cadena)
Esta funcion sirve para imprimir cadenas varialbles escritas
Lcd_printf(Fila,Columna,cadena)
Estua funcion sirve para imprimir cadenas variables en una posicion determianda
de la pantalla
Lcd_printc(cadena)
Esta funcion sirve para imprimir cadenas constantes escritas
Lcd_printfc(Fila,Columna,cadena)
Esta funcion sirve para imprimir cadenas constantes en una posicion determianda
de la pantalla
**************************************/
#ifndef data_port
#define data_port PORTB
#endif
#ifndef data_tris
#define data_tris TRISB
#endif
#ifndef EN
#define EN PORTB.F3
#endif
#ifndef ENt
#define ENt TRISB.F3
#endif
#ifndef RS
#define RS PORTB.F2
#endif
#ifndef RSt
#define RSt TRISB.F2
#endif
#define Lcd_Pos(F,C) Lcd_comando(0x80+(F)*0x40+(C))
#define Lcd_printf(F,C,Cadena) Lcd_Pos(F,C);Lcd_print(Cadena);
#define Lcd_printfc(F,C,Cadena) Lcd_Pos(F,C);Lcd_printc(Cadena);
char guarda_tris;
void Lcd_escribe(char dato){
guarda_tris=data_tris;
data_tris=data_tris & 0x0f;
data_port=dato & 0xf0 | data_port & 0x0f;
EN=1;
Delay_80us();
EN=0;
data_tris=guarda_tris;}
void Lcd_envia(char dato){
Lcd_escribe(dato);
asm swapf FARG_Lcd_envia,1;
Lcd_escribe(dato);
Delay_80us();}
void Lcd_comando(char comando){
RS=0;
Lcd_envia(comando);
if(comando==1)Ret_ms(2);}
void Lcd_caracter(char caracter){
RS=1;
Lcd_envia(caracter);}
void Lcd_Inicia(){
RSt=0;
ENt=0;
EN=0;
RS=0;
Ret_ms(20);
Lcd_escribe(0x30);
Ret_ms(5);
Lcd_escribe(0x30);
Delay_500us();
Lcd_escribe(0x30);
Delay_500us();
Lcd_escribe(0x20);
Lcd_comando(0x28);
Lcd_comando(LCD_CLEAR);
Lcd_comando(LCD_FIRST_ROW);}
void lcd_print(char *cadena){
do{
Lcd_caracter(*cadena++);
asm{MOVF FARG_Lcd_caracter,0
BTFSS STATUS, Z}
}while(1);}
void lcd_printc(const char *cadena){
do{
Lcd_caracter(*cadena++);
asm{MOVF FARG_Lcd_caracter,0
BTFSS STATUS, Z}
}while(1);}
#ifndef column_port
#define column_port PORTB
#endif
#ifndef row_port
#define row_port PORTB
#endif
const char Teclas[4][4]={{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'c','0','=','+'}};
char Keypad_polling(){
char i,j,lu;
row_port=0xE;
for (i=0;i<4;i++){
Delay_10us();
lu=PORTA;
if ((lu & 0xf) != 0xf){
for(j=0;j<4;j++){
if(lu.F0==0) return Teclas[j][i];
lu=lu>>1;}}
row_port=row_port<<1 | 0x10;}}
char column;
char Keypad_liberar(){
char i=0,j=0;
column_port=0;
while(column_port==0XF0);
Delay_500us();
column=column_port | 0x0F;
for(row_port |= 0xE;(column_port&0xf0)==0xf0;row_port=row_port<<1 | 1,i++);
for(;column.F4!=0;column=column>>1,j++);
column_port = 0;
while(column_port!=0xf0);
return Teclas[j][i];}