Autor Tema: LCD modo 4 bits  (Leído 3023 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado morelius21

  • PIC12
  • **
  • Mensajes: 55
LCD modo 4 bits
« en: 03 de Abril de 2014, 07:59:35 »
Hola,

Estoy adaptando la librería de henry Laredo y no acab de funcionar. Quiero enviar a al LCD una simple A pero no hay manera.

Adjunto el código por si alguien me puede hechar una mano.

Saludos y gracias

Código: [Seleccionar]
#include <msp430.h>
#include <intrinsics.h>


//defineixo pins
#define DataBus P1OUT
#define D4        BIT4
#define D5        BIT5
#define D6        BIT6
#define D7        BIT7

#define DataCnt P2OUT
#define E     BIT2
#define Rw BIT1
#define Rs       BIT0

//defineixo Port
#define DataPort P1DIR
#define CntPort P2DIR


// Configuracion del Display y cursor
#define DON 0x0F//0b0000 1111  // Display encendido
#define DOFF 0x0B//0b0000 1011  // Display apagado
#define CURSOR_HOME 0x02//0b0000 0010  // Cursor encendido
#define CURSOR_ON 0x0F//0b0000 1111  // Cursor encendido
#define CURSOR_OFF 0x0D//0b0000 1101  // Cursor apagado
#define BLINK_ON 0x0F//0b0000 1111  // Cursor con parpadeo
#define BLINK_OFF 0x0E//0b0000 1110  // Cursor sin parpadeo
#define CLEAR 0x01//0b0000 0001  // Display encendido

// Modo de entrada
#define INCREMENT 0x06//0b0000 0110  // Incrementa la posicion del cursor
#define DECREMENT 0x04//0b0000 0100  // Decrementa la posicion del cursor

// Configuracion de los desplazamientos del cursor y del Display
#define SHIFT_CUR_LEFT 0x13//0b0001 0011  // Corrimiento del cursor a la izquierda
#define SHIFT_CUR_RIGHT 0x17//0b0001 0111  // Corrimiento del cursor a la derecha
#define SHIFT_DISP_LEFT 0x1B//0b0001 1011  // Corrimiento del display a la izquierda
#define SHIFT_DISP_RIGHT 0x1F//0b0001 1111  // Corrimiento del display a la derecha

// Funciones de inicializacion
#define NIBLE 0x02//0b0000 0010  // interface a 4 bits
#define FOUR_BIT 0x2F//0b0010 1111  // Interface a 4-bit
#define EIGHT_BIT 0x3F//0b0011 1111  // Interface a 8-bit
#define LINE_5X7 0x33//0b0011 0011  // Una linea, caracter 5x7
#define LINE_5X10 0x37//0b0011 0111  // Una linea, caracter 5x10
#define LINES_5X7 0x3B//0b0011 1011  // Dos lineas. character 5x7

// Lineas de trabajo
#define DDRAM_LINEA_1 0x80//0b1000 0000 // Linea 1 //0x80 + x = y , x
#define DDRAM_LINEA_2 0xC0//0b1100 0000 // Linea 2 //0xB0 + x = y , x
//#define DDRAM_LINEA_3 0b10010100 // Linea 3
//#define DDRAM_LINEA_4 0b11010100 // Linea 4


//Prototips funcions

void LcdInit(void);//Funcio que reset e inicialitza LCD
void LcdSendData(unsigned char salida);
void LcdToggleEnable(void);
void LcdWaitBusy(void);
void LcdComando(unsigned char dato);
void LcdChar(unsigned char dato);

/*
 * main.c
 */
int main(void) {
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer


    BCSCTL1 = CALBC1_1MHZ;// Use 1Mhz cal data for DCO
    DCOCTL = CALDCO_1MHZ;// Use 1Mhz cal data for DCO

    LcdInit();

LcdChar(0x41);  //envio una A.

while(1){



}
}



void LcdInit(void){

DataPort |= (D4 + D5 + D6 + D7);
CntPort |= (E + Rs + Rw);
DataBus=0x00;
DataCnt &=~ (E + Rs + Rw);

 __delay_cycles(15000);//15mseg


 LcdSendData(0x03); //function set
 LcdToggleEnable();
 __delay_cycles(15000);//15mseg

 LcdSendData(0x03); //function set
 LcdToggleEnable();
 __delay_cycles(15000);//15mseg

 LcdSendData(0x03); //function set
 LcdToggleEnable();

 LcdSendData(0x02); //function set 4 bits long
 LcdToggleEnable();
 LcdWaitBusy();

 LcdComando(LINES_5X7 & FOUR_BIT);
 LcdComando(DON & CURSOR_ON & BLINK_ON);
 LcdComando(INCREMENT);
 LcdComando(CLEAR);
 __delay_cycles(15000);//15mseg
}

void LcdSendData(unsigned char salida){

DataBus &=~ (D4 + D5 + D6 + D7);   //bits lcd en 0

 if((salida&0x01)==0x01){
 DataBus |= D4;
 }
 if((salida&0x02)==0x02){
 DataBus |= D5;
 }
 if((salida&0x04)==0x04){
 DataBus |= D6;
 }
 if((salida&0x08)==0x08){
 DataBus |= D7;
 }
}

void LcdWaitBusy(void){
unsigned char status;
DataPort &=~ (D4 + D5 + D6 + D7);
DataCnt &=~ Rs;
DataCnt |= Rw;

do{
LcdToggleEnable();
status = (P1IN & 0x80);
LcdToggleEnable();
}while(status == 0x80);

DataCnt &=~ (Rw + Rs);
DataPort |= (D4 + D5 + D6 + D7);
}

void LcdToggleEnable(void){

DataCnt &=~E;
asm(" NOP");
DataCnt |= E;
asm(" NOP");
}

void LcdComando(unsigned char dato){

  unsigned char aux;
  aux = dato; // Respaldo del dato original
  dato = dato >> 4; // Corrimiento del nible alto

  LcdSendData(dato);
  DataCnt &=~ (Rs + Rw);
  LcdToggleEnable();

  LcdSendData(aux);
  DataCnt &=~ (Rs + Rw);
  LcdToggleEnable();
  LcdWaitBusy();
}
void LcdChar(unsigned char dato)
{
  unsigned char aux;
  aux = dato; // Respaldo del dato original
  dato = dato >> 4; // Corrimiento del nible alto

  LcdSendData(dato);
  DataCnt &=~ Rw;
  DataCnt |=  Rs ;
  LcdToggleEnable();

  LcdSendData(aux);
   DataCnt &=~ Rw;
   DataCnt |=  Rs ;
  LcdToggleEnable();
  LcdWaitBusy();
}



« Última modificación: 03 de Abril de 2014, 14:54:50 por morelius21 »