This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

STM32 driver for K0108 GLCD controller

Hi
I am looking for STM32 driver for KS0108 GLCD controller. Any body used ever??
I have downloaded one from en.radzio.dxp.pl/.../ It is puzzling for me that D/I pin is not defined??
I change the code like below in main low level library file:
I see some signals on scope but nothing on the LCD!

//lcd_pin_function.h

//LCD data port
#define    DP_0      GPIO_Pin_0   //PC0
#define    DP_1      GPIO_Pin_1   //PC1
#define    DP_2      GPIO_Pin_2   //PC2
#define    DP_3      GPIO_Pin_3   //PC3
#define    DP_4      GPIO_Pin_6   //PC6
#define    DP_5      GPIO_Pin_7   //PC7
#define    DP_6      GPIO_Pin_8   //PC8
#define    DP_7      GPIO_Pin_9   //PC9
//lcd control port
#define    CS1       GPIO_Pin_10   //PB10
#define    CS2       GPIO_Pin_11   //PB11
#define    CS3       GPIO_Pin_12   //PB12
#define    RS        GPIO_Pin_13   //PB13
#define    RW        GPIO_Pin_14   //PB14
#define    EN        GPIO_Pin_15   //PB15

#define SET_DP0 GPIO_SetBits(GPIOC, DP_0);
#define SET_DP1 GPIO_SetBits(GPIOC, DP_1);
#define SET_DP2 GPIO_SetBits(GPIOC, DP_2);
#define SET_DP3 GPIO_SetBits(GPIOC, DP_3);
#define SET_DP4 GPIO_SetBits(GPIOC, DP_4);
#define SET_DP5 GPIO_SetBits(GPIOC, DP_5);
#define SET_DP6 GPIO_SetBits(GPIOC, DP_6);
#define SET_DP7 GPIO_SetBits(GPIOB, DP_7);

#define RESET_DP0 GPIO_ResetBits(GPIOC, DP_0);
#define RESET_DP1 GPIO_ResetBits(GPIOC, DP_1);
#define RESET_DP2 GPIO_ResetBits(GPIOC, DP_2);
#define RESET_DP3 GPIO_ResetBits(GPIOC, DP_3);
#define RESET_DP4 GPIO_ResetBits(GPIOC, DP_4);
#define RESET_DP5 GPIO_ResetBits(GPIOC, DP_5);
#define RESET_DP6 GPIO_ResetBits(GPIOC, DP_6);
#define RESET_DP7 GPIO_ResetBits(GPIOB, DP_7);

#define SET_CS1 GPIO_SetBits(GPIOB, CS1);
#define SET_CS2 GPIO_SetBits(GPIOB, CS2);
#define SET_CS3 GPIO_SetBits(GPIOB, CS3);
#define SET_RS GPIO_SetBits(GPIOB, RS);
#define SET_RW GPIO_SetBits(GPIOB, RW);
#define SET_EN GPIO_SetBits(GPIOB, EN);

#define RESET_CS1 GPIO_ResetBits(GPIOB, CS1);
#define RESET_CS2 GPIO_ResetBits(GPIOB, CS2);
#define RESET_CS3 GPIO_ResetBits(GPIOB, CS3);
#define RESET_RS GPIO_ResetBits(GPIOB, RS);
#define RESET_RW GPIO_ResetBits(GPIOB, RW);
#define RESET_EN GPIO_ResetBits(GPIOB, EN);

#define Read_DP_0 GPIO_ReadOutputDataBit(GPIOC,DP_0)
#define Read_DP_1 GPIO_ReadOutputDataBit(GPIOC,DP_1)
#define Read_DP_2 GPIO_ReadOutputDataBit(GPIOC,DP_2)
#define Read_DP_3 GPIO_ReadOutputDataBit(GPIOC,DP_3)
#define Read_DP_4 GPIO_ReadOutputDataBit(GPIOC,DP_4)
#define Read_DP_5 GPIO_ReadOutputDataBit(GPIOC,DP_5)
#define Read_DP_6 GPIO_ReadOutputDataBit(GPIOC,DP_6)
#define Read_DP_7 GPIO_ReadOutputDataBit(GPIOB,DP_7)

#define Read_Dataport (Read_DP_0<<0 |Read_DP_1<<1 |Read_DP_2<<2 |Read_DP_3<<3 |Read_DP_4<<4 |Read_DP_5<<5 |Read_DP_6<<6 |Read_DP_7<<7)
void Set_Dataport(unsigned char Data);
void GLCD_InitializePorts(void);
//-------------------------------------------------------------------------------------------------
// Universal KS0108 driver library
// STM32 MCU low-level driver
// (c) Rados³aw Kwiecieñ, radek@dxp.pl
//-------------------------------------------------------------------------------------------------
//#include "stm32f10x_lib.h"
#include "stm32l1xx.h"
#include "lcd_pin_function.h"



#define DISPLAY_STATUS_BUSY 0x80
extern unsigned char screen_x; extern unsigned char screen_y;
GPIO_InitTypeDef GPIO_InitStructure;
void Set_Dataport(unsigned char Data) {
GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = DP_0|DP_1|DP_2|DP_3|DP_4|DP_5|DP_6|DP_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL ; GPIO_Init(GPIOC, &GPIO_InitStructure);
if (Data & 1<<0) GPIO_SetBits(GPIOC, DP_0); else GPIO_ResetBits(GPIOC, DP_0); if (Data & 1<<1) GPIO_SetBits(GPIOC, DP_1); else GPIO_ResetBits(GPIOC, DP_1); if (Data & 1<<2) GPIO_SetBits(GPIOC, DP_2); else GPIO_ResetBits(GPIOC, DP_2); if (Data & 1<<3) GPIO_SetBits(GPIOC, DP_3); else GPIO_ResetBits(GPIOC, DP_3); if (Data & 1<<4) GPIO_SetBits(GPIOC, DP_4); else GPIO_ResetBits(GPIOC, DP_4); if (Data & 1<<5) GPIO_SetBits(GPIOC, DP_5); else GPIO_ResetBits(GPIOC, DP_5); if (Data & 1<<6) GPIO_SetBits(GPIOC, DP_6); else GPIO_ResetBits(GPIOC, DP_6); if (Data & 1<<7) GPIO_SetBits(GPIOC, DP_7); else GPIO_ResetBits(GPIOB, DP_7); }
void Reset_Dataport(unsigned char Data) { GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = DP_0|DP_1|DP_2|DP_3|DP_4|DP_5|DP_6|DP_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL ; GPIO_Init(GPIOC, &GPIO_InitStructure);
if (Data & 1<<0) GPIO_ResetBits(GPIOC, DP_0); //else GPIO_ResetBits(GPIOC, DP_0); if (Data & 1<<1) GPIO_ResetBits(GPIOC, DP_1); //else GPIO_ResetBits(GPIOC, DP_1); if (Data & 1<<2) GPIO_ResetBits(GPIOC, DP_2); //else GPIO_ResetBits(GPIOC, DP_2); if (Data & 1<<3) GPIO_ResetBits(GPIOC, DP_3); //else GPIO_ResetBits(GPIOC, DP_3); if (Data & 1<<4) GPIO_ResetBits(GPIOC, DP_4); //else GPIO_ResetBits(GPIOC, DP_4); if (Data & 1<<5) GPIO_ResetBits(GPIOC, DP_5); //else GPIO_ResetBits(GPIOC, DP_5); if (Data & 1<<6) GPIO_ResetBits(GPIOC, DP_6); //else GPIO_ResetBits(GPIOC, DP_6); if (Data & 1<<7) GPIO_ResetBits(GPIOC, DP_7); //else GPIO_ResetBits(GPIOB, DP_7); }
//------------------------------------------------------------------------------------------------- // Delay function /for 8MHz/ //------------------------------------------------------------------------------------------------- void GLCD_Delay(void) { // asm("nop");asm("nop");asm("nop");asm("nop"); __nop();__nop();__nop();__nop(); } //------------------------------------------------------------------------------------------------- // Enalbe Controller (0-2) //------------------------------------------------------------------------------------------------- void GLCD_EnableController(unsigned char controller) { switch(controller){ case 0 : RESET_CS1; break; case 1 : RESET_CS2; break; case 2 : RESET_CS3; break; } } ...

  • the rest of the code is:

    //-------------------------------------------------------------------------------------------------
    // Disable Controller (0-2)
    //-------------------------------------------------------------------------------------------------
    void GLCD_DisableController(unsigned char controller)
    {
    switch(controller){
            case 0 : SET_CS1; break;
            case 1 : SET_CS2; break;
            case 2 : SET_CS3; break;
            }
    }
    //-------------------------------------------------------------------------------------------------
    // Read Status byte from specified controller (0-2)
    //-------------------------------------------------------------------------------------------------
    unsigned char GLCD_ReadStatus(unsigned char controller)
    {
    unsigned char status;
    
    SET_RW;
    RESET_RS;
    GLCD_EnableController(controller);
    GLCD_Delay();
    SET_EN;
    GLCD_Delay();
    status = (Read_Dataport & 0xFF);
    RESET_EN;
    GLCD_DisableController(controller);
    return status;
    }
    //-------------------------------------------------------------------------------------------------
    // Write command to specified controller
    //-------------------------------------------------------------------------------------------------
    void GLCD_WriteCommand(unsigned char commandToWrite, unsigned char controller)
    {
    while(GLCD_ReadStatus(controller)&DISPLAY_STATUS_BUSY);
      GPIO_StructInit(&GPIO_InitStructure);
            GPIO_InitStructure.GPIO_Pin = DP_0|DP_1|DP_2|DP_3|DP_4|DP_5|DP_6|DP_7;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
            GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
            GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL ;
            GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    RESET_RS; RESET_RW;
    GLCD_Delay();
    GLCD_EnableController(controller);
    GLCD_Delay();
    Set_Dataport(commandToWrite);
    commandToWrite ^= 0xFF;
    Reset_Dataport(commandToWrite);
    GLCD_Delay();
    SET_EN;
    GLCD_Delay();
    RESET_EN;
    GLCD_Delay();
    GLCD_DisableController(controller);
    }
    
    //-------------------------------------------------------------------------------------------------
    // Read data from current position
    //-------------------------------------------------------------------------------------------------
    unsigned char GLCD_ReadData(void)
    {
    unsigned char tmp;
    while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);
    //  GPIO_StructInit(&GPIO_InitStructure);
    //      GPIO_InitStructure.GPIO_Pin = DP_0|DP_1|DP_2|DP_3|DP_4|DP_5|DP_6|DP_7;
    //      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    //      GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    
    SET_RS; SET_RW;
    
    GLCD_EnableController(screen_x / 64);
    GLCD_Delay();
    SET_EN;
    GLCD_Delay();
    tmp = (Read_Dataport & 0xFF);
    RESET_EN;
    GLCD_DisableController(screen_x / 64);
    screen_x++;
    return tmp;
    }
    //-------------------------------------------------------------------------------------------------
    // Write data to current position
    //-------------------------------------------------------------------------------------------------
    void GLCD_WriteData(unsigned char dataToWrite)
    {
    while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);
      GPIO_StructInit(&GPIO_InitStructure);
            GPIO_InitStructure.GPIO_Pin = DP_0|DP_1|DP_2|DP_3|DP_4|DP_5|DP_6|DP_7;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
            GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
            GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
            GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    RESET_RW;
    GLCD_Delay();
    SET_RS;
    GLCD_Delay();
    Set_Dataport(dataToWrite);
    dataToWrite ^= 0xFF;
    Reset_Dataport(dataToWrite);
    GLCD_Delay();
    GLCD_EnableController(screen_x / 64);
    GLCD_Delay();
    SET_EN;
    GLCD_Delay();
    RESET_EN;
    GLCD_Delay();
    GLCD_DisableController(screen_x / 64);
    screen_x++;
    }
    //-------------------------------------------------------------------------------------------------
    //
    //-------------------------------------------------------------------------------------------------
    void GLCD_InitializePorts(void)
    {
    int i;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
    
    
      GPIO_StructInit(&GPIO_InitStructure);
            GPIO_InitStructure.GPIO_Pin = DP_0|DP_1|DP_2|DP_3|DP_4|DP_5|DP_6|DP_7;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
            GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
            GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL ;
            GPIO_Init(GPIOC, &GPIO_InitStructure);
    
            GPIO_StructInit(&GPIO_InitStructure);
            GPIO_InitStructure.GPIO_Pin = CS1|CS2|CS3|RS|EN|RW;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
            GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
            GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL ;
            GPIO_Init(GPIOB, &GPIO_InitStructure);
    }
    //-------------------------------------------------------------------------------------------------
    //
    //-------------------------------------------------------------------------------------------------
    unsigned char GLCD_ReadByteFromROMMemory(char * ptr)
    {
      return *(ptr);
    }
    //-------------------------------------------------------------------------------------------------
    //
    //-------------------------------------------------------------------------------------------------
    
    

  • Did you solve this problem ?
    Please, tell how to fix it, if you know how to solve it, cause i got the same problem.