Buenos dias
Sigo molestando con el control del LCD con el puerto B, les dejo unas imagenes de la simulaion y el codigo para ver si alguien encuentra algo incorrecto, ya lo probe en protoboard y pasa lo mismo.
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
// CONFIGURACION
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = ON // Data EEP ROM Memory Code Protection bit (Data EEPROM code-protected)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = ON // Flash Program Memory Code Protection bit (All program memory code-protected)
#pragma config DEBUG = OFF // Pogramacion in circuit desahablitado
//********************************************************************
#define _XTAL_FREQ 16000000 // Indicamos a que frecuencia de reloj esta funcionando el micro para retardos
//DEFINE ETIQUETAS DE BITS
#define RS RB0 // RS DEL LCD
#define RW RB1 // RW DEL LCD
#define E RB2 // E DEL LCD
#define D4 RB4 // BUS DE DATOS DEL 4 AL 7
#define D5 RB5 // DEL LCD
#define D6 RB6 //
#define D7 RB7 //
//********FIN ETIQUETAS***************************************
//********VARIABLES GLOBALES**********************************
unsigned char CONUNO; //REGISTRO DE TEMPORAL PARA CONTROL LCD
unsigned char CONDOS; //REGISTRO DE CONTROL LCD 8 BITS
const char TABLA [][17]={ //const PARA ALMACENAR VARIABLE EN LA MEMORIA DE PROGRAMA
"TIEMPO : ", //0
"AD/SULF : ", //1
"RAPIDA : ", //2
"LENTA : ", //3
"REPOSO : ", //4
"MANUAL rpm", //5
"RAMPA rpm", //6
" ! ALERTA ! ", //7
"PALETA ATASCADA", //8
" FIN TIEMPO ", //9
"PULSAR BOTON [<]", //10
" AUTOMATICO ", //11
" ", //12
"MANUAL PULSA [<]", //13
"AUTO PULSA 3s[-]", //14
" ", //15
" ", //16
"EQUIFAR ING.LTDA", //17
"PBX 7596983 BTA.", //18
" TEST DE JARRAS ", //19
" S/N 140415 ", //20
};
//**************************
//FUNCIONES O SUBRRUTINAS DECLARACION
void RETARDO(int TE); //FUNCION RETARDO EN uM MULMTIPLO DE 2
void CONTROL(); //FUNCION CONFIGURACION DEL LCD
void DATO(const char *BYTE); //FUNCION DATOS PARA LCD CON PUNTERO
//PROGRAMA PRINCIPAL
void main(void)
{
TRISC=0; //CONFIGURA PUERTO SALIDAS
PORTC=0; //LIMPIA PUERTO
TRISB=0; //CONFIGURA PUERTO SALIDAS
PORTB=0; //LIMPIA PUERTO
OPTION_REGbits.nRBPU=0;//RESISTENCIA PULL UP DESCONECTADA
RC3=1; //PONE A 1 BIT
RC1=0; //PONE A 0 BIT
//LCD CONFIGURACION INICIAL
PORTB=71; //LIMPIA PUERTO
RETARDO(10200); //RETARDO ESTABILIZAR LCD
CONUNO=0b00000010; //CARGA DATO PARA CURSOR EN LA PRIMERA POSICION DEL LCD
CONTROL(); //FUNCION PARA CONFIGURACION LCD
CONUNO=0b00101000; //TRANSFERENCIA DE INFORMACION A 4 BITS
CONTROL(); //FUNCION PARA CONFIGURACION LCD
CONUNO=0b00001100; //ACTIVA DISPLAY,ACTIVA CURSOR Y NO HAY PARPADEO
CONTROL(); //FUNCION PARA CONFIGURACION LCD
CONUNO=0b00000110; //AVANCE DERECHA Y DYSPLAY QUIETO
CONTROL(); //FUNCION PARA CONFIGURACION LCD
while (1)
{
RC3=!RC3; //NIEGA ESTADO DEL BIT
RC1=!RC1; //NIEGA ESTADO DEL BIT
RETARDO(160); //LLAMA FUNCION
RC3=!RC3; //NIEGA ESTADO DEL BIT
RC1=!RC1; //NIEGA ESTADO DEL BIT
RETARDO(40); //LLAMA FUNCION
//DATOS INICALES LCD
CONUNO=0b10000000; //COLOCA CURSOR EN LA PRIMERA FILA DEL LCD
CONTROL(); //FUNCION PARA CONFIGURACION LCD
RETARDO(25); //RETARDO ESTABILIZAR LCD
DATO(TABLA[13]); //TOMA DATOS DE LA TABLA COMO CADENA
CONUNO=0b11000000; //COLOCA CURSOR EN LA SEGUNA FILA DEL LCD
CONTROL(); //FUNCION PARA CONFIGURACION LCD
RETARDO(25); //RETARDO ESTABILIZAR LCD
DATO(TABLA[17]);
}
}
//****FIN PROGRAMA PRINCIPAL*************************************
// FUNCIONES O SUBRRUTINAS COMANDOS
void RETARDO(int TE)
{
unsigned int TP;
for (TP = TE; TP> 0;TP--)
{
__delay_us(2);
}
}
void CONTROL()
{
PORTB=CONUNO; //MANDO LOS 4 BITS MAS SIGNIFICATIVOS
RW=0; //HABILITA ESCRITURA DEL LCD
RS=0; //SELECCIONA REGISTRO DE CONTROL
E=1; //HABILITA LCD
RETARDO(1800); //RETARDO PARA ESTABILIZAR LCD
E=0; //DESHABILITA LCD
CONUNO=(CONUNO << 4) | (CONUNO >> 4);//INTERCAMBIO DE NIBLES
PORTB=CONUNO; //MANDO LOS 4 BITS MENOS SIGNIFICATIVOS
RW=0; //HABILITA ESCRITURA DEL LCD
RS=0; //SELECCIONA REGISTRO DE CONTROL
E=1; //HABILITA LCD
RETARDO(25); //RETARDO ESTABILIZAR LCD
E=0; //DESHABILITA LCD
return;
}
void DATO(const char *BYTE)
{
while (*BYTE) //MIENRAS SEA DIFERENTE DE NULL CONTINUA
{
PORTB=*BYTE; //MANDO LOS 4 BITS MAS SIGNIFICATIVOS
RW=0; //HABILITA ESCRITURA DEL LCD
RS=1; //SELECCIONA REGISTRO DE DATOS
E=1; //HABILITA LCD
RETARDO(1800); //RETARDO PARA ESTABILIZAR LCD
E=0; //DESHABILITA LCD
CONUNO=*BYTE;
CONUNO=(CONUNO << 4) | (CONUNO >> 4);//INTERCAMBIO DE NIBLES
PORTB=CONUNO; //MANDO LOS 4 BITS MENOS SIGNIFICATIVOS
RW=0; //HABILITA ESCRITURA DEL LCD
RS=1; //SELECCIONA REGISTRO DE DATOS
E=1; //HABILITA LCD
RETARDO(25); //RETARDO ESTABILIZAR LCD
E=0; //DESHABILITA LCD
BYTE++; //INCREMETA POSICION DE MEMORIA PARA ACCEDER AL DATO
}
}