TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: morelius21 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
#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();
}