I am trying to interface LCD 16x2 with STM32 for learning purpose. I already interfaced with AVR, PIC etc. that code ported some of. But its not working. What am I doing wrong? ` void LCD_init(void) { HAL_Delay(20); lcd_cmd(0x30); HAL_Delay(20); lcd_cmd(0x30); HAL_Delay(20); //Delay_Us(100); lcd_cmd(0x28); HAL_Delay(20); lcd_cmd(0x28); // Function set (4-bit interface, 2 lines, 5*7Pixels) lcd_cmd(0x28); // Function set (4-bit interface, 2 lines, 5*7Pixels) lcd_cmd(0x0c); // Make cursorinvisible lcd_Clear(); // Clear screen lcd_cmd(0x6); // Set entry Mode(auto increment of cursor) } oid lcd_cmd(__uint16_t cmd) { GPIOB->ODR =0; HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10, GPIO_PIN_RESET); cmd = (cmd << 8) ; GPIOB->ODR = (cmd & 0xf000); lcd_Strobe(); cmd = (cmd << 4) ; GPIOB->ODR = (cmd & 0xf000); lcd_Strobe(); GPIOB->ODR =0; } void lcd_data(__uint16_t lcd_data) { GPIOB->ODR =0x0000; // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10, GPIO_PIN_SET); lcd_data = (lcd_data << 8) ; GPIOB->ODR = (lcd_data& 0xf000)|0x400; lcd_Strobe(); GPIOB->ODR =0; lcd_data = (lcd_data << 4) ; GPIOB->ODR = (lcd_data & 0xf000)|0x400; lcd_Strobe(); GPIOB->ODR =0; } void lcd_Clear(void) { lcd_cmd(0x01); HAL_Delay(5); } void lcd_String(const char *ptr) // ptr pointing the address of displaying string { while (*ptr) // check weather the endo of file then exit the loop { lcd_data(*ptr++); // Sending data to LCD_data functions } } ` [![enter image description here][1]][1] [1]: https://i.sstatic.net/Ue8Hy.png