大家好,我就是传说中的 mdk55555 ,听说有人还不会用STM32控制TFT彩屏,我笑掉大牙了!还经常有人喷我,我实在受不鸟了,我不就在这娱乐一下嘛,你们这些人呐,真小气!
前两天老子发帖说用STM32显示一个苍老湿,居然有人不信,你们就这么看不起人吗?苍老湿撸腻了,我就显示一个清纯版的杨幂吧。
下面我就来讲讲用STM32处理器控制TFT显示一个杨幂的基本原理。先看图!!!睁大眼好好看看!!!
在STM32中可以用两种方式来点亮TFT,一种是模拟TFT的接口时序,另一种是直接使用STM32的FSMC来控制TFT。FSMC其实就是一种总线接口,它的主要作用是用来扩展存储器的(例如NOR FLASH、SRAM等),当我们访问这些存储器时相应的时序自动在STM32的引脚上出现。玩过LCD1602或LCD12864的童鞋都知道,我们一般是通过IO口来模拟它的操作读写时序的。但是,在STM32中,由于TFT的操作时序跟NOR FLASH 的一致,因此,我们便可以通过FSMC直接与TFT相连接,也不用再模拟TFT的读写时序了。
我们唯一需要做的就是将FSMC与TFT正确连接,并在软件中正确配置FSMC。硬件连接如图所示。
配置好了FSMC后我们还需要写几个简单的函数,以实现对TFT的读写。
//NCE2
#define Bank1_LCD_C ((uint32_t)0x60000000) // Reg ADDR
#define Bank1_LCD_D ((uint32_t)0x60020000) // Data ADDR
/*** 写寄存器地址函数 ***/
void LCD_WR_REG(uint16_t index) //输入:寄存器序号
{
*(__IO uint16_t *)(Bank1_LCD_C)= index;
}
/*** 写16位数据函数 ***/
void LCD_WR_Data(uint16_t val)
{
*(__IO uint16_t *)(Bank1_LCD_D)= val;
}
/*** 写寄存器数据函数 ***/
void LCD_WR_CMD(uint16_t index,uint16_t val)
{
*(__IO uint16_t *)(Bank1_LCD_C)= index;
*(__IO uint16_t *)(Bank1_LCD_D)= val;
}
/*** 读寄存器函数 ***/
uint16_t LCD_RD_data(uint16_t index) //输入:寄存器序号
{
uint16_t R=0;
*(__IO uint16_t *)(Bank1_LCD_C)= index;
R=*(__IO uint16_t *) (Bank1_LCD_D);
return(R); //返回寄存器值
}
然后我们还需要对TFT进行初始化,这就需要看TFT的数据手册了,虽然100多页,不过写的还是很清楚的,哥硬着头皮读了一遍。完了之后就可以在TFT上显示图片或汉字了。
我用的是2.4寸的TFT,驱动IC是ILI9325,其实这个液晶屏就是由一个320×240的点阵构成的。我们要显示一副图片其实就是点亮相应的点而已。那么颜色是怎么整的呢?他是通过MCU向TFT写入一个16位的颜色码来完成的,一般是RGB为5-6-5格式的。那么怎么知道要点亮哪个点呢?只要向TFT的相关寄存器写入相应的坐标值就OK啦,就是这么简单。那图片是如何转化成二进制代码的?用Image2LCD软件可直接将图片转化为十六进制数组。
void DrawPicture(void) //画图函数
{
uint32_t i=0;//for循环变量
LCD_WR_CMD(0x0003,0x1018); //书写方向!!!左下起
//---指定GRAM的画图区域---//
LCD_WR_CMD(0x0050, 0); // 水平 GRAM 起始坐标
LCD_WR_CMD(0x0051, 239); // 水平 GRAM 终点坐标
LCD_WR_CMD(0x0052, 0); // 垂直 GRAM 起始坐标
LCD_WR_CMD(0x0053, 319); // 垂直 GRAM 终点坐标
LCD_WR_CMD(0x20, 0); //这两句是干啥的??答:所写数据的起点!右边不够写左边,下边不够写上边
LCD_WR_CMD(0x21, 0); //垂直的起点
LCD_WR_REG(0x22);
for(i=0;i<320*240*2;i=i+2) //开始绘图
{
//16位总线,需要一次发送2个字节的数据
LCD_WR_Data((uint16_t)(Pic320x240<<8)+Pic320x240[i+1]);
}
}
就说到这里吧,以后我再也不上这个论坛了!发个帖唧唧歪歪的,原子哥都没意见你们嚷嚷啥?
|