本帖最后由 huo_hu 于 2018-3-18 19:03 编辑
此内容由EEWORLD论坛网友huo_hu原创,如需转载或用于商业用途需征得作者同意并注明出处
这部分介绍fsmc驱动的lcd,我这个lcd的驱动芯片是ili9806,其他的ili9XX也都是可以的,硬件连接图
上面的是控制信号接线,另外FSMC的0~15接lcd的数据线0~15。
硬件上有几点说明一下,这个ili9XXX芯片本身是可以设置总线宽度的,有的厂家制作的时候把这个设置固定了,有的厂家做的屏有飞线选择,要对着说明看一下,如果用8线也是可以的数据分两次打出去。还有一个是屏的背光电路,其实就是个升压电路,可以配合pwm来调整背光亮度,屏上没有要自己做这部分。
然后cube里配置成使用fsmc总线lcd接口
这里面FSMC的控制管脚和数据管脚都是固定的,只有lcd register 的A18可以自己选择一下,用哪个都可以程序地址上有点差别
#define A16BIT 18
#define LCD_DATA_ADDR (0x60000000+(uint32_t)(1<<(A16BIT+1)))
#define LCD_REGS_ADDR (0x60000000)
液晶以这条信号线来区分是指令地址或者数据地址。我这里用的是16位数据宽度。
保存更新一下,cube已经帮你把fsmc配置好了,下一步就开始写液晶初始化程序了。这个初始化最开始的部分是对各个寄存器进行配置,因为各个厂家的寄存器值可能不一样,这部分只能找厂家要。类似的程序就是这样
#define A16BIT 18
#define LCD_DATA_ADDR (0x60000000+(uint32_t)(1<<(A16BIT+1)))
#define LCD_REGS_ADDR (0x60000000)
#define LCD_WR_REG(ind) { \
*(__IO uint16_t*)(LCD_REGS_ADDR)=ind; \
}
#define LCD_WR_DAT(dat) { \
*(__IO uint16_t *)(LCD_DATA_ADDR)=dat; \
}
#define LCD_RE_DAT (*(__IO uint16_t *)(LCD_DATA_ADDR))
#define write_command LCD_WR_REG
#define write_data LCD_WR_DAT
#define delay HAL_Delay
void ILI9806_800_480_Init(void) {
HAL_Delay(100);
// EXTC Command Set enable register
write_command(0xFF);
write_data(0xFF);
write_data(0x98);
write_data(0x06);
write_command(0xBA); // SPI Interface Setting
write_data(0x60);
write_command(0xBC); // GIP 1
write_data(0x01);
write_data(0x12);
。。。。。。。 这中间好长好长,我省略了
write_command(0x3A);
write_data(0x55); //55-16BIT,66-18BIT,77-24BIT
write_command(0x11);
delay(120);
write_command(0x29);
delay(25);
编译然后下载,(记得打开背光,不然什么也看不到),这个函数运行到最后部分就是0x29指令是开显示,这个时候如果看到屏幕上有好多花点,那恭喜你成功一大半了,至少硬件没问题了,那些花点是随机的内存数据。剩下的再改程序就行了。那些command的含义在手册里都有,指令很多但是绝大部分都用不到。
ILI9806G-Data Sheet 芯片手册.pdf
(6.54 MB, 下载次数: 5)