0x38、0x0C、0x06、0x01 之間需延遲 > 4.1ms(功能設定)與 > 1.52ms(清屏)。
void lcd_write_cmd(uchar cmd) {
LCD_RS = 0; LCD_RW = 0;
LCD_DATA = cmd;
delay_us(1);
LCD_E = 1; delay_us(1);
LCD_E = 0; delay_us(1);
// 可選:輪詢 BF 直到為 0
}
void lcd_init() {
delay_ms(20); // 上電穩定
lcd_write_cmd(0x38); delay_ms(5);
lcd_write_cmd(0x38); delay_us(100);
lcd_write_cmd(0x38);
lcd_write_cmd(0x0C); // 開顯示、關游標
lcd_write_cmd(0x06); // 寫入後游標右移
lcd_write_cmd(0x01); delay_ms(2); // 清屏
}
參考開發板廠商提供的例程(通常含 lcd_check_busy()),直接移植可避開時序坑。