精华内容
下载资源
问答
  • 彩屏图片取模软件

    热门讨论 2012-09-09 01:29:52
    用于单片机驱动彩屏图片显示的取模,简单方便实用
  • 微信关注“DLGG创客DIY”设为“星标”,重磅干货,第一时间送达。最近玩童心派,上边有个128x128的彩屏,当然也是必须玩的,如何让彩屏显示图片呢?方法很多,最简单粗暴基础...

    微信关注 “DLGG创客DIY”

    设为“星标”,重磅干货,第一时间送达。

        最近玩童心派,上边有个128x128的彩屏,当然也是必须玩的,如何让彩屏显示图片呢?方法很多,最简单粗暴基础的当然是将图片生成为数组格式,然后用循环将每个点显示的内容发送到屏幕上显示(别头疼,这段听起来比较麻烦,其实实际使用挺简单的)。

        那么图片如何转换成数组的格式呢?

        一般传统的思路是看jpg或者png文件个格式定义,然后...

        上述学习方法是一种非常传统的思路,即打好基础,即慢慢扎实流派....21世纪了,这种方法虽然没有什么问题,但太低效了,时刻要谨记地精的至理名言:时间就是金钱我的朋友。

        回到正题,我们使用图片取模工具来实现上述操作,即那些大牛为了帮助大家节省时间,写了个软件,将上述繁琐的操作省去了,下边简单介绍一下软件的使用方法。

        工具名称:Img2Lcd

        上图所示

    1.     打开软件之后点击打开导入要转换的图片,推荐和屏幕尺寸对应,否则容易懵逼,即童心派我就找个128x128的图片

    2. 选择左侧的转换参数,建议就改那个灰度,其他的默认就行,灰度选择和屏底层的驱动有关,当然还和存储空间啥的有关,我们先不深究,童心派上我选的是16位真彩,即用16位2进制数来表示一个点。16位二进制数是啥,就是2的16次方个数(这个不用记),记这个比较容易,0xff是8位2进制数,那么16位二进制数就是两个0x..,比如0x11,0x22,这个需要知道

    3. 然后点击保存,给文件起个好名字,然后就行了,把这个文件通过include引入到程序中就能用了

      就这么简单。

      软件获取公众号回复“图片点阵”获取下载链接

    你点的每个在看,我都当成喜欢

    展开全文
  • 彩屏控制以及图片更新方法.非常详细的彩屏资料
  • 卡读图片彩屏

    2014-12-02 16:34:57
    v2G以下 51单片机SD 卡读图片彩屏
  • 51单片机SD卡TFT彩屏显示图片
  • 51单片机TFT彩屏-262K色图片横屏显示
  • STM32学习笔记——TFT2.4彩屏显示图片

    千次阅读 2017-09-28 21:32:42
    STM32学习笔记——TFT2.4彩屏显示图片         利用彩屏显示图片需要先完成彩屏的驱动程序,然后在驱动程序的基础上再编写应用程序。 彩屏的驱动程序如果写好的话,就可以一直使用了,精力主要集中在应用...

    STM32学习笔记——TFT2.4彩屏显示图片

     

      

     

     

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

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

     

    因为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<count;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初始化的结构体变量

    ErrorStatus HSEStartUpStatus; //定义错误状态变量,为枚举类型

     

     

    void RCC_Configuration(void);

    void NVIC_Configuration(void);

    void Delay(vu32 nCount);

     

     

     

    int main(void)

    {

    #ifdef DEBUG

      debug();  //在线调试使用

    #endif

     

     

       RCC_Configuration();      //系统时钟配置函数   

     

       NVIC_Configuration();     //NVIC配置函数

     

        //启动GPIO模块时钟

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

     

        //把调试设置普通IO口 禁止SWJ

      GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  

                                

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;  //所有GPIO为同一类型端口

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出

      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //输出的最大频率为50HZ

      GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA端口

      GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口

     

       GPIO_Write(GPIOA,0xffff);  //将GPIOA 16个端口全部置为高电平

       GPIO_Write(GPIOB,0xffff);  //将GPIOB 16个端口全部置为高电平

     

       LCD_Init();    //初始化LCD

     

       //LCD_clear(6);   //清屏为紫色

       Pant(colors[6]>>8,colors[6]);   //把全屏涂满紫色

       

     

       pic_play(0,173,0,173); //显示图片

     

       //pic_play(7,61,8,74); //显示图片

      // pic_play(68,122,8,74);

      // pic_play(7,61,82,148);

      // pic_play(68,122,82,148);

     

       while(1);

     

    }

     

     

    void RCC_Configuration(void)

    {   

     //复位RCC外部设备寄存器到默认值

      RCC_DeInit();

     

      //打开外部高速晶振

      RCC_HSEConfig(RCC_HSE_ON);

     

       //等待外部高速时钟准备好

      HSEStartUpStatus = RCC_WaitForHSEStartUp();

     

      if(HSEStartUpStatus == SUCCESS)   //外部高速时钟已经准别好

      {     

        //开启FLASH的预取功能

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

     

        //FLASH延迟2个周期

        FLASH_SetLatency(FLASH_Latency_2);

     

      //配置AHB(HCLK)时钟=SYSCLK

        RCC_HCLKConfig(RCC_SYSCLK_Div1);  

      

       //配置APB2(PCLK2)钟=AHB时钟

        RCC_PCLK2Config(RCC_HCLK_Div1); 

     

        //配置APB1(PCLK1)钟=AHB 1/2时钟

        RCC_PCLK1Config(RCC_HCLK_Div2);

     

         //配置PLL时钟 == 外部高速晶体时钟*9  PLLCLK = 8MHz * 9 = 72 MHz 

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

     

        //使能PLL时钟

        RCC_PLLCmd(ENABLE);

     

       //等待PLL时钟就绪

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

        {

        }

     

      //配置系统时钟 = PLL时钟

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

     

       //检查PLL时钟是否作为系统时钟

        while(RCC_GetSYSCLKSource() != 0x08)

        {

        }

      }

    }

     

     

    void NVIC_Configuration(void)

    {

    #ifdef  VECT_TAB_RAM  

       

      NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 

    #else  

       

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   

    #endif

    }

     

     

    void Delay(vu32 nCount)

    {

      for(; nCount != 0; nCount--);

    }

     

     

     

     

     

    #ifdef  DEBUG

     

    void assert_failed(u8* file, u32 line)

      

     

      

      while (1)

      {

      }

    }

    #endif

     

    展开全文
  • 微信关注“DLGG创客DIY”设为“星标”,重磅干货,第一时间送达。继续玩童芯派,128x128的彩屏应该是童芯派的一大亮点,150元(零售价)的开源硬件带这么大的彩屏还是很少...

    微信关注 “DLGG创客DIY”

    设为“星标”,重磅干货,第一时间送达。

        继续玩童芯派,128x128的彩屏应该是童芯派的一大亮点,150元(零售价)的开源硬件带这么大的彩屏还是很少见的(非常有职业操守,就不对比其他板子了)。

        别的不BB了,直接进入正题,先说原理。

        原理:

        无论是12864的液晶还是1602的液晶,还是彩色的TFT的液晶,原理上是差不多的,只不过一般的黑白液晶是用0和1来显示一个点,比如0代表不现实,1代表显示,这样一堆的点就能够组合出图案了。彩屏的原理也一样,只不过因为要表示彩色,所以不能只用“黑”和“白”来表示,需要用更多的数字区分不同的颜色

        总结:将每个点的颜色信息发送到屏幕模块上,就能显示图像了

    针对童芯派,童芯派上是128×128个点组成的,即128行,128列,一共128×128个点,如果是用01表示黑白,那么这些点理论上需要128×128×1b的存储空间(b是小写的,即bit,位,8b=1B),如果我们要显示16位的图像,那么就需要128x128x16b=128x128x2B的空间来存储这些图像信息(存储空间不用太关注,但现实的原理要了解,回头写程序用)

        程序:

        正常传统的思路是根据液晶的芯片手册来编写程序,将每个点的信息写入到模块里。这显然太麻烦了,arduino创客玩家不这么玩,另外官方也提供了底层的驱动库,我们直接拿来用。

        

        上图是童芯派库的目录文件结构(PIO里截的图,这样比较好看),其中lcd.c就是底层驱动,cyberpi.cpp是“逻辑层”驱动,可以理解为cyberpi.cpp是在lcd.c的基础上将功能进行了进一步封装。

        这次我们需要的函数在cyberpi.cpp中,函数名称及参数

    void CyberPi::set_lcd_pixel(uint8_t x,uint8_t y,uint16_t color)

        set_lcd_pixel函数需要3个参数,从上边讲述的原理很容易联想到x和y分别对应LCD的要显示点的位置,color就是要显示图像对应点的颜色。然后写个循环将上次用(【工具】TFT彩屏图片点阵取模工具,Img2Lcd图片取模软件,图片生成c语言头文件)工具生成的数组循环发给LCD就行了

        for(int y=0;y<128;y++)
        {
            for(int x=0;x<128;x++)
            {
               picL   = gImage_IMG16_XHR[128*x*2+2*y+1];//低位 在后
               picH   = gImage_IMG16_XHR[128*x*2+2*y];//高位 在前
               data16 = picL|picH<<8;
               cyber.set_lcd_pixel(y,x,data16);//底层是128×第二个变量+第一个变量
            }
        }
    

        其中gImage_IMG16_XHR[]就是用Img2Lcd工具将图片转换成的数组,生成的数组是16位的,所以需要将数组的高位和低位组合给data16(16位数据)。因为童芯派屏的方向是“歪”的,所以x、y交换一下位置就行了。

    你点的每个在看,我都当成喜欢

    展开全文
  • STM32F103 读取SD卡中的图片TFT彩屏显示C程序,程序包含编译全部内容,可直接使用
  • STM32F103 TFT彩屏显示汉字字符(取摸 无字库)C程序,程序包含编译后全部内容,可直接使用
  • 由51单片机构成的TFT液晶屏程序,可实现彩屏图片、数字、汉字显示
  • 2G 51单片机SD 卡读图片
  • SPI驱动彩屏.rar

    2021-09-04 09:22:19
    STM32F103VCT6 ,spi驱动彩屏显示文字、图形、图片,并结合按键显示的应用,详情参见笔者博客中的彩屏开发应用系列文章,笔者后续将更新sf9090
  • 彩屏驱动1. 驱动彩屏1.1 初始化引脚1.2 初始化彩屏2. 彩屏涂色3. 结果展示4. 获取资源 SPI驱动彩屏 笔者最近画了个嘉立创的紫色版,上面布有彩屏模块,不得不说嘉立创紫真的很nice! 是不是很cool 言归正传,...

    SPI驱动彩屏
    笔者最近画了个嘉立创的紫色版,上面布有彩屏模块,不得不说嘉立创紫真的很nice!
    是不是很cool
    言归正传,笔者曾经在学长#巨大的八爪鱼# 帮助下写过一篇FSMC驱动彩屏的文章,但是笔者并没有玩转彩屏,所以这次要出系列彩屏文章,形成一个完整的彩屏项目

    STM32F103VET6驱动彩屏TFT2.8(ili9341)HAL库+标准库

    可是!
    之前买的那块微雪彩屏价格直逼one hundred yuans,
    笔者果断放弃,不用FSMC驱动,找个便宜的裸屏

    在这里插入图片描述
    点击! 笔者购买的彩屏连接,便宜,还给你教程

    言归正传 ,这次是真的!

    1. 驱动彩屏

    彩屏对应引脚
    彩屏引脚
    TFT_CSPA4
    TFT_RESPE13
    D/RPE8
    SPI1_MOSIPA7
    SPI1_MISOPA6
    SPI1_SCKPA5
    TFT_LED+3.3V
    SPI3_MOSIPB5:
    SPI3_MISOPB4
    :SPI3_SCK:PB3:
    T_CSPA15
    T_IRQ:PE10-:
    注!TFT_LED引脚我直接接到一个按键上,用按键控制背光灯

    1.1 初始化引脚

    //打开需要用到的功能,配置输入输出模式
     RCC->APB2ENR =RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPEEN | RCC_APB2ENR_SPI1EN | RCC_APB2ENR_TIM1EN ;
      
      GPIOA->CRH = (GPIOA->CRH  & 0XFFFFF00F) | 0X4B0;
      
      GPIOE->CRH = (GPIOE->CRH & 0X00F00F0F) | 0X44037030;
    
    //spi初始化配置
    void SPI1_Init(void)	
    {
    	    /* SPI初始化 */
      GPIOA->CRL = (GPIOA->CRL & 0X0000FFFF) | 0Xb4bb0000;//spi引脚配置
      
      SPI1->CR1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_SPE; 
    }
    
    void LCD_GPIOInit(void)
    {
     
     //推挽输出   RES/DR配置
      GPIOE->CRH = (GPIOE->CRH & 0XFF0FFFF0) | 0X300003;
    
    }
    
    注!初始化引脚的内容就不罗嗦了
    //低电平复位
    void LCD_RESET(void)
    {
    	LCD_RST_CLR;
    	delay_ms(100);	
    	LCD_RST_SET;
    	delay_ms(100);
    }
    

    1.2 初始化彩屏

     void LCD_Init(void)
    {  
    	SPI1_Init(); //硬件SPI1初始化
    	LCD_GPIOInit();//LCD GPIO初始化										 
     	LCD_RESET(); //LCD 复位
    
     // LCD_WR_REG(0X01); 软件res
      // Power control B
      LCD_WR_REG (0xcf);
      LCD_WR_DATA (0x00);
      LCD_WR_DATA (0x81);
      LCD_WR_DATA ( 0x30);
      
      // Power on sequence control
      LCD_WR_REG (0xed);
      LCD_WR_DATA ( 0x64);
      LCD_WR_DATA ( 0x03);
      LCD_WR_DATA (0x12);
      LCD_WR_DATA ( 0x81);
      
      // Driver timing control A
      LCD_WR_REG (0xe8);
      LCD_WR_DATA (0x85);
      LCD_WR_DATA (0x10);
      LCD_WR_DATA (0x78);
      
      // Power control A
      LCD_WR_REG ( 0xcb);
      LCD_WR_DATA ( 0x39);
      LCD_WR_DATA (0x2c);
      LCD_WR_DATA (0x00);
      LCD_WR_DATA (0x34);
      LCD_WR_DATA ( 0x02);
      
      // Pump ratio control
      LCD_WR_REG (0xf7);
      LCD_WR_DATA(0x20);
      
      // Driver timing control B
      LCD_WR_REG ( 0xea);
      LCD_WR_DATA ( 0x00);
      LCD_WR_DATA ( 0x00);
      
      // Frame Rate Control (In Normal Mode/Full Colors)
      LCD_WR_REG ( 0xb1);
      LCD_WR_DATA ( 0x00);
      LCD_WR_DATA ( 0x1b);
      
      // Display Function Control
      LCD_WR_REG ( 0xb6);
      LCD_WR_DATA ( 0x0a);
      LCD_WR_DATA ( 0xa2);
      
      // Power Control 1
      LCD_WR_REG ( 0xc0);
      LCD_WR_DATA ( 0x35);
      
      // Power Control 2
      LCD_WR_REG ( 0xc1);
      LCD_WR_DATA ( 0x11);
      
      // VCOM Control 1
      LCD_WR_REG ( 0xc5);
      LCD_WR_DATA ( 0x45);
      LCD_WR_DATA ( 0x45);
      
      // VCOM Control 2
      LCD_WR_REG ( 0xc7);
      LCD_WR_DATA ( 0xa2);
      
      // Enable 3G
      LCD_WR_REG ( 0xf2);
      LCD_WR_DATA ( 0x00);
      
      // Gamma Set
      LCD_WR_REG ( 0x26);
      LCD_WR_DATA ( 0x01);
      
      // Positive Gamma Correction
      LCD_WR_REG ( 0xe0);
      LCD_WR_DATA ( 0x0f);
      LCD_WR_DATA ( 0x26);
      LCD_WR_DATA ( 0x24);
      LCD_WR_DATA ( 0x0b);
      LCD_WR_DATA ( 0x0e);
      LCD_WR_DATA ( 0x09);
      LCD_WR_DATA ( 0x54);
      LCD_WR_DATA ( 0xa8);
      LCD_WR_DATA ( 0x46);
      LCD_WR_DATA ( 0x0c);
      LCD_WR_DATA ( 0x17);
      LCD_WR_DATA ( 0x09);
      LCD_WR_DATA ( 0x0f);
      LCD_WR_DATA ( 0x07);
      LCD_WR_DATA ( 0x00);
      
      // Negative Gamma Correction
      LCD_WR_REG ( 0xe1);
      LCD_WR_DATA ( 0x00);
      LCD_WR_DATA ( 0x19);
      LCD_WR_DATA ( 0x1b);
      LCD_WR_DATA ( 0x04);
      LCD_WR_DATA ( 0x10);
      LCD_WR_DATA ( 0x07);
      LCD_WR_DATA ( 0x2a);
      LCD_WR_DATA ( 0x47);
      LCD_WR_DATA ( 0x39);
      LCD_WR_DATA ( 0x03);
      LCD_WR_DATA ( 0x06);
      LCD_WR_DATA ( 0x06);
      LCD_WR_DATA ( 0x30);
      LCD_WR_DATA ( 0x38);
      LCD_WR_DATA ( 0x0f);
      
      // Pixel Format Set
      LCD_WR_REG ( 0x3a);
      LCD_WR_DATA ( 0x55);
      
      // Sleep Out
      LCD_WR_REG ( 0x11);
      delay_ms(120);
      
    //  ILI9341_SetScanDirection(0); // 设置扫描方向
      LCD_WR_REG ( 0x29); // 允许显示显存中的图像 (后面还需要打开背光才能开显示)
     
     
      LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
    	
    	LCD_Clear(WRITE);//清全屏白色
    }
    

    上面的初始化的命令和数据都是根据ILI9341手册上写的,如下图
    在这里插入图片描述

    Power control B 对应着手册上的Command cfh ,后面的数据就是对应下面的三个参数分别为 0X00 0X81 0X30
    在这里插入图片描述

    运行代码,现在应该是 白色了,但是我们无法确定是否真的驱动成功,所以下面我们就要对屏幕进行涂色

    2. 彩屏涂色

    //这段代码是卖家给出的清屏代码,函数详细我再下面代码中注释了
    void LCD_Clear(u16 Color)
    {
      unsigned int i,m;  
      /*这个函数是设置显示图框,显示的横纵坐标起点和终点*/
    	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);   
    	LCD_CS_CLR;//将spi的cs拉低
    	LCD_RS_SET;//rs置一
    	for(i=0;i<lcddev.height;i++)//for循环遍历像素点
    	{
        for(m=0;m<lcddev.width;m++)
        {	
    			Lcd_WriteData_16Bit(Color);//将颜色数据写进去,显示在每个像素点
    		}
    	}
    	 LCD_CS_SET;//拉高 数据发送完毕
    } 
    
    
    涂色,发现彩屏并不是所有像素点都显示了红色,有三横的像素点显示不正常
    回到初始化彩屏代码,其中的sleep out 命令#退出低功耗模式,下面有个120ms的延时, 笔者将延时去掉
    结果如上图更多横的像素点没有被涂色
    所以将延时改到150ms,像素点显示正常,笔者将其定义为,彩屏未完全睡醒
    注:sleep out 初始化时必须要有的不然屏幕就是一直处于低功耗状态,一直为白屏,有兴趣的朋友可以尝试通过按键来切换彩屏的状态

    在这里插入图片描述

    3. 结果展示

    测试展示图
    嘿嘿!先来看看结果视频

    4. 获取资源

    【获取资源】

    1.资源链接:点击获取
    2.关注微信公众号后台回复:SPI驱动彩屏

    【注意】

    资源中有彩屏文字显示测试、图片显示测试、还有图形显示测试。

    后续笔者将更新彩屏文字显示等应用的文章
    【关注微信公众号一起来交流】

    ·

    展开全文
  • 此.c文件是在正点原子4.3寸ATK触摸屏上显示的代码。主要有汉字,字母,数字及1位,2位小数的显示。另有圆,方形,带边框纯色圆角方形,带边框二色圆角方形,带边框三色圆角方形等。供参考
  • stm32全彩屏 程序

    2018-02-27 16:55:54
    stm32 led全彩屏驱动,可以显示图片和任意汉字。。。。
  • TFT2.4彩屏资料

    2012-01-05 21:26:31
    TFT2.4彩屏资料包括图片,文字显示,程序简单,实用性强。。
  • 51实现彩屏显示

    2011-09-16 21:20:50
    很好的彩屏 ,驱动程序包 ,用51单片机实现彩屏程序的显示,实现画圈,文字输出以及图片的显示,有程序注释
  • 彩屏点阵生成

    2011-10-26 21:25:15
    14*14彩色图片生成器,生成c语言代码txt 加载后直接插入程序使用
  • 128x160彩屏资料

    2010-10-24 18:10:50
    HIMAX 128x160彩屏资料,为全英文资料
  • STM32F103彩屏资料

    2017-04-30 18:53:18
    该程序适用于STM32F103的彩屏驱动,能够实现触摸屏液晶调试
  • 这时就要考虑一个问题了,每次最少写入256Byte,怎么将图片数据存进去是个问题,一个图片数据就32KB,如果你将这个图片数据放到一个C文件放入工程,编译出来的hex文件要96KB,要知道12C5A60S2单片机ROM只有60KB,...
  • 单片机各种彩屏程序1G 51单片机SD 卡读图片彩屏,2.4 贪吃蛇实验 时钟温度1 2.4寸彩屏显示,TFT2.4汉字样例程序,RTC实时时钟DS13022.4寸彩屏显示,等13例
  • 玩tft彩屏和sd卡的目的之一就是把sd卡中的图片显示到彩屏上。 这有个简单的办法找到fat32文件系统中的图片依次显示在彩屏上。 sd卡驱动和彩屏驱动这里不涉及。就拿240*320的tft彩屏和1G的sd卡为例。 fat32文件...
  • 昨天碰到了这个问题:显示图片时,设置为16位真彩,240*320 3.2寸屏时 碰到这样一个函数GUI_DisPicture(50, 50, 50, 50); 通过图片取模软件取模时发现,只能取50*50大小的图片,大于这个尺寸,编译会报错 1.axf: ...
  • TFT320240彩屏

    2010-12-05 22:57:19
    一、SD卡读图片使用方法 二、不带SD卡的使用方法 三、触摸屏的使用
  • 这样显示的原因是摄像头的问题还是彩屏显示方向的问题?[img=https://img-bbs.csdn.net/upload/201711/26/1511690511_473652.png][/img][img=https://img-bbs.csdn.net/upload/201711/26/1511690520_557046.png][/...
  • 自己大学写的一个51单片机程序,读取SD卡图片,MP3,用TFT彩屏显示交互
  • 本程序是关于彩屏的程序,本程序介绍了彩屏彩色图片的显示历程,希望能给大家带来好处。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 858
精华内容 343
关键字:

彩屏图片