历史上的今天
返回首页

历史上的今天

今天是:2024年10月28日(星期一)

正在发生

2020年10月28日 | STM32学习笔记——TFT2.4彩屏显示图片

2020-10-28 来源:eefocus

利用彩屏显示图片需要先完成彩屏的驱动程序,然后在驱动程序的基础上再编写应用程序。


彩屏的驱动程序如果写好的话,就可以一直使用了,精力主要集中在应用程序的编写就可以了,但是移植的话,要移植驱动程序。其实移植也只是改变那些很底层的靠近处理器的那部分代码。


因为STM32F103C8的片上只有64K的FLASH,所以不能存储太多的图片数据,也就不能显示太大的图片。


一下的程序注释的比较详细,看懂了基本上就可以用了。


彩屏驱动程序的头文件lcd.h如下:


#define uchar unsigned char 


#define uint unsigned int


#define Bus_16        //16位数据模式,如果使用8位模式,请注释此语句,如果使用16位模式,请打开此句


#define  LCD_DataPortH P1     //高8位数据口,8位模式下只使用高8位 


#define  LCD_DataPortL P0     //低8位数据口 ,8位模式下低8位可以不接线


#define LCD_WR    GPIO_Pin_2  //WR  引脚定义 P2^5


#define LCD_RS    GPIO_Pin_1  //RS  引脚定义 P2^6


#define LCD_CS    GPIO_Pin_0  //CS  引脚定义 P2^7


#define LCD_RST   GPIO_Pin_11     //RST 引脚定义 P3^3


#define LCD_RD    GPIO_Pin_8  //RD  引脚定义 P3^2


#define  LCD_SIZE_X 240


#define  LCD_SIZE_Y 320


extern  uint colors[];


extern  void  pic_play(uint xStart, uint xEnd, uint yStart, uint yEnd); //显示图片函数


void delayms(int count) ;


//void LCD_Writ_Bus(char VH,char VL);


void LCD_Init(void);


void LCD_Writ_Bus( uint VH, uint VL);


void LCD_Write_COM(char VH,char VL);


void LCD_Write_DATA(char VH,char VL);


void Pant(char VH,char VL);


void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2);


驱动程序lcd.c文件如下:


#include "stm32f10x_lib.h"


#include "Lcd.h"


//存储图片数据的头文件


//#include "picture.h"


#include "picture_sara.h"


#include "xiaoqian.h"


#include "yang.h"


#define    LCD_rest(x) x ? GPIO_SetBits(GPIOA, LCD_RST):   GPIO_ResetBits(GPIOA, LCD_RST) //自己定义位操作函数


#define    LCD_rd(x)   x ? GPIO_SetBits(GPIOA, LCD_RD) :   GPIO_ResetBits(GPIOA, LCD_RD)


#define    LCD_rs(x)   x ? GPIO_SetBits(GPIOB, LCD_RS) :   GPIO_ResetBits(GPIOB, LCD_RS)


#define    LCD_wr(x)   x ? GPIO_SetBits(GPIOB, LCD_WR) :   GPIO_ResetBits(GPIOB, LCD_WR)


#define    LCD_cs(x)   x ? GPIO_SetBits(GPIOB, LCD_CS) :   GPIO_ResetBits(GPIOB, LCD_CS)


uint colors[]=


{


  0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xffff  //颜色数据


};


void LCD_Init(void) //初始化LCD


{

    LCD_rest(1);


    delayms(5);


LCD_rest(0);


delayms(5);


LCD_rest(1);


delayms(5);


 


LCD_cs(0);  //打开片选使能


//


LCD_Write_COM(0x00,0xE5); LCD_Write_DATA(0x78,0xF0); // set SRAM internal timing


LCD_Write_COM(0x00,0x01); LCD_Write_DATA(0x01,0x00); // set SS and SM bit


LCD_Write_COM(0x00,0x02); LCD_Write_DATA(0x07,0x00); // set 1 line inversion


LCD_Write_COM(0x00,0x03); LCD_Write_DATA(0x10,0x30); // set GRAM write direction and BGR=1.


LCD_Write_COM(0x00,0x04); LCD_Write_DATA(0x00,0x00); // Resize register


LCD_Write_COM(0x00,0x08); LCD_Write_DATA(0x02,0x07); // set the back porch and front porch


LCD_Write_COM(0x00,0x09); LCD_Write_DATA(0x00,0x00); // set non-display area refresh cycle ISC[3:0]


LCD_Write_COM(0x00,0x0A); LCD_Write_DATA(0x00,0x00); // FMARK function


LCD_Write_COM(0x00,0x0C); LCD_Write_DATA(0x00,0x00); // RGB interface setting


LCD_Write_COM(0x00,0x0D); LCD_Write_DATA(0x00,0x00); // Frame marker Position


LCD_Write_COM(0x00,0x0F); LCD_Write_DATA(0x00,0x00); // RGB interface polarity


//


LCD_Write_COM(0x00,0x10); LCD_Write_DATA(0x00,0x00); // SAP, BT[3:0], AP, DSTB, SLP, STB


LCD_Write_COM(0x00,0x11); LCD_Write_DATA(0x00,0x07); // DC1[2:0], DC0[2:0], VC[2:0]


LCD_Write_COM(0x00,0x12); LCD_Write_DATA(0x00,0x00); // VREG1OUT voltage


LCD_Write_COM(0x00,0x13); LCD_Write_DATA(0x00,0x00); // VDV[4:0] for VCOM amplitude


LCD_Write_COM(0x00,0x07); LCD_Write_DATA(0x00,0x01);


delayms(50); // Dis-charge capacitor power voltage


LCD_Write_COM(0x00,0x10); LCD_Write_DATA(0x10,0x90); // 1490//SAP, BT[3:0], AP, DSTB, SLP, STB


LCD_Write_COM(0x00,0x11); LCD_Write_DATA(0x02,0x27); // DC1[2:0], DC0[2:0], VC[2:0]


delayms(50); // Delay 50ms


LCD_Write_COM(0x00,0x12); LCD_Write_DATA(0x00,0x1F); //001C// Internal reference voltage= Vci;


delayms(50); // Delay 50ms


LCD_Write_COM(0x00,0x13); LCD_Write_DATA(0x15,0x00); //0x1000//1400   Set VDV[4:0] for VCOM amplitude  1A00


LCD_Write_COM(0x00,0x29); LCD_Write_DATA(0x00,0x27); //0x0012 //001a  Set VCM[5:0] for VCOMH  //0x0025  0034


LCD_Write_COM(0x00,0x2B); LCD_Write_DATA(0x00,0x0D); // Set Frame Rate   000C


delayms(50); // Delay 50ms


LCD_Write_COM(0x00,0x20); LCD_Write_DATA(0x00,0x00); // GRAM horizontal Address


LCD_Write_COM(0x00,0x21); LCD_Write_DATA(0x00,0x00); // GRAM Vertical Address


// ----------- Adjust the Gamma Curve ----------//


LCD_Write_COM(0x00,0x30); LCD_Write_DATA(0x00,0x00);


LCD_Write_COM(0x00,0x31); LCD_Write_DATA(0x07,0x07);


LCD_Write_COM(0x00,0x32); LCD_Write_DATA(0x03,0x07);


LCD_Write_COM(0x00,0x35); LCD_Write_DATA(0x02,0x00);


LCD_Write_COM(0x00,0x36); LCD_Write_DATA(0x00,0x08);//0207


LCD_Write_COM(0x00,0x37); LCD_Write_DATA(0x00,0x04);//0306


LCD_Write_COM(0x00,0x38); LCD_Write_DATA(0x00,0x00);//0102


LCD_Write_COM(0x00,0x39); LCD_Write_DATA(0x07,0x07);//0707


LCD_Write_COM(0x00,0x3C); LCD_Write_DATA(0x00,0x02);//0702


LCD_Write_COM(0x00,0x3D); LCD_Write_DATA(0x1D,0x04);//1604


//------------------ Set GRAM area ---------------//


LCD_Write_COM(0x00,0x50); LCD_Write_DATA(0x00,0x00); // Horizontal GRAM Start Address


LCD_Write_COM(0x00,0x51); LCD_Write_DATA(0x00,0xEF); // Horizontal GRAM End Address


LCD_Write_COM(0x00,0x52); LCD_Write_DATA(0x00,0x00); // Vertical GRAM Start Address


LCD_Write_COM(0x00,0x53); LCD_Write_DATA(0x01,0x3F); // Vertical GRAM Start Address


LCD_Write_COM(0x00,0x60); LCD_Write_DATA(0xA7,0x00); // Gate Scan Line


LCD_Write_COM(0x00,0x61); LCD_Write_DATA(0x00,0x01); // NDL,VLE, REV


LCD_Write_COM(0x00,0x6A); LCD_Write_DATA(0x00,0x00); // set scrolling line


//-------------- Partial Display Control ---------//


LCD_Write_COM(0x00,0x80); LCD_Write_DATA(0x00,0x00);


LCD_Write_COM(0x00,0x81); LCD_Write_DATA(0x00,0x00);


LCD_Write_COM(0x00,0x82); LCD_Write_DATA(0x00,0x00);


LCD_Write_COM(0x00,0x83); LCD_Write_DATA(0x00,0x00);


LCD_Write_COM(0x00,0x84); LCD_Write_DATA(0x00,0x00);


LCD_Write_COM(0x00,0x85); LCD_Write_DATA(0x00,0x00);


//-------------- Panel Control -------------------//


LCD_Write_COM(0x00,0x90); LCD_Write_DATA(0x00,0x10);


LCD_Write_COM(0x00,0x92); LCD_Write_DATA(0x06,0x00);


LCD_Write_COM(0x00,0x07); LCD_Write_DATA(0x01,0x33); // 262K color and display ON


LCD_cs(1);  //关闭片选使能



void delayms(int count)  // 


{


        int i,j;


        for(i=0;i

                for(j=0;j<100;j++);


}


#ifdef  Bus_16    //条件编译-16位数据模式   


void LCD_Writ_Bus(uint VH , uint VL)   //并行数据写入函数


{


  //LCD_DataPortH=VH;   //高位P1口


//屏蔽高8位  将数据送到PA0-PA7


GPIOA->BSRR = VH & 0x00ff;   


    GPIOA->BRR  = (~VH) & 0x00ff;


   //GPIO_SetBits(GPIOA,  VH & 0x00ff);


   //GPIO_ResetBits(GPIOA, (~ VH & 0x00ff));


 


    //LCD_DataPortL=VL;   //低位P0口


//屏蔽低8位  将数据送到PB8-PB15


GPIOB->BSRR = (VL)<<8 & 0xff00;   


    GPIOB->BRR  = ((~VL)<<8) & 0xff00;


LCD_wr(0);


LCD_wr(1);


}


#else //条件编译-8位数据模式 


void LCD_Writ_Bus(char VH,char VL)   //并行数据写入函数


{


     //LCD_DataPortH=VH;  //八位模式都用P0口送数据


     //LCD_wr(0);


//LCD_wr(1);


//LCD_DataPortH=VL; //八位模式都用P0口送数据


//LCD_wr(0);


//LCD_wr(1);


}


#endif


void LCD_Write_COM(char VH,char VL)  //发送命令


{


    LCD_rs(0);


LCD_Writ_Bus(VH,VL);


}


void LCD_Write_DATA(char VH,char VL) //发送数据


{


    LCD_rs(1);


LCD_Writ_Bus(VH,VL);


}


void Pant(char VH,char VL)    //涂满全屏函数


{


int i,j;


LCD_cs(0);  //打开片选使能


Address_set(0,0,239,319);


    for(i=0;i<320;i++)


 {


  for (j=0;j<240;j++)


    {


          LCD_Write_DATA(VH,VL);


    }



  }


     LCD_cs(1);  //关闭片选使能


}


void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) //设置地址范围函数


{


LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1>>8,x1);   //设置X坐标位置


    LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1>>8,y1);   //设置Y坐标位置


    LCD_Write_COM(0x00,0x50);LCD_Write_DATA(x1>>8,x1);   //开始X


LCD_Write_COM(0x00,0x52);LCD_Write_DATA(y1>>8,y1);   //开始Y


    LCD_Write_COM(0x00,0x51);LCD_Write_DATA(x2>>8,x2);   //结束X


LCD_Write_COM(0x00,0x53);LCD_Write_DATA(y2>>8,y2);   //结束Y


    LCD_Write_COM(0x00,0x22);  


}


void  pic_play(uint Start_X, uint End_X,uint Start_Y,uint End_Y)


{


   uint m;


   //LCD_CS = 0;


   GPIO_ResetBits(GPIOB,LCD_CS);  //打开片选


   Address_set(Start_X,Start_Y,End_X,End_Y) ; //指定图片显示的范围


  // LCD_RS  = 1; 


   GPIO_SetBits(GPIOB, LCD_RS);   //关闭片选


   //循环把图片的所有数据依次写入


   Address_set(0,0,141,79);    //用彩屏显示图片时,一定要注意图片长宽比例,如果长宽比例不对的话,显示的图片就会变形


   //例如本幅图片取模软件输出的长宽为(177,100),所以在这里图片的显示范围必须设为(0,0,176,99),即x范围为0~176,y的范围为


   //0~99.这样图片才能正常显示,否则图片就会变形。


   for(m=0;m<22728/2;m++)   //这里的35400这个数字指定显示图片的范围,因为该图的数据总共只有35400个,所以这里指定


   //整幅图都显示出来。如果这个数比35400小,则只显示该图的一部分。


   {


       LCD_Write_DATA(gImage_sara[m*2+1],gImage_sara[m*2]);


   }


Address_set(0,90,65,189);  //一定要注意保持比例


for(m=0;m<13200/2;m++)


{


    LCD_Write_DATA(gImage_xiaoqian[m*2+1],gImage_xiaoqian[m*2]);


}


    Address_set(75,90,137,189); //一定要注意保持比例


for(m=0;m<12600/2;m++)


{


    LCD_Write_DATA(gImage_yang[m*2+1],gImage_yang[m*2]);


}


  


   //LCD_CS = 1;


   GPIO_SetBits(GPIOB, LCD_CS);  //关闭片选


 


}


主程序main.c


在主程序中完成对系统的初始化配置,利用彩屏的驱动程序完成图片的显示等功能,程序如下:


#include "stm32f10x_lib.h"


#include "lcd.h"


GPIO_InitTypeDef GPIO_InitStructure;   //定义GPIO初始化的结构体变量

推荐阅读

史海拾趣

台湾富晶(FORTUNE)公司的发展小趣事
根据机床的实际工作情况调整触发器的相关参数,如工作频率、触发方式等。
Atmel (Microchip)公司的发展小趣事

为了进一步扩大市场份额和拓展应用领域,Atmel(Microchip)积极与其他企业开展合作。公司与多家知名企业建立了战略合作关系,共同推动微控制器及相关技术在各个领域的应用。通过与合作伙伴的紧密合作,Atmel的产品已经广泛应用于工业、消费、安全、通信、计算和汽车等多个领域,为这些领域的发展提供了强有力的支持。

这五个故事旨在展现Atmel(Microchip)在电子行业中的发展历程和成就,涵盖了从创业初期到被收购后的不同阶段。通过这些故事,我们可以看到Atmel(Microchip)如何凭借技术创新、市场拓展和合作发展,逐渐成为了微控制器领域的领军企业。

Fukushima Futaba Electric Co Ltd公司的发展小趣事

进入21世纪后,中国市场的快速发展吸引了Futaba Electric的注意。为了更好地服务于中国市场,公司于2002年在北京成立了双叶电子科技开发(北京)有限公司。这家子公司专营Futaba Electric的全线产品,包括VFD真空荧光显示管、RC无线遥控设备等。通过深耕中国市场,Futaba Electric不仅扩大了产品销量,还进一步提升了品牌知名度和影响力。

Excellence Optoelectronics Inc公司的发展小趣事

随着LED市场的不断发展,EOI意识到只有不断拓展市场,才能谋求更大的发展空间。因此,公司开始积极开拓国际市场,参加各种国际展会和交流活动,与国际同行建立联系和合作。同时,EOI还注重与国内客户的沟通和合作,了解他们的需求,提供个性化的解决方案。这些努力使得EOI的市场份额不断扩大,公司的业务规模也实现了快速增长。

Eclipse Magnetics公司的发展小趣事

EOI深知客户的重要性,因此公司一直致力于提供优质的服务。无论是售前咨询还是售后服务,EOI都认真对待每一个客户的需求和问题。公司建立了完善的客户服务体系,为客户提供及时、专业的支持。同时,EOI还定期举办客户培训和技术交流活动,提高客户的技术水平和使用效果。这些努力使得EOI赢得了客户的信任和忠诚度。

FOTEK公司的发展小趣事

面对数字化时代的到来,福禄克积极拥抱变革,推动企业的数字化转型。公司不仅升级了内部管理系统,实现了生产、销售、服务等各个环节的数字化协同,还推出了多款基于大数据和人工智能技术的智能测试工具。这些智能工具不仅提高了测试效率和准确性,还为用户提供了更加便捷和个性化的服务体验。福禄克的数字化转型战略不仅增强了其市场竞争力,还为整个电子行业的数字化转型树立了标杆。

问答坊 | AI 解惑

Chrome渲染引擎同Safari 正开发Linux和MAC版

北京时间9月2日消息:据国外媒体报道,Google周一通过漫画宣布,将推出网络浏览器 Chrome。目前,有关Chrome的技术内容也逐渐出现在了网上。 据悉,Chrome浏览器使用了开源的网页渲染引擎WebKit,这个引擎也被使用在了苹果公司的Safari浏览器中, ...…

查看全部问答>

带驱动的步进电机的管脚定义

本人有个带驱动器的步进电机,型号为BL55S-M01是三星打印机上的,上面带一个10针的插座分别为:1.24V 2. 24V 3.GND 4.GND 5.BK 6.5V(NC) 7.ST/SP 8.RD 9.CLK 10.CW  /CCW。哪位高手能否介绍一下那些管脚的作用?…

查看全部问答>

mic的偏置电阻选择

本帖最后由 paulhyde 于 2014-9-15 09:14 编辑 今年音频题会不会,要加上mic,功放这些部分呢? 找到一个mic的偏置电阻选择资料  …

查看全部问答>

电子电路经典实例-绝对实用

本帖最后由 paulhyde 于 2014-9-15 09:35 编辑 模电电路,图文并茂,讲的非常清楚。。。  …

查看全部问答>

Nand Flash 读写问题

我用的是友善mini2440,Nand Flash型号是K9F1G08,现在是裸机学习; 我在进行读操作时,读出的第一个字节总是 30,然后才是真正的数据; 我的写操作写不进去。 请大家指点下。谢谢! …

查看全部问答>

关于USB设备的读取

{                 m_strLog += _T(\"抱歉,未找到可用的USB设备\");…

查看全部问答>

Windows xpe的ghost方法

嵌入式xpe是用什么工具ghost的?…

查看全部问答>

IAR_STM8编译出错请教

请教;以前在在ST Visual Develop环境下完成的程序现在移植到IAR环境编译报如下错误:不知问题出在哪?? Building configuration: stm8lianfang - Debug Updating build tree... Linking Error[Lp011]: section placement failed: una ...…

查看全部问答>