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账号...

(0)


相关推荐

  • SPI接口调试

    SPI接口调试以MCP2515芯片的SPI接口为例说明。

  • 女生适合学习Java吗?

    女生适合学习Java吗?在这个信息爆炸的时代,互联网行业成为了高薪的代名词,Java技术因其具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,作为最流行的语言,学习的人也是越来越多。在很多人看来,学习java似乎是男生的专利,难道真的只有男生才能学好Java成为优秀的java工程师吗?“女生适合学Java吗?”“女程序员就业前景好不好?”“女生学Jav

  • installous下载ipa目录

    installous下载ipa目录/private/var/mobile/Documents/Installous/Downloads

  • Python实现排列组合算法

    Python实现排列组合算法实现组合算法C(n,k),可以用递归实现:importcopy#实现list的深复制defcombine(lst,l):result=[]tmp=[0]*llength=len(lst)defnext_num(li=0,ni=0):ifni==l:result.append…

    2022年10月20日
  • SpringCloud与Dubbo的比较

    SpringCloud与Dubbo的比较Dubbo一、dubbo简介Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。现已发展成为Apache的顶级孵化开源项目,详见官网:…

  • JS代码大全

    JS代码大全事件源对象 event.srcElement.tagName event.srcElement.type捕获释放 event.srcElement.setCapture

发表回复

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

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