Please note: We are aware of an issue affecting replies on the Arm Community forums, which may not be loading as expected.
We apologize for any inconvenience and appreciate your patience while we investigate and work to resolve the issue.
Thank you for your understanding.
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); } //------------------------------------------------------------------------------------------------- // //-------------------------------------------------------------------------------------------------