Quiero conectar C2000 Piccolo LAUNCHXL-F28027 y LCD 1602A. Y ya encontré este ejemplo: enlace . Descargué el código fuente y conecté los pines como se muestra en el ejemplo, después de eso usé exactamente el mismo código:
#define RS GPIO_Number_12
#define E GPIO_Number_19
#define D0 GPIO_Number_0
#define D1 GPIO_Number_1
#define D2 GPIO_Number_2
#define D3 GPIO_Number_3
#define D4 GPIO_Number_4
#define D5 GPIO_Number_5
#define D6 GPIO_Number_16
#define D7 GPIO_Number_17
GPIO_Handle myGpio;
/* Initializes LCD */
void InitializeLCD(void)
{
GPIO_setHigh(myGpio, E);
LCDDelay1600();
LCDDelay1600();
LCDDelay1600();
LCDDelay1600();
WriteCommandLCD(0x38); //Command to select 8 bit interface
LCDDelay1600();
WriteCommandLCD(0x38); //Command to select 8 bit interface
LCDDelay(); //Small delay
WriteCommandLCD(0x38); //Command to select 8 bit interface
LCDDelay();
WriteCommandLCD(0x08); //Command to off cursor,display off
WriteCommandLCD(0x01); //Command to Clear LCD
LCDDelay1600();
WriteCommandLCD(0x06); //Command for setting entry mode
WriteCommandLCD(0x0f); //Command to on cursor,blink cursor
WriteCommandLCD(0x02); //Command return the cursor to home
LCDDelay1600();
DisplayLCD(1, "hello");
}
/* Writes a command byte to LCD */
void WriteCommandLCD(unsigned char CommandByte)
{
GPIO_setLow(myGpio, RS); //Clear RS pin to write command
SendByte(CommandByte);
LCDDelay(); //Small delay
}
/* Send a byte of data to LCD */
void SendByte(unsigned char Value)
{
unsigned char temp;
if((Value & 0x01) == 0x01)
GPIO_setHigh(myGpio, D0);
else
GPIO_setLow(myGpio, D0);
if((Value & 0x02) == 0x02)
GPIO_setHigh(myGpio, D1);
else
GPIO_setLow(myGpio, D1);
if((Value & 0x04) == 0x04)
GPIO_setHigh(myGpio, D2);
else
GPIO_setLow(myGpio, D2);
if((Value & 0x08) == 0x08)
GPIO_setHigh(myGpio, D3);
else
GPIO_setLow(myGpio, D3);
if((Value & 0x10) == 0x10)
GPIO_setHigh(myGpio, D4);
else
GPIO_setLow(myGpio, D4);
if((Value & 0x20) == 0x20)
GPIO_setHigh(myGpio, D5);
else
GPIO_setLow(myGpio, D5);
if((Value & 0x40) == 0x40)
GPIO_setHigh(myGpio, D6);
else
GPIO_setLow(myGpio, D6);
if((Value & 0x80) == 0x80)
GPIO_setHigh(myGpio, D7);
else
GPIO_setLow(myGpio, D7);
GPIO_setHigh(myGpio, E); //Set E pin to select LCD
for(temp=0;temp<5; temp++);
GPIO_setLow(myGpio, E); //Clear E pin to deselect LCD
LCDDelay(); //Small delay
}
/* Writes a Data byte to LCD */
void WriteDataLCD(unsigned char DataByte)
{
GPIO_setHigh(myGpio, RS); //Set RS pin to 1 to write Data
SendByte(DataByte);
LCDDelay(); //Small delay
}
/* Small delay */
void LCDDelay(void)
{
DELAY_US(500);
}
/* Big delay */
void LCDDelay1600(void)
{
DELAY_US(16000);
}
/* Makes cursor visible */
void CursorON(void)
{
WriteCommandLCD(0x0f); //Command to switch on cursor
}
/* Makes cursor invisible */
void CursorOFF(void)
{
WriteCommandLCD(0x0c); //Command to switch off cursor
}
/* Displays a message on LCD */
void DisplayLCD(char LineNumber,char *Message)
{
int a;
if(LineNumber ==1)
{ //First Line
WriteCommandLCD(0x80); //Select the first line
}
else
{ //Second line
WriteCommandLCD(0xc0); //Select the second line
}
for(a=0;a<16;a++)
{
WriteDataLCD(*Message); //Display a character
Message++; //Increment pointer
}
return;
}
void main(){
InitializeLCD();
}
Pero después de la ejecución de este código, absolutamente nada ha cambiado en la pantalla LCD: solo veo varios rectángulos en la primera línea (como en el caso del encendido después). Creo que es porque lm016l se usa en el ejemplo, pero yo uso 1602A . ¿Podría ser? En caso afirmativo, ¿qué funciones debo cambiar y exactamente cómo debo cambiarlas? Dame información completa si puedes, porque soy un principiante en esto y es muy difícil entender lo que necesito exactamente.
¡Gracias!
UPD:
Encontré un microcontrolador para el LCD 1602A, es KS0066U. Estoy en lo cierto Entonces, si es así, también encontré KS0066U hoja de datos con la "INICIALIZACIÓN POR INSTRUCCIÓN. 1) Modo de interfaz de 8 bits ... ", verifíquelo (página 26).
Usando esta instrucción, creé este código:
#define RS GPIO_Number_12
#define E GPIO_Number_19
#define D0 GPIO_Number_0
#define D1 GPIO_Number_1
#define D2 GPIO_Number_2
#define D3 GPIO_Number_3
#define D4 GPIO_Number_4
#define D5 GPIO_Number_5
#define D6 GPIO_Number_16
#define D7 GPIO_Number_17
GPIO_Handle myGpio1;
//...
void function_set(){
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setHigh(myGpio1, D5);
GPIO_setHigh(myGpio1, D4);
GPIO_setHigh(myGpio1, D3);
GPIO_setHigh(myGpio1, D2);
}
void display_control(){
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
GPIO_setHigh(myGpio1, D3);
GPIO_setHigh(myGpio1, D2);
GPIO_setHigh(myGpio1, D1);
GPIO_setHigh(myGpio1, D0);
}
void display_clear(){
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
GPIO_setLow(myGpio1, D3);
GPIO_setLow(myGpio1, D2);
GPIO_setLow(myGpio1, D1);
GPIO_setHigh(myGpio1, D0);
}
void entry_mode(){
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
GPIO_setLow(myGpio1, D3);
GPIO_setHigh(myGpio1, D2);
GPIO_setHigh(myGpio1, D1);
GPIO_setHigh(myGpio1, D0);
}
void main(void) {
myGpio1 = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));//default initialization
DELAY_US(31000);
function_set();
DELAY_US(1500);
display_control();
DELAY_US(1500);
display_clear();
DELAY_US(20300);
}
Pero tampoco cambia nada.
¿Qué me estoy perdiendo (tenga en cuenta que soy realmente un novato)?
UPD2: Nuevo código completo, pero aún no da nada:
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "clk.h"
#include "flash.h"
#include "gpio.h"
#include "pie.h"
#include "pll.h"
#include "wdog.h"
#include "LCD.h"
#include "Keypad.h"
#define RS GPIO_Number_12
#define E GPIO_Number_19
#define D0 GPIO_Number_0
#define D1 GPIO_Number_1
#define D2 GPIO_Number_2
#define D3 GPIO_Number_3
#define D4 GPIO_Number_4
#define D5 GPIO_Number_5
#define D6 GPIO_Number_16
#define D7 GPIO_Number_17
GPIO_Handle myGpio1;
void enable(void) //This enable E pin,whenever you send command/data to the pin
{
GPIO_setLow(myGpio1,E);
DELAY_US(1000);
GPIO_setHigh(myGpio1,E);
}
void function_set(void) //function set as you declared
{
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setHigh(myGpio1, D5);
GPIO_setHigh(myGpio1, D4);
GPIO_setHigh(myGpio1, D3);
GPIO_setHigh(myGpio1, D2);
}
void display_control(void)
{
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
GPIO_setHigh(myGpio1, D3);
GPIO_setHigh(myGpio1, D2);
GPIO_setHigh(myGpio1, D1);
GPIO_setHigh(myGpio1, D0);
}
void entry_mode(void) //entry mode to make increment or decrement DDRAM
{
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
GPIO_setLow(myGpio1, D3);
GPIO_setHigh(myGpio1, D2);
GPIO_setHigh(myGpio1, D1);
GPIO_setHigh(myGpio1, D0);
}
void clear_display(void) //clear the display
{
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
GPIO_setLow(myGpio1, D3);
GPIO_setLow(myGpio1, D2);
GPIO_setLow(myGpio1, D1);
GPIO_setHigh(myGpio1, D0);
}
void initialization(void){
GPIO_setPullUp(myGpio1, GPIO_Number_0, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_0);
GPIO_setMode(myGpio1, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_0, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_1, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_1);
GPIO_setMode(myGpio1, GPIO_Number_1, GPIO_1_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_1, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_2, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_2);
GPIO_setMode(myGpio1, GPIO_Number_2, GPIO_2_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_2, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_3, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_3);
GPIO_setMode(myGpio1, GPIO_Number_3, GPIO_3_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_3, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_4, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_4);
GPIO_setMode(myGpio1, GPIO_Number_4, GPIO_4_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_4, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_5, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_5);
GPIO_setMode(myGpio1, GPIO_Number_5, GPIO_5_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_5, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_16, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_16);
GPIO_setMode(myGpio1, GPIO_Number_16, GPIO_16_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_16, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_17, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_17);
GPIO_setMode(myGpio1, GPIO_Number_17, GPIO_17_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_17, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_12, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_12);
GPIO_setMode(myGpio1, GPIO_Number_12, GPIO_12_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_12, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_19, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_19);
GPIO_setMode(myGpio1, GPIO_Number_19, GPIO_19_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_19, GPIO_Direction_Output);
}
void main()
{
InitSysCtrl();
myGpio1 = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
initialization();
GPIO_setLow(myGpio1,E); //declare the enable pin as HIGH first
function_set();
enable(); //set this to enable the LED with given data to the pins
DELAY_US(50); //need some delay of 39us,roughly 50us
display_control(); //to customize the display you need
enable();
DELAY_US(50); //again need 39us ,roughly 50us
entry_mode();
enable(); //makes to enable the LED with given data
DELAY_US(50);
GPIO_setHigh(myGpio1,RS); //This displays letter A
GPIO_setHigh(myGpio1,D7);
GPIO_setLow(myGpio1,D6);
GPIO_setLow(myGpio1,D5);
GPIO_setLow(myGpio1,D4);
GPIO_setLow(myGpio1,D3);
GPIO_setLow(myGpio1,D2);
GPIO_setLow(myGpio1,D1);
GPIO_setHigh(myGpio1,D0);
enable();
DELAY_US(5000000);// letter A stays for 5 seconds in the display
clear_display(); //clears the display
DELAY_US(3000); //need to wait 1.39ms roughly 3ms
}
UPD3:
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "clk.h"
#include "flash.h"
#include "gpio.h"
#include "pie.h"
#include "pll.h"
#include "wdog.h"
#include "LCD.h"
#include "Keypad.h"
#define RS GPIO_Number_12
#define E GPIO_Number_19
#define D0 GPIO_Number_0
#define D1 GPIO_Number_1
#define D2 GPIO_Number_2
#define D3 GPIO_Number_3
#define D4 GPIO_Number_4
#define D5 GPIO_Number_5
#define D6 GPIO_Number_16
#define D7 GPIO_Number_17
GPIO_Handle myGpio1;
interrupt void xint1_isr(void);
void enabl(void) //This enable E pin,whenever you send command/data to the pin
{
GPIO_setLow(myGpio1,E);
DELAY_US(10000);
GPIO_setHigh(myGpio1,E);
}
void function_set(void) //function set as you declared
{
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setHigh(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000); //need some delay of 39us,roughly 50us
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setHigh(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000); //need some delay of 39us,roughly 50us
GPIO_setLow(myGpio1, RS);
GPIO_setHigh(myGpio1, D7);
GPIO_setHigh(myGpio1, D6);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000);
}
void display_control(void)
{
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000);
GPIO_setLow(myGpio1, RS);
GPIO_setHigh(myGpio1, D7);
GPIO_setHigh(myGpio1, D6);
GPIO_setHigh(myGpio1, D5);
GPIO_setHigh(myGpio1, D4);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000);
}
void display_clear(void) //clear the display
{
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000);
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setHigh(myGpio1, D4);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000);
}
void entry_mode(void) //entry mode to make increment or decrement DDRAM
{
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setLow(myGpio1, D6);
GPIO_setLow(myGpio1, D5);
GPIO_setLow(myGpio1, D4);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000);
GPIO_setLow(myGpio1, RS);
GPIO_setLow(myGpio1, D7);
GPIO_setHigh(myGpio1, D6);
GPIO_setHigh(myGpio1, D5);
GPIO_setHigh(myGpio1, D4);
DELAY_US(20000);
enabl(); //set this to enable the LED with given data to the pins
DELAY_US(20000);
}
void initialization(void){
GPIO_setPullUp(myGpio1, GPIO_Number_0, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_0);
GPIO_setMode(myGpio1, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_0, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_1, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_1);
GPIO_setMode(myGpio1, GPIO_Number_1, GPIO_1_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_1, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_2, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_2);
GPIO_setMode(myGpio1, GPIO_Number_2, GPIO_2_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_2, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_3, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_3);
GPIO_setMode(myGpio1, GPIO_Number_3, GPIO_3_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_3, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_4, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_4);
GPIO_setMode(myGpio1, GPIO_Number_4, GPIO_4_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_4, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_5, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_5);
GPIO_setMode(myGpio1, GPIO_Number_5, GPIO_5_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_5, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_16, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_16);
GPIO_setMode(myGpio1, GPIO_Number_16, GPIO_16_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_16, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_17, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_17);
GPIO_setMode(myGpio1, GPIO_Number_17, GPIO_17_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_17, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_12, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_12);
GPIO_setMode(myGpio1, GPIO_Number_12, GPIO_12_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_12, GPIO_Direction_Output);
GPIO_setPullUp(myGpio1, GPIO_Number_19, GPIO_PullUp_Enable);
GPIO_setLow(myGpio1, GPIO_Number_19);
GPIO_setMode(myGpio1, GPIO_Number_19, GPIO_19_Mode_GeneralPurpose);
GPIO_setDirection(myGpio1, GPIO_Number_19, GPIO_Direction_Output);
}
void main()
{
InitSysCtrl();
myGpio1 = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
initialization();
DELAY_US(20000);
GPIO_setHigh(myGpio1,E); //declare the enable pin as HIGH first
DELAY_US(20000);
function_set();
display_control(); //to customize the display you need
display_clear();
entry_mode();
GPIO_setHigh(myGpio1,RS); //This displays letter A
GPIO_setHigh(myGpio1,D7);
GPIO_setLow(myGpio1,D6);
GPIO_setLow(myGpio1,D5);
GPIO_setLow(myGpio1,D4);
GPIO_setLow(myGpio1,D3);
GPIO_setLow(myGpio1,D2);
GPIO_setLow(myGpio1,D1);
GPIO_setHigh(myGpio1,D0);
enabl();
DELAY_US(5000000);// letter A stays for 5 seconds in the display
display_clear(); //clears the display
DELAY_US(20000); //need to wait 1.39ms roughly 3ms
enabl();
}