前市场流行的3.5寸屏基本上都是只内置了驱动器,而不带控制器,这样给用户的使用造成了一些难度。基本上很多朋友在用彩屏时选择一些带lcd控制器的arm7或arm9去开发,对于不会arm开发的朋友来说,只使用普通mcu,这样可以选择的3.5寸tft模块,就很难找到了。
本文就是基于市场上一款比较使用的3.5寸tft模块编写的,用户只需要帮该tft模块当作普通的单色液晶的开发思路来使用,就可以很容易去编程。
一、 硬件选择
1、 mcu:at89s51
2、 开发编译环境:keil c51
3、 3.5寸tft模块型号:mzt35c1
二、 tft模块基本性能:
1、基本参数
模块结构: 内置控制器
屏幕大小: 3.5英寸
屏幕分辩率:320*240
屏幕颜色数:65536色(16位真彩色)
工作电压: 3.3v/5v可选
总线结构: intel8080
总线宽度: 8bit
背光形式: led;可指令控制,0-127可调
连接方式: 排针插座
触摸屏:标准配置不带触摸屏;模组留有触摸屏芯片焊盘和触摸屏接口
2、接口引脚说明
接口引脚
说明
vcc
模块供电电源输入(一般无特殊要求为5v)
d0~d7
8位数据总线
cs
片选(低电平有效)
rst
reset复位(低电平复位)
a0
控制寄存器/数据寄存器选择(低电平选择控制寄存器)
we
写信号(低电平有效)
rd
读信号(低电平有效)
gnd
接地
s_cs
预留有ads7846的片选
s_sck
预留有ads7846的spi时钟输入
s_sdo
预留有ads7846的spi数据输出
s_sdi
预留有ads7846的spi数据输入
s_int
预留有ads7846的int信号
s_busy
预留有ads7846的busy信号
3、操作时序(8位并行intel 8080总线)
mzt35c1模块支持intel8080总线,总线的最高速度可达20mhz(当然总线的速度能否达到最高接口速度,还与用户的总线布线、线长等有关),也就是说,如果控制mcu速度足够快的话,是可以支持视频的显示的。
注意:mzt35c1模块的总线接口是8位的,也就意味着对显存的数据操作时,需要连续进行两次操作方可完成,先传高字节再传低字节;但对于寄存器的操作(写入寄存器地址,即a0为低时的写入操作)8位的操作方可。
三、mzt35c1与51硬件接口连接图
本例程使用gpio来模拟总线时序。上图的模块供电为5v的模块,而模块的端口电平为3.3v的,所以在所有的51端口与模块间的连接串入了一个100欧的电阻,有关mcs51的其它电路不在图中画出,请用户具体参考其它的开发板文档进行了解。而图中的mzt35c1模块的相关引脚请以实物为准,图中仅示意对应的名称的端口,请用户在参考使用时注意。
三、 底层驱动代码编写方法
1、 端口配置
#i nclude “reg52.h”
#i nclude “intrins.h” //包含此头文件可直接操作内核的寄存器以及一些定义好的宏
#define lcd_ctrl_gpio() //无定义
#define lcd_ctrl_out() lcd_cs_set();lcd_rd_set();lcd_rw_set();
#define lcd_ctrl_set(n) //无定义
#define lcd_ctrl_clr(n) //无定义
sbit lcd_cs = p2^6;
#define lcd_cs_set() lcd_cs = 1
#define lcd_cs_clr() lcd_cs = 0
sbit lcd_re = p3^5;
#define lcd_re_set() lcd_re = 1
#define lcd_re_clr() lcd_re = 0
sbit lcd_a0 = p2^5;
#define lcd_a0_set() lcd_a0 = 1
#define lcd_a0_clr() lcd_a0 = 0
sbit lcd_rw = p3^6;
#define lcd_rw_set() lcd_rw = 1
#define lcd_rw_clr() lcd_rw = 0
sbit lcd_rd = p3^7;
#define lcd_rd_set() lcd_rd = 1
#define lcd_rd_clr() lcd_rd = 0
#define lcd_data_gpio() //51的端口是双向的,无需特意规定方向,故无定义
#define lcd_data_out() //51的端口是双向的,无需特意规定方向,故无定义
#define lcd_data_in() p0 = 0xff //51的端口要读数据前需要先输出0xff
#define lcd_data_bus_clr() //无定义
#define lcd_data_bus_set(n) p0 = n
#define lcd_data_read() p0
2、写数据和指令操作
//==============================================
// 函数: void lcd_datawrite(unsigned int data)
// 描述: 写一个字(16bit)的显示数据至lcd中的显示缓冲ram当中
// 参数: data 写入的数据
//=============================================
#definelcd_datawrite(n) lcd_a0_set();lcd_cs_clr();lcd_data_bus_clr();lcd_data_bus_set((unsigned char)(n》》8));
lcd_rw_clr();lcd_rw_set();lcd_data_bus_clr();lcd_data_bus_set((unsigned char)n);lcd_rw_clr(); lcd_rw_set();lcd_cs_set()
//=====================================================
// 函数: void lcd_regwrite(unsigned char addr,unsigned int command)
// 描述: 写一个字节的数据至lcd中的控制寄存器当中
// 参数: addr 要写入的寄存器的地址,低八位有效(byte)
// command 写入的数据
//=====================================================
#define lcd_regwrite(n)
lcd_a0_clr();lcd_cs_clr();lcd_data_bus_clr();lcd_data_bus_set(n);
lcd_rw_clr();lcd_rw_set();lcd_cs_set()
2、 读数据操作
//=============================================
// 函数: lcdbyte lcd_dataread(void)
// 描述: 从lcd中的显示缓冲ram当中读一个字节的显示数据
// 参数: 无
// 返回: 读出的数据,
// 备注: mz 通用版lcd驱动程序 标准子函数
//===========================================
lcdbyte lcd_dataread(void)
{
lcdbyte read_data;
lcd_data_in();
lcd_a0_set();
lcd_cs_clr();
lcd_rd_clr();
lcd_rd_set();
lcd_rd_clr();
lcd_rd_set(); //前面的操作是要完成一次完整的空读操作后方能读取到数据
//如果用户需要连续读取显存,侧仅需要在第一次读数据时作一
//次空读操作即可
lcd_rd_clr();
read_data = lcd_data_read();
read_data = read_data《《8;
lcd_rd_set();
lcd_rd_clr();
read_data |= lcd_data_read();
lcd_rd_set();
lcd_cs_set();
lcd_data_out();
return read_data;
}
3、 初始化tft操作
void lcd_init(void)
{
// flash *init_string;
//lcd驱动所使用到的端口的初始化
lcd_portinit();
//根据lcd显示的配置,设置lcd的数据地址指针自动增加特性
//end
lcd_re_clr();
timedelay(5);
lcd_re_set();
lcd_regwrite(0x03);
lcd_datawrite((1《《7)| (0x60《《0)); //设置背光控制使能、背光亮度等级为60(0~127)
lcd_regwrite(0x04); //写系统寄存器
// lcd_datawrite((0《《7)| //当前显示页
// (0《《6) | //当前读写页设置
// (1《《0)); //显示开关
lcd_datawrite(mzt35_ctrl_reg);
/* init_string = initial_tab;
while(init_string!=0xffff)
{
lcd_regwrite(0x05);lcd_datawrite(*init_string++);
lcd_regwrite(0x06);lcd_datawrite(*init_string++);
}*/
lcd_fill(lcd_initial_color);
}
美国对EDA软件实施新的出口管制
5G无线技术带来新的测试挑战
财政部:台式计算机、数据库等政府采购需求标准公开征求意见
平板电脑和ipad有什么区别
Hitachi Vantara统一混合存储产品系列
AT89S51单片机驱动3.5寸TFT模块的设计
多功能音箱的设计由磁吸支架和蓝牙音箱两部分而组成
全光纤网络(AON),全光纤网络(AON)结构原理是什么?
国防装备更新换代,有源相控阵雷达替代潮流涌起
怎样才可以做到人机融合
iSuppli发布无线市场关键数据
什么是扩展频谱通信,什么是信息带宽
一位电子工程师的经历
启扬方案:免疫荧光分析仪解决方案,助力医疗体外诊断设备应用
进入4G时代,联发科逐渐走向被动
原来公寓门锁是这样装的!
e络盟举办无线电源与非接触式充电技术的在线研讨会
威迈斯上市IPO:车载电源以及电驱系统产品销量持续增加 业绩亮眼
如何利用软件作为激励来加速SoC系统级验证?
V2X车联网:标准之争,谁将胜出