/*
programa: EJEMPLO DE USO DE ARRAYS DE 1 y 2 dimensiones
pic 18f4550
crystal: 4 MHz CPU 4MHZ
CONEXIONES:
lcd conectado en PUERTO D
bus de datos en el nible alto conector idc D4a7
DATA7 PUERTO D.7
DATA6 PUERTO D.6
DATA5 PUERTO D.5
DATA4 PUERTO D.4
bus de control en el nible bajo conector idc rD0a3
E_PIN PUERTO D.3
RS_PIN PUERTO D.2
RW_PIN PUERTO D.1
*/
/*Includes globales*/
#include <p18F4550.h>
#include <stdlib.h>
#include <stdio.h>
#include <delays.h>
/*Includes locales*/
#include "xlcd_portd.h"
/* Bits de configuración*/
#pragma config FOSC = XT_XT, CPUDIV = OSC1_PLL2 // Cristal de 4 Mhz y Frecuencia de trabajo del CPU a 4Mhz
#pragma config FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF
#pragma config CPB = OFF,CPD = OFF
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF
#pragma config EBTRB = OFF
/********************** DEFINICIONES *********************/
#define CLOCK 4000000
#define TCY 4/CLOCK
#define BITRATE 100000
// 1 TCY se calcula como 4/fosc
// 1 TCY = X segundos ======> 4/4000000hz =0,000001s = 1us
// 1.000.000 de TCYs equivalen a 1 segundo.
// Delay10KTCYx(100)= 100*10000*TCY=1s
// Delay10KTCYx(100)= 100*10000*1us=1s
// Delay10KTCYx(10)= 100*10000*1us=100ms
#pragma romdata seccionAbcdario
const rom unsigned char My_Msnj[6][20] = {"Primera Linea",
"Segunda Linea",
"Tercera Linea",
"Cuarta Linea",
"Quinta Linea",
"Sexta Linea"
};
const rom unsigned char miCadena[10] = "JUKINCH"; // cadena para mostrar en lcd
#pragma romdata
/*declaración de funciones*/
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
void initlcd(void);
//******************************************************//
// Programa Principal
//******************************************************//
void main(void)
{
ADCON0 = 0X00,ADCON1 = 0X0F,CMCON = 0X07; //puerto A con todos los pines digitales
TRISA = 0X00;
TRISB = 0XFF;
TRISC = 0X00;
LATA = 0X00;
LATB = 0X00;
LATC = 0X00;
initlcd(); // inicializamos lcd
WriteCmdXLCD(LINE_0+0);
putrsXLCD(" MULTIBOARD");
WriteCmdXLCD(NEXT_LINE+0);
putrsXLCD("PIC TRAINER 2.0");
Delay10KTCYx(100); //Retardo para mostrar valor }
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
WriteCmdXLCD(LINE_0+0);
putrsXLCD("arrays de 1 y 2D");
WriteCmdXLCD(NEXT_LINE+0);
while(BusyXLCD()){}
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
Delay10KTCYx(100); //Retardo para mostrar valor }
/////////////// PRUEBA DE ESCRITURA DE ARRAY DE 1D con putrs y con putc ///////////////
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
WriteCmdXLCD(LINE_0+0);
putrsXLCD(miCadena); // escribe JUKINCH
WriteCmdXLCD(NEXT_LINE+0);
putcXLCD(*(miCadena+0)); // J
putcXLCD(*(miCadena+1)); // U
putcXLCD(*(miCadena+2)); // K
putcXLCD(*(miCadena+3)); // I
putcXLCD(*(miCadena+4)); // N
putcXLCD(*(miCadena+5)); // C
putcXLCD(*(miCadena+6)); // H
Delay10KTCYx(100); //Retardo para mostrar valor }
// PRUEBA DE ESCRITURA DE ARRAY DE 2D con putrs pasando My_Msnj, My_Msnj+1 y My_Msnj+2 //
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
WriteCmdXLCD(LINE_0+0);
putrsXLCD(My_Msnj); // escribe Primera Linea
WriteCmdXLCD(NEXT_LINE+0);
putrsXLCD(My_Msnj+1); // escribe Segunda Linea
Delay10KTCYx(100); //Retardo para mostrar valor
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
WriteCmdXLCD(LINE_0+0);
putrsXLCD(My_Msnj+2); // escribe Tercera Linea
Delay10KTCYx(100); //Retardo para mostrar valor
/////////////// PRUEBA DE ESCRITURA DE ARRAY DE 2D con aritmética de punteros ////
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
WriteCmdXLCD(LINE_0+0);
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+0)+0)); // P
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+0)+1)); // r
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+0)+2)); // i
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+0)+3)); // m
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+0)+4)); // e
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+0)+5)); // r
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+0)+6)); // a
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(' '); // espacio
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+2)+0)); // T
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+2)+1)); // e
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+2)+2)); // r
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+2)+3)); // c
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+2)+4)); // e
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+2)+5)); // r
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+2)+6)); // a
WriteCmdXLCD(NEXT_LINE+0);
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+4)+0)); // Q
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+4)+1)); // u
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+4)+2)); // i
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+4)+3)); // n
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+4)+4)); // t
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+4)+5)); // a
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(' '); // espacio
putcXLCD(' '); // espacio
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+5)+0)); // S
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+5)+1)); // e
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+5)+2)); // x
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+5)+3)); // t
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
putcXLCD(*(*(My_Msnj+5)+4)); // a
Delay10KTCYx(100); //Retardo para mostrar valor
/////////////// PRUEBA DE ESCRITURA DE ARRAY DE 2D con [][] ////
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
WriteCmdXLCD(LINE_0+0);
putrsXLCD(&My_Msnj[3][0]); // escribe Cuarta Linea
Delay10KTCYx(100); //Retardo para mostrar valor
while (1);
//*******************************************************
//*******************************************************
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++ F U N C I O N E S +++++++++++++++++++++++++++++++*/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/****************** Funciones de retardos para librería del lcd **************************************/
/*
* - The user must provide three delay routines:
* - DelayFor18TCY() provides a 18 Tcy delay
* - DelayPORXLCD() provides at least 15ms delay
* - DelayXLCD() provides at least 5ms delay
para aprender como se calcularon los delays de abajo ver el archivo:
"D:\My Dropbox\c18\delays - calculo de demoras\calculo de retardos ejemplos con varios cristales - leo.txt"
TCY se calcula como 4/fosc
donde fosc = frecuencia de trabajo del CPU
Ejemplo a velocidad de CPU de 4mhz
TCY = 4/4000000 = 0,000001s
1 TCY = 0,000001s
1s / 0,000001s = 1.000.000TCY
A 4mhz 1 Tcy equivale a 1 us =======> 20Tcy = 20us
***********************************************************************************************************/
// para velocidad de CPU de 4mhz descomentar el siguiente código y comentar el de 20mhz
void DelayFor18TCY(void)
{
Delay10TCYx(2); //provides a 20 Tcy delay.
}
void DelayPORXLCD(void)
{
Delay1KTCYx(15); //Delay 15 mSeg para CPU de 4mhz. 1 Tcy equivale a 1 us =======> 15000Tcy =15ms
}
void DelayXLCD(void)
{
Delay1KTCYx(5); // Delay 5 mSeg para CPU de 4mhz. 1 Tcy equivale a 1 us =======> 5000Tcy =5ms
}
// para velocidad de CPU de 20mhz descomentar el siguiente código y comentar el de 4mhz
/*
void DelayFor18TCY(void)
{
Delay10TCYx(2); //provides a 20 Tcy delay.
}
void DelayPORXLCD(void)
{
Delay1KTCYx(75); //Delay 15 mSeg para CPU de 20mhz. 1 Tcy equivale a 0,2us =======> 75000Tcy =15ms
}
void DelayXLCD(void)
{
Delay1KTCYx(25); // Delay 5 mSeg para CPU de 20mhz. 1 Tcy equivale a 0,2us =======> 25000Tcy =5ms
}
*/
/****************** fin de Funciones de retardos para librería del lcd *******************************/
/*************** función inicialización del lcd *****************************************************/
void initlcd(void)
{
Delay10KTCYx(10); //Retardo para esperar que pase cualquier transitorio
OpenXLCD(FOUR_BIT&LINES_5X7); //inicializamos LCD con varias lineas y caracteres 5x7
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
}
/*************** final función inicialización del lcd ***********************************************/