tftlcd是薄膜晶体管液晶显示器。tftlcd具有亮度好,对比度高,层次感强,颜色鲜艳等优点,是目前最主流的lcd显示器 ,广泛用于电视,手机,电脑,平板等各种的电子产品。
lcd原理图
lcd_cs为芯片选择输入引脚(“低”启用)。
rs用于在并行接口中选择“数据或命令”,当rs为1时,数据被选中;当rs为0时,命令被选中。
wr作为写信号,上升沿写入数据。
rd作为读取信号,上升沿读取数据。
rst为硬复位lcd信号。
d0-d15为16位双向数据线。
bl为背光灯控制信号。
miso/mosi/t_pen/t_cs/clk为触摸屏接口信号,本节暂不做介绍。
引脚分配为:
lcd_cs:pg12、rs:pf12、wr:pd5、rd:pd4、reset:pg15、bl:pb15、d0:pd14、d1:pd15、d2:pd0、d3:pd1、d4:pe7、d5:pe8、d6:pe9、d7:pe10、d8:pe11、d9:pe12、d10:pe13、d11:pe14、d12:pe15、d13:pd8、d14:pd9、d15:pd10。
由于开漏模式下电压达不到lcd的要求,所以所有引脚配置为推挽模式,数据输出时切换为输出模式,接收数据时切换为输入模式。
构造时序时经常要对片选信号cs、数据/命令选择rs、写信号wr、读信号rd、背光灯控制bl进行操作,为了更方便编写程序,可以对这几个信号进行宏定义。
#define lcd_cs_h() do{gpiog- >bsrrl = 0x1< bsrrh = 0x1< bsrrl = 0x1< bsrrh = 0x1< bsrrl = 0x1< bsrrh = 0x1< bsrrl = 0x1< bsrrh = 0x1< bsrrl = 0x1< bsrrh = 0x1< ahb1enr |= 1< <1 | 0xf< moder &=~ (0x3< moder |= (0x1< moder &=~ (0xf03f0f0f< moder |= (0x50150505< moder &=~ (0xffffc000< moder |= (0x55554000< moder &=~ (0x3< moder |= (0x1< moder &=~ (0xc3000000< moder |= (0x41000000< otyper &=~ (0x1< otyper &=~ (0xc733< otyper &=~ (0xff80< otyper &=~ (0x1< otyper &=~ (0x9000< ospeedr |= (0x3< ospeedr |= (0xf03f0f0f< ospeedr |= (0xffffc000< ospeedr |= (0x3< ospeedr |= (0xc3000000< pupdr &=~ (0x3< pupdr &=~ (0xf03f0f0f< pupdr &=~ (0xffffc000< pupdr &=~ (0x3< pupdr &=~ (0xc3000000< moder &=~ (0xf03f000f< moder &=~ (0xffffc000< moder &=~ (0xf03f000f< moder |= (0x50150005< moder &=~ (0xffffc000< moder |= (0x55554000< odr &= 0x3fff; gpiod- >odr |= ((dat)&0x0003)< odr &= 0xfffc; gpiod- >odr |= ((dat >>2)&0x0003)< odr &= 0x007f; gpioe- >odr |= ((dat >>4)&0x01ff)< odr &= ~(0x7< odr |= (dat >>13)< idr & 0x3)< idr & 0x3)< idr > >7)< idr > >8)&0x7)< <13; return temp;}
由于使用的数据线是16条,所以采用8080时序的16位总线操作进行写命令、读状态、写参数、读参数。由表可以看出片选信号cs低电平时为使能。
根据表格8080时序写出写命令、读状态、写参数、读参数的函数。
//写命令void ili9341_writecmd(u16 cmd){ lcd_cs_l(); //片选有效 rs_l(); //选择为命令状态 ili9341_write(cmd); wr_l(); //写失效 wr_h(); //写有效 lcd_cs_l(); //片选失效 }//读状态u16 ili9341_readstatus(){ u16 temp = 0; //模式切换为读 ili9341_mode_in(); lcd_cs_l(); //片选有效 rs_h(); //选择为参数状态 //rd:pd4 rd_h(); //读失效 rd_l(); //读有效 temp = ili9341_read(); lcd_cs_l(); //片选失效 //模式切换为读 ili9341_mode_out(); return temp;}//写参数void ili9341_writeparam(u16 param){ lcd_cs_l(); //片选有效 rs_h(); //选择为参数状态 ili9341_write(param); //wr:pd5 wr_l(); //写失效 wr_h(); //写有效 lcd_cs_l(); //片选失效 }//读参数u16 ili9341_readparam(){ u16 temp = 0; //模式切换为读 ili9341_mode_in(); lcd_cs_l(); //片选有效 rs_h(); //选择为参数状态 //rd:pd4 rd_h(); //读失效 rd_l(); //读有效 temp = ili9341_read(); lcd_cs_l(); //片选失效 //模式切换为读 ili9341_mode_out(); return temp;}最后,完成ili9341初始化函数。先初始化gpio引脚,软件复位,再添加屏幕厂家提供的初始化序列。
void ili9341_init(){ u32 i = 0; //引脚初始化 ili9341_gpioinit(); ili9341_writecmd(0x01); //初始化9341 delay_ms(120); // delay 120 ms//****start initial sequence(以下代码厂家提供) **** ili9341_writecmd(0xcf); //电源设置 ili9341_writeparam(0x00); //默认值 ili9341_writeparam(0x81); //默认值 ili9341_writeparam(0x30); //默认值 ili9341_writecmd(0xed); //上电序列控制 ili9341_writeparam(0x64); ili9341_writeparam(0x03); ili9341_writeparam(0x12); ili9341_writeparam(0x81); ili9341_writecmd(0xe8); //驱动时序控制 ili9341_writeparam(0x85); ili9341_writeparam(0x01); ili9341_writeparam(0x79); ili9341_writecmd(0xcb); //电源控制a ili9341_writeparam(0x39); ili9341_writeparam(0x2c); ili9341_writeparam(0x00); ili9341_writeparam(0x34); ili9341_writeparam(0x02); ili9341_writecmd(0xf7); //pump ratio control ili9341_writeparam(0x20); ili9341_writecmd(0xea); //driver timing control b ili9341_writeparam(0x00); ili9341_writeparam(0x00); ili9341_writecmd(0xc0); //power control ili9341_writeparam(0x1d); //vrh[5:0] ili9341_writecmd(0xc1); //power control ili9341_writeparam(0x11); //sap[2:0];bt[3:0] ili9341_writecmd(0xc5); //vcm control ili9341_writeparam(0x33); ili9341_writeparam(0x34); ili9341_writecmd(0xc7); //vcm control2 ili9341_writeparam(0xbe);// ili9341_memoryaccessctrl(scan_mode,1); //扫描模式,默认为l2r_u2d,颜色顺序:rgb ili9341_writecmd(0x36); ili9341_writeparam(0); ili9341_writecmd(0xb1); ili9341_writeparam(0x00); ili9341_writeparam(0x1b); ili9341_writecmd(0xb6); // display function control ili9341_writeparam(0x0a); ili9341_writeparam(0xa2); ili9341_writecmd(0xf2); // 3gamma function disable ili9341_writeparam(0x00); ili9341_writecmd(0x26); //gamma curve selected ili9341_writeparam(0x01); ili9341_writecmd(0xe0); //set gamma ili9341_writeparam(0x0f); ili9341_writeparam(0x23); ili9341_writeparam(0x1f); ili9341_writeparam(0x09); ili9341_writeparam(0x0f); ili9341_writeparam(0x08); ili9341_writeparam(0x4b); ili9341_writeparam(0xf2); ili9341_writeparam(0x38); ili9341_writeparam(0x09); ili9341_writeparam(0x13); ili9341_writeparam(0x03); ili9341_writeparam(0x12); ili9341_writeparam(0x07); ili9341_writeparam(0x04); ili9341_writecmd(0xe1); //set gamma ili9341_writeparam(0x00); ili9341_writeparam(0x1d); ili9341_writeparam(0x20); ili9341_writeparam(0x02); ili9341_writeparam(0x11); ili9341_writeparam(0x07); ili9341_writeparam(0x34); ili9341_writeparam(0x81); ili9341_writeparam(0x46); ili9341_writeparam(0x06); ili9341_writeparam(0x0e); ili9341_writeparam(0x0c); ili9341_writeparam(0x32); ili9341_writeparam(0x38); ili9341_writeparam(0x0f); //数据格式16bit设置 ili9341_writecmd(0x3a); ili9341_writeparam(0x55); //rgb接口格式16bits/pixel,mcu接口格式16bits/pixel// ili9341_exitsleepmode(); //退出睡眠模式 ili9341_writecmd(0x11); delay_ms(120); ili9341_writecmd(0x2c); //2ch for(i=0;ibsrrl = 1< <15; //开背光 }最后在主文件调用ili9341的初始化函数,进行测试。
#include stm32f4xx.h#include core_cm4.h#include delay.h#include ili9341.hint main(){ ili9341_init(); while(1);}编译程序并烧入开发板,lcd亮并显示绿色,ili9341初始化成功。
ili9341驱动lcd涉及的引脚比较多,所以在配置时一定要细心,一旦出错也会很难排查,所以尽量一次写成。
麒麟9000s和骁龙888哪个好?
iphone8什么时候上市?iphone8最新消息:iphone8最全信息爆料:除了双摄和全面屏,iphone8还确认了指纹位置?
国产旗舰机: 华为mate9, 国产崛起的代表作
优必选科技赴港上市,引领人形机器人行业新篇章
EVM QA 公益评审
STM32 ILI9341驱动TFTLCD屏(一)
比亚迪的刀片电池为何如此安全,它有何独特之处
苹果高管表示苹果公司将会继续保护用户隐私数据不被泄露
混合式转换器简化数据中心和电信系统的48V/54V降压转换
PCB电路图各个元件的连线和走向
斑点猫信息技术指纹可虐iPhone6s能门锁体验
分析师认为iPhone9将为苹果带来120亿美元收入
基于实时操作系统的编程系统设计
物联网智慧烟感解决方案分享 为用户争取最大逃生机会
大米重金属镉检测仪的详细介绍
计算模型通过预测对语音进行解码
移动网络进化史回顾
采用Aduc845单片机数据采集系统的电路设计,实现数据的查询与处理
阿里巴巴在中国云计算市场具有强大领先优势
中国智慧商显产业的「两会」在深圳隆重召开