zoukankan      html  css  js  c++  java
  • STM32 LCD和触摸屏

    显示图片函数:参数:(横坐标,纵坐标,图片像素大小长宽,图片数组指针)

     1 /*
     2 函数功能:显示图片
     3 函数形参:x,y,width,height,*color_buff
     4 */
     5 void lcd_dis_pic(u16 x, u16 y, u16 width, u16 height, u8 *color_buff)
     6 {
     7     u32 i = 0;
     8     
     9     LCD_ILI9486_CMD(0x2A);                      //发送0x2A命令,设置X轴坐标
    10     LCD_ILI9486_Parameter((x & 0xff00) >> 8);  //发送X轴起始坐标的高8位
    11     LCD_ILI9486_Parameter((x & 0x00ff));       //发送X轴起始坐标的低8位
    12     LCD_ILI9486_Parameter(((x + width - 1) & 0xff00) >> 8);  //发送X轴结束坐标的高8位
    13     LCD_ILI9486_Parameter(((x + width - 1) & 0x00ff));       //发送X轴结束坐标的低8位
    14     
    15     LCD_ILI9486_CMD(0x2B);                      //发送0x2B命令,设置Y轴坐标
    16     LCD_ILI9486_Parameter((y & 0xff00) >> 8);  //发送Y轴起始坐标的高8位
    17     LCD_ILI9486_Parameter((y & 0x00ff));       //发送Y轴起始坐标的低8位
    18     LCD_ILI9486_Parameter(((y + height - 1) & 0xff00) >> 8);  //发送Y轴结束坐标的高8位
    19     LCD_ILI9486_Parameter(((y + height - 1) & 0x00ff));       //发送Y轴结束坐标的低8位
    20     
    21     LCD_ILI9486_CMD(0x2C);                      //发送0x2A命令,设置LCD显示颜色
    22     for(i = 0; i < width * height; i++)  //循环清屏区域的每一个像素点
    23     {
    24         LCD_ILI9486_Parameter((color_buff[2 * i] << 8) + color_buff[2 * i + 1]);
    25     }
    26 }

    LCD初始化:

      1 /******************** LCD引脚初始化函数 *******************
      2 LCD显示屏硬件管脚对应关系:
      3 数据线:
      4 DB0---PD14    DB1---PD15    DB2---PD0    DB3---PD1
      5 DB4---PE7    DB5---PE8    DB6---PE9    DB7---PE10
      6 DB8---PE11    DB9---PE12    DB10---PE13    DB11---PE14
      7 DB12---PE15    DB13---PD8    DB14---PD9    DB15---PD10
      8 控制线:
      9 WR---PD5    RD---PD4    CS---PG12    RS---PF12    BL--PB15
     10 **********************************************************/
     11 void LCD_Port_Init(void)
     12 {
     13     /* 使能LCD硬件管脚时钟 */
     14     RCC->AHB1ENR |= (1<<3);//开PD
     15     RCC->AHB1ENR |= (1<<4);//开PE
     16     RCC->AHB1ENR |= (1<<6);//开PG
     17     RCC->AHB1ENR |= (1<<1);//开PB
     18     RCC->AHB1ENR |= (1<<5);//开PF
     19     
     20     
     21     /* 设置LCD硬件管脚模式 */
     22     /* DB0~DB15数据线:推挽输出  时钟50M */
     23     GPIOD->MODER |=(0X1<<(2*14))|(0X1<<(2*15));   //配置成通用输出  
     24     GPIOD->OSPEEDR |=(0X2<<(2*14))|(0X2ul<<(2*15)); //配置成输出速率50M         
     25     
     26     GPIOD->MODER |=(0X1<<(2*0))|(0X1<<(2*1));     //配置成通用输出  
     27     GPIOD->OSPEEDR |=(0X2<<(2*0))|(0X2<<(2*1));   //配置成输出速率50M
     28     
     29     GPIOE->MODER |=0x55554000;                    //配置成通用输出  
     30     GPIOE->OTYPER |= 0;                           //配置成输出推挽
     31     GPIOE->OSPEEDR |=0x55554000;                  //配置成输出速率50M
     32 
     33     GPIOD->MODER |=(0X1<<(2*8))|(0X1<<(2*9))|(0X1<<(2*10));  //配置成通用输出  
     34     GPIOD->OSPEEDR |=(0X2<<(2*1))|(0X2<<(2*1))|(0X2<<(2*1));   //配置成输出速率50M
     35     
     36     /* 控制线:推挽输出  时钟50M 空闲为高电平 */
     37     GPIOD->MODER |=(0X1<<(2*4))|(0X1<<(2*5));  //配置成通用输出  
     38     GPIOD->OSPEEDR |=(0X2<<(2*4))|(0X2<<(2*5));
     39     GPIOD->ODR |= (1<<4)|(1<<5);
     40     
     41     GPIOG->MODER |=(0X1<<(2*12));              //配置成通用输出  
     42     GPIOG->OSPEEDR |=(0X2<<(2*12));
     43     GPIOG->ODR |= (1<<12);
     44 
     45     GPIOF->MODER |=(0X1<<(2*12));              //配置成通用输出  
     46     GPIOF->OSPEEDR |=(0X2<<(2*12));
     47     GPIOF->ODR |= (1<<12);
     48     
     49     GPIOB->MODER |=(0X1<<(2*15));               //配置成通用输出  
     50     GPIOB->OSPEEDR |=(0X2ul<<(2*15));
     51     GPIOB->ODR &= ~(1<<15);                     //关闭背光,在LCD初始化完后再打开
     52 }
     53 
     54 /******************* LCD写命令函数 *********************************
     55 参数:需要输入的命令
     56 ********************************************************************/
     57 void LCD_ILI9486_CMD(u16 common)
     58 {
     59     GPIOG->ODR &= ~(1 << 12);    //CS拉低
     60     GPIOF->ODR &= ~(1 << 12);    //D/C拉低
     61     GPIOD->ODR &= ~(1 << 5);     //WR拉低
     62     //LCD_Output_Data(cmd);        //输出命令数据
     63     /* 把命令发送到数据总线 */
     64     if(common&0x01)   GPIOD->BSRRL = (1<<14); else GPIOD->BSRRH = (1<<14);
     65     if(common&0x02)   GPIOD->BSRRL = (1<<15); else GPIOD->BSRRH = (1<<15);
     66     if(common&0x04)   GPIOD->BSRRL = (1<<0);  else GPIOD->BSRRH = (1<<0);
     67     if(common&0x08)   GPIOD->BSRRL = (1<<1);  else GPIOD->BSRRH = (1<<1);
     68     if(common&0x10)   GPIOE->BSRRL = (1<<7);  else GPIOE->BSRRH = (1<<7);
     69     if(common&0x20)   GPIOE->BSRRL = (1<<8);  else GPIOE->BSRRH = (1<<8);
     70     if(common&0x40)   GPIOE->BSRRL = (1<<9);  else GPIOE->BSRRH = (1<<9);
     71     if(common&0x80)   GPIOE->BSRRL = (1<<10); else GPIOE->BSRRH = (1<<10);
     72     if(common&0x0100) GPIOE->BSRRL = (1<<11); else GPIOE->BSRRH = (1<<11);
     73     if(common&0x0200) GPIOE->BSRRL = (1<<12); else GPIOE->BSRRH = (1<<12);
     74     if(common&0x0400) GPIOE->BSRRL = (1<<13); else GPIOE->BSRRH = (1<<13);
     75     if(common&0x0800) GPIOE->BSRRL = (1<<14); else GPIOE->BSRRH = (1<<14);
     76     if(common&0x1000) GPIOE->BSRRL = (1<<15); else GPIOE->BSRRH = (1<<15);
     77     if(common&0x2000) GPIOD->BSRRL = (1<<8);  else GPIOD->BSRRH = (1<<8);
     78     if(common&0x4000) GPIOD->BSRRL = (1<<9);  else GPIOD->BSRRH = (1<<9);
     79     if(common&0x8000) GPIOD->BSRRL = (1<<10); else GPIOD->BSRRH = (1<<10);
     80     GPIOD->ODR |= 1 << 5;        //WR拉高
     81     GPIOG->ODR |= 1 << 12;       //拉高CS
     82 }
     83 
     84 /******************* LCD写数据函数 *********************************
     85 参数:需要输入的命令
     86 ********************************************************************/
     87 void LCD_ILI9486_Parameter(u16 data)
     88 {
     89     GPIOG->ODR &= ~(1 << 12);    //CS拉低
     90     GPIOF->ODR |= 1 << 12;       //D/C拉高
     91     GPIOD->ODR &= ~(1 << 5);     //WR拉低
     92     //LCD_Output_Data(data);        //输出命令数据
     93     /* 把数据发送到数据总线 */
     94     if(data&0x01)   GPIOD->BSRRL = (1<<14); else GPIOD->BSRRH = (1<<14);
     95     if(data&0x02)   GPIOD->BSRRL = (1<<15); else GPIOD->BSRRH = (1<<15);
     96     if(data&0x04)   GPIOD->BSRRL = (1<<0);  else GPIOD->BSRRH = (1<<0);
     97     if(data&0x08)   GPIOD->BSRRL = (1<<1);  else GPIOD->BSRRH = (1<<1);
     98     if(data&0x10)   GPIOE->BSRRL = (1<<7);  else GPIOE->BSRRH = (1<<7);
     99     if(data&0x20)   GPIOE->BSRRL = (1<<8);  else GPIOE->BSRRH = (1<<8);
    100     if(data&0x40)   GPIOE->BSRRL = (1<<9);  else GPIOE->BSRRH = (1<<9);
    101     if(data&0x80)   GPIOE->BSRRL = (1<<10); else GPIOE->BSRRH = (1<<10);
    102     if(data&0x0100) GPIOE->BSRRL = (1<<11); else GPIOE->BSRRH = (1<<11);
    103     if(data&0x0200) GPIOE->BSRRL = (1<<12); else GPIOE->BSRRH = (1<<12);
    104     if(data&0x0400) GPIOE->BSRRL = (1<<13); else GPIOE->BSRRH = (1<<13);
    105     if(data&0x0800) GPIOE->BSRRL = (1<<14); else GPIOE->BSRRH = (1<<14);
    106     if(data&0x1000) GPIOE->BSRRL = (1<<15); else GPIOE->BSRRH = (1<<15);
    107     if(data&0x2000) GPIOD->BSRRL = (1<<8);  else GPIOD->BSRRH = (1<<8);
    108     if(data&0x4000) GPIOD->BSRRL = (1<<9);  else GPIOD->BSRRH = (1<<9);
    109     if(data&0x8000) GPIOD->BSRRL = (1<<10); else GPIOD->BSRRH = (1<<10);
    110     GPIOD->ODR |= 1 << 5;        //WR拉高
    111     GPIOG->ODR |= 1 << 12;       //拉高CS
    112 }
    113 
    114 /********************** LCD清屏函数 ******************************************
    115 参数:
    116 SX、EX:X轴的起始坐标和结束坐标
    117 SY、EY:Y轴的起始坐标和结束坐标
    118 Color: 屏幕颜色
    119 ******************************************************************************/
    120 void LCD_Clear(u16 SX, u16 EX, u16 SY, u16 EY, u16 Color)
    121 {
    122     u32 i;
    123     
    124     LCD_ILI9486_CMD(0x2A);                      //发送0x2A命令,设置X轴坐标
    125     LCD_ILI9486_Parameter((SX & 0xff00) >> 8);  //发送X轴起始坐标的高8位
    126     LCD_ILI9486_Parameter((SX & 0x00ff));       //发送X轴起始坐标的低8位
    127     LCD_ILI9486_Parameter((EX & 0xff00) >> 8);  //发送X轴结束坐标的高8位
    128     LCD_ILI9486_Parameter((EX & 0x00ff));       //发送X轴结束坐标的低8位
    129     
    130     LCD_ILI9486_CMD(0x2B);                      //发送0x2B命令,设置Y轴坐标
    131     LCD_ILI9486_Parameter((SY & 0xff00) >> 8);  //发送Y轴起始坐标的高8位
    132     LCD_ILI9486_Parameter((SY & 0x00ff));       //发送Y轴起始坐标的低8位
    133     LCD_ILI9486_Parameter((EY & 0xff00) >> 8);  //发送Y轴结束坐标的高8位
    134     LCD_ILI9486_Parameter((EY & 0x00ff));       //发送Y轴结束坐标的低8位
    135     
    136     LCD_ILI9486_CMD(0x2C);                      //发送0x2A命令,设置LCD显示颜色
    137     for(i = 0; i < (EX - SX + 1) * (EY - SY + 1); i++)  //循环清屏区域的每一个像素点
    138     {
    139         LCD_ILI9486_Parameter(Color);
    140     }
    141 }
    142 
    143 /********************** LCD初始化函数 *******************************************/
    144 void LCD_Init(void)
    145 {
    146     LCD_Port_Init();
    147     //************* Reset LCD Driver ****************//
    148     systick_delay_ms(120); // Delay 120 ms
    149     //************* Start Initial Sequence **********//
    150     LCD_ILI9486_CMD(0XF2);
    151     LCD_ILI9486_Parameter(0x18);
    152     LCD_ILI9486_Parameter(0xA3);
    153     LCD_ILI9486_Parameter(0x12);
    154     LCD_ILI9486_Parameter(0x02);
    155     LCD_ILI9486_Parameter(0XB2);
    156     LCD_ILI9486_Parameter(0x12);
    157     LCD_ILI9486_Parameter(0xFF);
    158     LCD_ILI9486_Parameter(0x10);
    159     LCD_ILI9486_Parameter(0x00);
    160     LCD_ILI9486_CMD(0XF8);
    161     LCD_ILI9486_Parameter(0x21);
    162     LCD_ILI9486_Parameter(0x04);
    163     LCD_ILI9486_CMD(0XF9);
    164     LCD_ILI9486_Parameter(0x00);
    165     LCD_ILI9486_Parameter(0x08);
    166     LCD_ILI9486_CMD(0x36);
    167     LCD_ILI9486_Parameter(0x08);   //设置RGB,含排线的屏
    168 //    LCD_ILI9486_Parameter(0x00);   //设置RGB,不含排线的屏BGR
    169     LCD_ILI9486_CMD(0x3A);
    170     LCD_ILI9486_Parameter(0x05);   //设置16位BPP
    171     LCD_ILI9486_CMD(0xB4);
    172     LCD_ILI9486_Parameter(0x01);//0x00
    173     LCD_ILI9486_CMD(0xB6);
    174     LCD_ILI9486_Parameter(0x02);
    175     LCD_ILI9486_Parameter(0x22);
    176     LCD_ILI9486_CMD(0xC1);
    177     LCD_ILI9486_Parameter(0x41);
    178     LCD_ILI9486_CMD(0xC5);
    179     LCD_ILI9486_Parameter(0x00);
    180     LCD_ILI9486_Parameter(0x07);//0X18
    181     LCD_ILI9486_CMD(0xE0);
    182     LCD_ILI9486_Parameter(0x0F);
    183     LCD_ILI9486_Parameter(0x1F);
    184     LCD_ILI9486_Parameter(0x1C);
    185     LCD_ILI9486_Parameter(0x0C);
    186     LCD_ILI9486_Parameter(0x0F);
    187     LCD_ILI9486_Parameter(0x08);
    188     LCD_ILI9486_Parameter(0x48);
    189     LCD_ILI9486_Parameter(0x98);
    190     LCD_ILI9486_Parameter(0x37);
    191     LCD_ILI9486_Parameter(0x0A);
    192     LCD_ILI9486_Parameter(0x13);
    193     LCD_ILI9486_Parameter(0x04);
    194     LCD_ILI9486_Parameter(0x11);
    195     LCD_ILI9486_Parameter(0x0D);
    196     LCD_ILI9486_Parameter(0x00);
    197     LCD_ILI9486_CMD(0xE1);
    198     LCD_ILI9486_Parameter(0x0F);
    199     LCD_ILI9486_Parameter(0x32);
    200     LCD_ILI9486_Parameter(0x2E);
    201     LCD_ILI9486_Parameter(0x0B);
    202     LCD_ILI9486_Parameter(0x0D);
    203     LCD_ILI9486_Parameter(0x05);
    204     LCD_ILI9486_Parameter(0x47);
    205     LCD_ILI9486_Parameter(0x75);
    206     LCD_ILI9486_Parameter(0x37);
    207     LCD_ILI9486_Parameter(0x06);
    208     LCD_ILI9486_Parameter(0x10);
    209     LCD_ILI9486_Parameter(0x03);
    210     LCD_ILI9486_Parameter(0x24);
    211     LCD_ILI9486_Parameter(0x20);
    212     LCD_ILI9486_Parameter(0x00);
    213     LCD_ILI9486_CMD(0x11);   //退出睡眠
    214     systick_delay_ms(120);
    215     LCD_ILI9486_CMD(0x29);   //开启显示
    216     
    217     /* 以下由用户按实际编写 */
    218     LCD_Clear(0,319,0,479,0xffff);  //把屏幕清成白色
    219     GPIOB->ODR |= 1 << 15;          //开LCD背光灯
    220 }
  • 相关阅读:
    Linux中的邮件发送
    Python学习笔记18-发送邮件
    Ansible学习笔记
    eclipse使用maven打包时去掉测试类
    CentOS安装redis
    spring boot 部署
    sprint boot 配置
    spring-boot 学习笔记一
    不要容忍破窗户
    阿里云安装Oracle
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/11615636.html
Copyright © 2011-2022 走看看