Problema de monitoreo de LCD gráfico 128 (TG12864B V1.1) (manejo desde STM32) [cerrado]

-2

Estoy intentando escribir un controlador para conducir GLCD 128x64. Pero todo lo que hice, no funciona. Pongo el código de abajo. ¿Qué está mal?.

editar Puedo escribir algunos caracteres, pero aparecieron píxeles aleatorios en la pantalla LCD. Estos píxeles vienen con el comando DISPLAY ON.

Archivo

.h siguiente ( editado )

#define RS_DI GPIO_Pin_0 
#define RW      GPIO_Pin_1
#define En      GPIO_Pin_2
#define DB0     GPIO_Pin_3
#define DB1     GPIO_Pin_4
#define DB2     GPIO_Pin_5
#define DB3     GPIO_Pin_6
#define DB4     GPIO_Pin_7
#define DB5     GPIO_Pin_8
#define DB6     GPIO_Pin_9
#define DB7     GPIO_Pin_10
#define CS1     GPIO_Pin_11
#define CS2     GPIO_Pin_12
#define RST     GPIO_Pin_13

#define DB_ALL_MASK (uint16_t)0x07F8


#define GLCD_DISPLAY_ON (uint8_t)0x3F
#define GLCD_DISPLAY_OFF(uint8_t) 0x3E

#define GLCD_SET_LINE_1 (uint8_t)0xB8
#define GLCD_SET_LINE_2 (uint8_t)0xB9
#define GLCD_SET_LINE_3 (uint8_t)0xBA
#define GLCD_SET_LINE_4 (uint8_t)0xBB
#define GLCD_SET_LINE_5 (uint8_t)0xBC
#define GLCD_SET_LINE_6 (uint8_t)0xBD
#define GLCD_SET_LINE_7 (uint8_t)0xBE
#define GLCD_SET_LINE_8 (uint8_t)0xBF

#define GLCD_SET_CURS_POS_0 (uint8_t)0x40


#define GLCD_SET_START_POS_0 (uint8_t)0xC0


typedef enum 
{
    Page1 = 0x00                ,
    Page2                               ,
    PageBothSelect          ,
    PageBothUnselect

}PageSelect;


void InitGLCDPort(GPIOSelect    GS);
void WriteCmdGLCD(uint8_t cmd);
void WriteDataGLCD(uint8_t Data);
void WriteCharGLCD(char *chr);
void WriteStringGLCD(char *str);
void WriteImageGLCD(char *pxl); 
void PageSelectGLCD(PageSelect PS); 
void SetCursorGLCD(uint8_t x,uint8_t y);

.c archivo siguiente ( editado )

    #include "_MyGraphLCD.h"



static GPIO_TypeDef* GPIOx;

// Private function declaretion

extern void delay_clk_cycle(unsigned int delay);
extern void SendByte(uint8_t Byte);


void InitGLCDPort(GPIOSelect    GS)
{
    InitGPIO(   GS,
                        GPIO_Mode_OUT,
                        GPIO_OType_PP,
                        GPIO_Speed_2MHz,
                        GPIO_PuPd_NOPULL,
                        GPIO_Pin_All);
    switch(GS){ 
        case sGPIOA:        GPIOx = GPIOA;          break;
        case sGPIOB:        GPIOx = GPIOB;          break;
        case sGPIOC:        GPIOx = GPIOC;          break;
        case sGPIOD:        GPIOx = GPIOD;          break;
        case sGPIOE:        GPIOx = GPIOE;          break;
        case sGPIOF:        GPIOx = GPIOF;          break;
        case sGPIOG:        GPIOx = GPIOG;          break;
        case sGPIOH:        GPIOx = GPIOH;          break;
        case sGPIOI:        GPIOx = GPIOI;          break;
        case sGPIOJ:        GPIOx = GPIOJ;          break;
        case sGPIOK:        GPIOx = GPIOK;          break;}
                GPIO_ResetBits(GPIOx,RST);
                delay_clk_cycle(1798562);
                GPIO_SetBits(GPIOx,RST);
                delay_clk_cycle(179857);
                PageSelectGLCD(PageBothSelect);
                delay_clk_cycle(179857);
                WriteCmdGLCD(GLCD_DISPLAY_ON);
                WriteCmdGLCD(GLCD_SET_START_POS_0);
                delay_clk_cycle(179857);
                PageSelectGLCD(PageBothUnselect);
                delay_clk_cycle(179857);







}

void WriteCmdGLCD(uint8_t cmd)
{
    SendByte(cmd);
    GPIOx->ODR &= ~(RS_DI);
    GPIOx->ODR &= ~(RW);
    GPIOx->ODR |=   En;
    delay_clk_cycle(179857);
    GPIOx->ODR &=   ~(En);
    delay_clk_cycle(20);

}


void WriteDataGLCD(uint8_t Data)
{
    SendByte(Data);
    GPIOx->ODR |= RS_DI;
    GPIOx->ODR &= ~(RW);
    GPIOx->ODR |=   En;
    delay_clk_cycle(179857);
    GPIOx->ODR &=   ~(En);
    delay_clk_cycle(20);


}
void PageSelectGLCD(PageSelect PS)
{
    switch(PS)
    {
        case Page1:
            GPIOx->ODR |= (CS1);
            GPIOx->ODR &= ~(CS2);

            break;
        case Page2:
            GPIOx->ODR &= ~(CS1);
            GPIOx->ODR |= (CS2);
            break;
        case PageBothSelect:
            GPIOx->ODR |= (CS1);
            GPIOx->ODR |= (CS2);
            break;
        case PageBothUnselect:
            GPIOx->ODR &= ~(CS1);
            GPIOx->ODR &= ~(CS2);
            break;
    }
}

void WriteCharGLCD(char *chr)
{
    volatile register uint8_t i;
    SetCursorGLCD(0,0);
    for(i=0;i<5;i++) 
    {
            WriteDataGLCD(*(chr+i));
    }
}
void WriteStringGLCD(char *str)
{

}
void WriteImageGLCD(char *pxl)
{

}
void SetCursorGLCD(uint8_t x,uint8_t y)
{
    WriteCmdGLCD(GLCD_SET_LINE_1+x);
    WriteCmdGLCD(GLCD_SET_CURS_POS_0+y);

}

// Private function 
void delay_clk_cycle(unsigned int delay)
{
    volatile register int i;
    for(i=0;i<delay;i++) 
    {
            __NOP();

    }
}
 void SendByte(uint8_t Data)
{
    GPIOx->ODR &= ~(0x00FF<<3);
    GPIOx->ODR |= Data<<3;
}
    
pregunta RageLog

1 respuesta

0
  

Puedo escribir algunos caracteres, pero aparecen píxeles aleatorios en la pantalla LCD. Estos píxeles vienen con el comando DISPLAY ON.

Este comportamiento es normal para muchos controladores LCD económicos. Deberá escribir en toda la pantalla después de restablecerla para borrarla.

    
respondido por el duskwuff

Lea otras preguntas en las etiquetas