#include <p30f4012.h>
#include <qei.h>
/******************Puertos***************************************/
#define LCD_D1 LATEbits.LATE2 //
#define LCD_D2 LATEbits.LATE3 //Macros para los puertos
#define LCD_D3 LATEbits.LATE4 //Que tendran la interconexion
#define LCD_D4 LATEbits.LATE5 //
#define LCD_RS LATEbits.LATE0
#define LCD_EN LATEbits.LATE1
#define LCD_LED LATDbits.LATD0
#define LCD_D1_TRIS TRISEbits.TRISE2
#define LCD_D2_TRIS TRISEbits.TRISE3
#define LCD_D3_TRIS TRISEbits.TRISE4
#define LCD_D4_TRIS TRISEbits.TRISE5
#define LCD_RS_TRIS TRISEbits.TRISE0
#define LCD_EN_TRIS TRISEbits.TRISE1
#define LCD_LED_TRIS TRISDbits.TRISD0
/******************Comandos************************/
#define LCD_CLR 0x01 // Clear Display
#define LCD_HOME 0x02 // Cursor to Home position
#define CURSOR_DIRECCTION_Increment 0x6 //
#define CURSOR_DIRECCTION_Decrement 0x4 // Entry mode set
#define Accompanies_display_shift 0x5 //ejemplo: LCD_CMD( CURSOR_DIRECCTION_Decrement | NO_Accompanies_display_shift );
#define No_Accompanies_display_shift 0x4 //
#define DISPLAY_ON 0x0C //
#define DISPLAY_OFF 0x08 //
#define CURSOR_ON 0x0A // Display on/off control
#define CURSOR_OFF 0x08 // ejemplo: LCD_CMD( DISPLAY_ON | CURSOR_ON | CURSOR_BLINKING_OFF );
#define CURSOR_BLINKING_ON 0x09 //
#define CURSOR_BLINKING_OFF 0x08 //
#define Display_shift 0x18 //
#define Cursor_move 0x10 //Cursor or display shift
#define Shift_to_the_right 0x14 //ejemplo: LCD_CMD( Cursor_move | Shift_to_the_left );
#define Shift_to_the_left 0x10 //
/***************Movimiento del cursor***************/
#define LCD_linea1 0x80
#define LCD_linea2 0xC0
/**************************************************/
/***************Fuses de configuracion*************/
_FOSC(CSW_FSCM_OFF&XT_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF&MCLR_DIS);
_FGS(CODE_PROT_OFF);
/******************Prototipos de funciones***********/
void MsDelay(int x);
void USDelay(int x);
void LCD_INIT(void);
void LCD_NIBBLE_OUT(unsigned char c);
void LCD_STROBE(void);
void LCD_CLEAR();
void LCD_CMD(char c);
void LCD_STRING(char *s);
void LCD_CHAR(unsigned char c);
void LCD_GOTO(char line, char posicion);
void LCD_PUTUN (unsigned char Digitos , unsigned long valor);
/************* START OF MAIN FUNCTION ***************/
int main ( void ){
DisableIntADC;
ADPCFG=0xFF;
LCD_LED=1;
ConfigIntQEI(QEI_INT_DISABLE&QEI_INT_PRI_2);
POSCNT = 0;
OpenQEI(QEI_DIR_SEL_QEB &
QEI_INDEX_RESET_DISABLE &
QEI_INPUTS_NOSWAP &
QEI_MODE_x2_PULSE ,0
);
LCD_INIT();
LCD_GOTO(1,1);
LCD_STRING("Pulsos");
while(1){
LCD_GOTO(2,6);
LCD_PUTUN(7,POSCNT);
}
}
/***********Retardo para microsegundos**********/
void USDelay(int x){
while(x!=0){
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop(); Nop();
Nop();
x--;
}
return;
}
/***************Funcion de milisegundos****************/
void MsDelay(int x){
while(x!=0){
USDelay(1000);
x--;
}
}
/**************Escribir un Nibble*********************/
void LCD_NIBBLE_OUT(unsigned char c){
LCD_D1=c; c>>=1;
LCD_D2=c; c>>=1;
LCD_D3=c; c>>=1;
LCD_D4=c;
LCD_STROBE();
}
/***********Activar el LCD para leer el dato**********/
void LCD_STROBE(void){
LCD_EN=1;
USDelay(1);
LCD_EN=0;
}
/**************Inicializar la pantalla de LCD************/
void LCD_INIT(void){
LCD_LED_TRIS=0;
LCD_RS_TRIS=0; //Seleccion de registro
LCD_EN_TRIS=0; //Enable
LCD_D1_TRIS=0; //
LCD_D2_TRIS=0; // Puertos para enviar
LCD_D3_TRIS=0; // los datos
LCD_D4_TRIS=0; //
LCD_RS=0;
MsDelay(20);
LCD_NIBBLE_OUT(0x02);
USDelay(100);
LCD_CMD(0x28);
LCD_CMD(0x28);
LCD_CMD(DISPLAY_OFF);
LCD_CMD(DISPLAY_ON | CURSOR_OFF | CURSOR_BLINKING_OFF);
LCD_CMD(CURSOR_DIRECCTION_Increment | No_Accompanies_display_shift);
LCD_CLEAR();
}
/*************lIMPIAR LA PANTALLA********************/
void LCD_CLEAR(){
LCD_CMD(LCD_CLR);
MsDelay(3);
}
/*************Escribir 1 byte al LCD*****************/
void LCD_WRITE(unsigned char c){
LCD_NIBBLE_OUT(c>>4);
LCD_NIBBLE_OUT(c);
USDelay(50);
}
/**************Escribir un caracter*******************/
void LCD_CHAR(unsigned char c){
LCD_RS=1;
LCD_WRITE(c);
}
/************Enviar un comando************************/
void LCD_CMD(char c){
LCD_RS=0;
LCD_WRITE(c);
}
/************Enviar una cadena de caracteres*************/
void LCD_STRING(char *s){
LCD_RS=1;
while(*s)
LCD_WRITE(*s++);
}
/********************Funcion ir a****************/
void LCD_GOTO(char line, char pos){
switch(line){
case 1: LCD_CMD((LCD_linea1-1)+pos);
break;
case 2: LCD_CMD((LCD_linea2-1)+pos);
break;
}
}
/****************************************/
/* Escribe Valor numerico al LCD */
/* Max 1 a 9 digitos */
/* ceros a la izquierda blancos */
/* puno de miles y millones */
/****************************************/
/* ejemplo : 341.000.780 1.886 23 */
void LCD_PUTUN (unsigned char Digitos , unsigned long valor) {
unsigned char t1,i,wrote;
unsigned long k=0;
wrote=0;
for (i=Digitos-1; i>=1; i--){
switch(i){
case 8: k=100000000;
break;
case 7: k=10000000;
break;
case 6: k=1000000;
break;
case 5: k=100000;
if (Digitos > 6){
if (wrote==1){
LCD_CHAR(' ');
}
else {
LCD_CHAR(' ');
}
} // millones
break;
case 4: k=10000;
break;
case 3: k=1000;
break;
case 2: k=100;
if (Digitos > 3){
if (wrote==1){
LCD_CHAR(' ');
}
else {
LCD_CHAR(' ');
}
} // miles
break;
case 1: k=10;
}
t1=valor/k;
if((wrote)||(t1!=0)){
LCD_CHAR(t1+'0');
wrote=1;
}
else LCD_CHAR(' '); // Ceros izquierda blanco
valor-=(t1*k);
}
LCD_CHAR( valor +'0');
}