STM32驱动ST7701S芯片(vⅰV0手机换屏价)

1、配置GPIO口voidLCD_GPIO_Config(void){/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDefGPIO_InitStructure;/*????IO??*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE…

大家好,又见面了,我是你们的朋友全栈君。

1、配置GPIO口

void LCD_GPIO_Config(void)
{        
    /*定义一个GPIO_InitTypeDef类型的结构体*/
    GPIO_InitTypeDef GPIO_InitStructure;
    /* ????IO??*/
    RCC_APB2PeriphClockCmd ( RCC_APB2Periph_AFIO, ENABLE );
    /*开启GPIOD的外设时钟*/
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE); 
    
    /* 配置FSMC相对应的数据线,FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10 */    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_8 | GPIO_Pin_9 | 
                                                                GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_Init(GPIOD, &GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | 
                                                                GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | 
                                                                GPIO_Pin_15;
    GPIO_Init(GPIOE, &GPIO_InitStructure );     
    
    
    /* ??FSMC???????
     * PD4-FSMC_NOE   :LCD-RD
     * PD5-FSMC_NWE   :LCD-WR
     * PD7-FSMC_NE1   :LCD-CS
     * PD11-FSMC_A16  :LCD-DC
     */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 
    GPIO_Init (GPIOD, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
    GPIO_Init (GPIOD, & GPIO_InitStructure );
    
//    ST7789_CS_APBxClock_FUN ( ST7789_CS_CLK, ENABLE );
    GPIO_InitStructure.GPIO_Pin = ST7789_CS_PIN; 
    GPIO_Init ( ST7789_CS_PORT, & GPIO_InitStructure );  
    
//    ST7789_DC_APBxClock_FUN ( ST7789_DC_CLK, ENABLE );
    GPIO_InitStructure.GPIO_Pin = ST7789_DC_PIN; 
    GPIO_Init ( ST7789_DC_PORT, & GPIO_InitStructure );
    

  /* ??LCD??RST????*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
//    ST7789_RST_APBxClock_FUN ( ST7789_RST_CLK, ENABLE );
    GPIO_InitStructure.GPIO_Pin = ST7789_RST_PIN; 
    GPIO_Init ( ST7789_RST_PORT, & GPIO_InitStructure );
    
    
    /* ??LCD??????BK*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    
//    ST7789_BK_APBxClock_FUN ( ST7789_BK_CLK, ENABLE );
    GPIO_InitStructure.GPIO_Pin = ST7789_BK_PIN; 
    GPIO_Init ( ST7789_BK_PORT, & GPIO_InitStructure );
    
    
    //IO????????
   GPIO_SetBits ( ST7789_RST_PORT, ST7789_RST_PIN );    
   GPIO_SetBits ( ST7789_CS_PORT, ST7789_CS_PIN );
   GPIO_SetBits ( ST7789_DC_PORT, ST7789_DC_PIN );    
   GPIO_SetBits ( ST7789_BK_PORT, ST7789_BK_PIN );         
}

/*函数名:LCD_CmdWrite
 *功  能:向LCD控制器写命令号
 *返回值:无
 *参  数:u8 cmd命令号
 */
 void LCD_CmdWrite(u8 cmd)               
{

//    u16 num=0;   
    LCD_RSL;
    LCD_CSL;        
    LCD_RDH;
//    num=cmd;  
//    num |=((GPIOD->ODR)&0xFF00);
//    GPIOD->ODR =num;
        LCD_D0_WRITE(cmd);
        LCD_D1_WRITE(cmd);
        LCD_D2_WRITE(cmd);
        LCD_D3_WRITE(cmd);
        LCD_D4_WRITE(cmd);
        LCD_D5_WRITE(cmd);
        LCD_D6_WRITE(cmd);
        LCD_D7_WRITE(cmd);
    
    LCD_WRL;   
    LCD_WRH;    
    LCD_CSH;
    LCD_RSH;

}

/*函数名:LCD_DataWrite
 *功  能:向LCD控制器写命令参数
 *返回值:无
 *参  数:u8 data 要写入的数据
 */
 void LCD_DataWrite(u8 data)        
{

//    u16 num=0;   
    LCD_RSH; 
    LCD_CSL; 
    LCD_RDH;  
//    num=data;  
//    num |=((GPIOD->ODR)&0xFF00);
//    (GPIOD->ODR) =num;
        LCD_D0_WRITE(data);
        LCD_D1_WRITE(data);
        LCD_D2_WRITE(data);
        LCD_D3_WRITE(data);
        LCD_D4_WRITE(data);
        LCD_D5_WRITE(data);
        LCD_D6_WRITE(data);
        LCD_D7_WRITE(data);
    
    LCD_WRL;    
    LCD_WRH;    
    LCD_CSH;    
    
}

/*函数名:LCD_Reset
 *功  能:复位TFT屏
 *参  数:无
 *返回值:无
 */
static void LCD_Reset(void)
{

  //************* Reset LCD Driver ****************// 
    LCD_RSTH;    
    Delayms(1);  // Delayms 1ms 
    LCD_RSTL;  
    Delayms(10); // Delayms 10ms               // This delay time is necessary 
    LCD_RSTH;    
    Delayms(120); // Delayms 120 ms         
}
 

2、屏初始化

/*函数名:LCDInit
 *功  能:初始化TFT屏
 *参  数:无
 *返回值:无
 */

void LCD_Init(void)
{

//************* Reset LCD Driver ****************// 
    LCD_GPIO_Config();
    LCD_Reset();
//++++++++++ initializing funciton 1 +++++++++++++++++ 
//—————————————————————————————————//
        LCD_CmdWrite(0x11);
        Delay(120); //Delay 120ms

//——————————display and color format setting——————————–//
        LCD_CmdWrite(0x36);
        LCD_DataWrite(0x60);//0x60

        LCD_CmdWrite(0x3A);
        LCD_DataWrite(0x05);

//——————————–ST7789V Frame rate setting———————————-//
        LCD_CmdWrite(0xB2);
        LCD_DataWrite(0x0C);
        LCD_DataWrite(0x0C);
        LCD_DataWrite(0x00);
        LCD_DataWrite(0x33);
        LCD_DataWrite(0x33);

        LCD_CmdWrite(0xB7);
        LCD_DataWrite(0x35);

//———————————ST7789V Power setting————————————–//
        LCD_CmdWrite(0xBB);
        LCD_DataWrite(0x19);//0x1c

        LCD_CmdWrite(0xC0);
        LCD_DataWrite(0x2C);

        LCD_CmdWrite(0xC2);
        LCD_DataWrite(0x01);

        LCD_CmdWrite(0xC3);
        LCD_DataWrite(0x12);//0x0b

        LCD_CmdWrite(0xC4);
        LCD_DataWrite(0x20);

        LCD_CmdWrite(0xC6);
        LCD_DataWrite(0x0F);

        LCD_CmdWrite(0xD0);
        LCD_DataWrite(0xA4);
        LCD_DataWrite(0xA1);

//——————————–ST7789V gamma setting—————————————//
        LCD_CmdWrite(0xE0);
        LCD_DataWrite(0xd0);
        LCD_DataWrite(0x00);//0x00
        LCD_DataWrite(0x03);//0x03
        LCD_DataWrite(0x09);//0x09
        LCD_DataWrite(0x13);
        LCD_DataWrite(0x1c);//0x1c
        LCD_DataWrite(0x3a);//0x3a
        LCD_DataWrite(0x55);//0x55
        LCD_DataWrite(0x48);//0x48
        LCD_DataWrite(0x18);
        LCD_DataWrite(0x12);//0x12
        LCD_DataWrite(0x0e);//0x0e
        LCD_DataWrite(0x19);//0x19
        LCD_DataWrite(0x1e);//0x1e

        LCD_CmdWrite(0xE1);
        LCD_DataWrite(0xd0);
        LCD_DataWrite(0x00);//0x00
        LCD_DataWrite(0x03);//0x03
        LCD_DataWrite(0x09);//0x09
        LCD_DataWrite(0x05);//0x05
        LCD_DataWrite(0x25);//0x25
        LCD_DataWrite(0x3a);//0x3a
        LCD_DataWrite(0x55);//0x55
        LCD_DataWrite(0x50);//0x50
        LCD_DataWrite(0x3d);//0x3d
        LCD_DataWrite(0x1c);//0x1c
        LCD_DataWrite(0x1d);//0x1d
        LCD_DataWrite(0x1d);//0x1d
        LCD_DataWrite(0x23);//0x23
            
    LCD_CmdWrite(0x29); //display on
        
        LCD_CmdWrite(0x2C);  // Memory Write
        
        LCD_Clear(BLACK);

 

}

3、写屏操作

void LCD_Clear(u16 Color)
{

   u32 i;  
   Lcd_SetBox(0,0,320,240);  
   for(i=0;i<78900;i++){    //78900   
       LCD_WriteOneDot(Color); 
  }
}

void LCD_WriteOneDot(u16 color)

    LCD_DataWrite(color>>8);
    LCD_DataWrite(color);
}

写ASCII 16×16字符操作,这是写

static void LCD_write_acsii16x16(u8 data,u16 color,u16 xcolor ,u8 mode)//写字符
{

  u8 i=0,j=0,n=0;
  u8 avl=0;
  data -=0x20;                      
  for (i=0;i<16;i++) 
  {     

        avl=asc2_1608[data][i];
    for (j=0;j<8;j++)           
    {

      n++;
      if(avl&0x80)LCD_WriteOneDot(color);        
      else if(mode==0) LCD_WriteOneDot(xcolor);
      avl<<=1;
      if(n>15) {

        n=0;
        break;
      }//部分字体如英文16*16,形成的字库3个8位一组,每一组最后4位不显示,用该语句进行判断有几位不需要显示
    }     
   }
}

这是写英文字符的函数,但是写汉字则要将字体大小增加一倍,即32点阵大小。

void LCD_write_english_string(u16 x, u16 y, char *str,u8 mode)//英文字符串显示
{

    u16 k = 0;
  while ((*str<=’~’)&&(*str>=’ ‘)) 
  {

     Lcd_SetBox(x-k,y,16,16);
     LCD_write_acsii16x16( *str,WORDCOLOR,BACKCOLOR, mode);
     k+=16;
     str++;      
  }
}  

4、写英文字符当超过16点阵大小后,还按这种写入方法就会有问题,显示的字符是错误的。

      比如写入40*32的大小的点阵字符,先用字模工具PCtoLCD2002.exe生成字模,逐列显示(逐行的话有会有问题)

      将 Lcd_SetBox(x-k,y,16,16);函数去掉,循环的长度有16改为80,或其它生成的字模的长度。

      使用更改后的方法写入字符,显示就OK了

5、清除或写入一个区域的块

     void Lcd_ColorBox(u16 xStart,u16 yStart,u16 xlong,u16 ylong,u16 Color)
{

   u32 i,j;  
   j=xlong*ylong;
   Lcd_SetBox(xStart,yStart,xlong,ylong);  
   for(i=0;i<j;i++){       
       LCD_WriteOneDot(Color); 
  }
}

xlong,ylong为要显示或清除块的大小

 

这是在取字模显示的时候,遇到的一点问题,有其它方法的可以贴出来一起探讨一下

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128276.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • Oracle sql调优(网络优化知识点)

    文章目录一、访问数据的方法1、直接访问数据1.1全表扫描1.2ROWID扫描2、访问索引2.1索引唯一扫描2.2索引范围扫描2.3索引全扫描2.4索引快速全扫描2.5索引跳跃式扫描拓展补充本博客介绍一下属于oracle优化器范畴的一些基础知识,访问数据的方法,分为直接访问数据的方法和访问索引的方法两种,然后有了这些基础知识后,可以参考学习我的另外一篇博客:Oracle优化器简介,对…

  • 【高等数学】单射,满射,双射的区别

    【高等数学】单射,满射,双射的区别 

  • MS17010漏洞利用姿势

    MS17010漏洞利用姿势MSF在msf中常规的17-010打法如下扫描是否存在ms17-010漏洞:nmap-n-p445–scriptsmb-vuln-ms17-010192.168.1.0/24–openMSF常规漏洞利用msf>useexploit/windows/smb/ms17_010_eternalbluemsf>setrhost192.168.1.112目标出网时反向打:msf>setpayloadwindows/x64/met..

  • Codeforces 12D Ball 树形阵列模拟3排序元素

    Codeforces 12D Ball 树形阵列模拟3排序元素

  • ctf-web:关于文件上传漏洞的深入研究[通俗易懂]

    ctf-web:关于文件上传漏洞的深入研究[通俗易懂]上次我们研究了关于文件上传的漏洞,这次我们研究的内容属于上节课的补充内容,关于文件上传的绕过与防御.怎么说呢,算是一种锻炼吧.因为下个月有个awd的比赛,因此最近会经常发一些关于web的内容.其实我还是挺慌的,因为以前参加的都是ctf线上赛,而且我做的都是逆向这个方面的,然而这次突然来了个web,搞得我有点懵.web也是最近才开始研究的,所以写的可能不尽人意,希望各位大佬看看就好,不喜勿喷.一.实验环境我们这次的实验依然用的是上次的网站和phpstudy.我发在了下面.1.upload-f.

  • 小数和二进制的转换_进制转换表

    小数和二进制的转换_进制转换表1.小数用二进制如何表示首先,给出一个任意实数,整数部分用普通的二进制便可以表示,这里只说小数部分如何表示例如0.6文字描述该过程如下:将该数字乘以2,取出整数部分作为二进制表示的第1位;然后再将小数部分乘以2,将得到的整数部分作为二进制表示的第2位;以此类推,知道小数部分为0。特殊情况:小数部分出现循环,无法停止,则用有限的二进制位无法准确表示一个小数,这也是在编程语言中表

    2022年10月31日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号