IAR for STM8L标准库驱动ST7735 1.8‘‘LCD显示

IAR for STM8L标准库驱动ST7735 1.8’'LCD显示


  • ✨STM8驱动ST7735 1.8’'LCD屏幕的话,自己移植的话,可以参考stm32标准库驱动来移植,GPIO的操作方式和STM32标准库函数名都一致,移植起来改动量很少,这仅针对软件驱动方式。
  • 🌿本移植代码是基于中景园的屏幕驱动资料参考移植过来的。厂家所给的驱动资料中并不带STM8系列的驱动示例代码。
  • 🌻驱动显示效果
    在这里插入图片描述
  • 👉🏻驱动屏幕资料可以前往《1.8寸TFT LCD128X160 ST7735S SPI串口屏驱动示例
  • 🔖本代码是基于STM8L052R8单片机驱动的,对于STM8L系列基本通用,其他系列需要做修改,并不能通用。

📓LCD核心驱动代码

  • 🌿lcd_init..c
#include "lcd_init.h"
#include "delay.h"

static void LCD_GPIO_Init( void )
{

    GPIO_Init( GPIOD, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow );
//	GPIO_SetBits(GPIOD,GPIO_Pin_12);
    GPIO_Init( GPIOD, GPIO_Pin_1 , GPIO_Mode_Out_PP_High_Slow );//CS
    GPIO_Init( GPIOD, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Slow );
    GPIO_Init( GPIOD, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Slow );
    GPIO_Init( GPIOD, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Slow );
    
    
//    GPIO_SetBits( GPIOD, GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 );
    GPIO_Init( GPIOE, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow );//BLK
    GPIO_Init( GPIOD, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Slow );//
//    GPIO_SetBits( GPIOE, GPIO_Pin_2 | GPIO_Pin_3 );
}


/******************************************************************************
      函数说明:LCD串行数据写入函数
      入口数据:dat  要写入的串行数据
      返回值:  无
******************************************************************************/
void LCD_Writ_Bus( u8 dat )
{
    u8 i;
    LCD_CS_Clr();
    for( i = 0; i < 8; i++ )
    {
        LCD_SCLK_Clr();
        if( dat & 0x80 )
        {
            LCD_MOSI_Set();
        }
        else
        {
            LCD_MOSI_Clr();
        }
        LCD_SCLK_Set();
        dat <<= 1;
    }
    LCD_CS_Set();
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA8( u8 dat )
{
    LCD_Writ_Bus( dat );
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA( u16 dat )
{
    LCD_Writ_Bus( dat >> 8 );
    LCD_Writ_Bus( dat );
}


/******************************************************************************
      函数说明:LCD写入命令
      入口数据:dat 写入的命令
      返回值:  无
******************************************************************************/
void LCD_WR_REG( u8 dat )
{
    LCD_DC_Clr();//写命令
    LCD_Writ_Bus( dat );
    LCD_DC_Set();//写数据
}


/******************************************************************************
      函数说明:设置起始和结束地址
      入口数据:x1,x2 设置列的起始和结束地址
                y1,y2 设置行的起始和结束地址
      返回值:  无
******************************************************************************/
void LCD_Address_Set( u16 x1, u16 y1, u16 x2, u16 y2 )
{
    if( USE_HORIZONTAL == 0 )
    {
        LCD_WR_REG( 0x2a ); //列地址设置
        LCD_WR_DATA( x1 );
        LCD_WR_DATA( x2 );
        LCD_WR_REG( 0x2b ); //行地址设置
        LCD_WR_DATA( y1 );
        LCD_WR_DATA( y2 );
        LCD_WR_REG( 0x2c ); //储存器写
    }
    else if( USE_HORIZONTAL == 1 )
    {
        LCD_WR_REG( 0x2a ); //列地址设置
        LCD_WR_DATA( x1 );
        LCD_WR_DATA( x2 );
        LCD_WR_REG( 0x2b ); //行地址设置
        LCD_WR_DATA( y1 );
        LCD_WR_DATA( y2 );
        LCD_WR_REG( 0x2c ); //储存器写
    }
    else if( USE_HORIZONTAL == 2 )
    {
        LCD_WR_REG( 0x2a ); //列地址设置
        LCD_WR_DATA( x1 );
        LCD_WR_DATA( x2 );
        LCD_WR_REG( 0x2b ); //行地址设置
        LCD_WR_DATA( y1 );
        LCD_WR_DATA( y2 );
        LCD_WR_REG( 0x2c ); //储存器写
    }
    else
    {
        LCD_WR_REG( 0x2a ); //列地址设置
        LCD_WR_DATA( x1 );
        LCD_WR_DATA( x2 );
        LCD_WR_REG( 0x2b ); //行地址设置
        LCD_WR_DATA( y1 );
        LCD_WR_DATA( y2 );
        LCD_WR_REG( 0x2c ); //储存器写
    }
}

void LCD_ST7735_Init( void )
{
    LCD_GPIO_Init();//初始化GPIO

    LCD_RES_Clr();//复位
    delay_ms( 100 );
    LCD_RES_Set();
    delay_ms( 100 );

    LCD_BLK_Set();//打开背光
    delay_ms( 100 );

    //************* Start Initial Sequence **********//
    LCD_WR_REG( 0x11 ); //Sleep out
    delay_ms( 120 );            //Delay 120ms
    //------------------------------------ST7735S Frame Rate-----------------------------------------//
    LCD_WR_REG( 0xB1 );
    LCD_WR_DATA8( 0x05 );
    LCD_WR_DATA8( 0x3C );
    LCD_WR_DATA8( 0x3C );
    LCD_WR_REG( 0xB2 );
    LCD_WR_DATA8( 0x05 );
    LCD_WR_DATA8( 0x3C );
    LCD_WR_DATA8( 0x3C );
    LCD_WR_REG( 0xB3 );
    LCD_WR_DATA8( 0x05 );
    LCD_WR_DATA8( 0x3C );
    LCD_WR_DATA8( 0x3C );
    LCD_WR_DATA8( 0x05 );
    LCD_WR_DATA8( 0x3C );
    LCD_WR_DATA8( 0x3C );
    //------------------------------------End ST7735S Frame Rate---------------------------------//
    LCD_WR_REG( 0xB4 ); //Dot inversion
    LCD_WR_DATA8( 0x03 );
    //------------------------------------ST7735S Power Sequence---------------------------------//
    LCD_WR_REG( 0xC0 );
    LCD_WR_DATA8( 0x28 );
    LCD_WR_DATA8( 0x08 );
    LCD_WR_DATA8( 0x04 );
    LCD_WR_REG( 0xC1 );
    LCD_WR_DATA8( 0XC0 );
    LCD_WR_REG( 0xC2 );
    LCD_WR_DATA8( 0x0D );
    LCD_WR_DATA8( 0x00 );
    LCD_WR_REG( 0xC3 );
    LCD_WR_DATA8( 0x8D );
    LCD_WR_DATA8( 0x2A );
    LCD_WR_REG( 0xC4 );
    LCD_WR_DATA8( 0x8D );
    LCD_WR_DATA8( 0xEE );
    //---------------------------------End ST7735S Power Sequence-------------------------------------//
    LCD_WR_REG( 0xC5 ); //VCOM
    LCD_WR_DATA8( 0x1A );
    LCD_WR_REG( 0x36 ); //MX, MY, RGB mode
    if( USE_HORIZONTAL == 0 )LCD_WR_DATA8( 0x00 );
    else if( USE_HORIZONTAL == 1 )LCD_WR_DATA8( 0xC0 );
    else if( USE_HORIZONTAL == 2 )LCD_WR_DATA8( 0x70 );
    else LCD_WR_DATA8( 0xA0 );
    //------------------------------------ST7735S Gamma Sequence---------------------------------//
    LCD_WR_REG( 0xE0 );
    LCD_WR_DATA8( 0x04 );
    LCD_WR_DATA8( 0x22 );
    LCD_WR_DATA8( 0x07 );
    LCD_WR_DATA8( 0x0A );
    LCD_WR_DATA8( 0x2E );
    LCD_WR_DATA8( 0x30 );
    LCD_WR_DATA8( 0x25 );
    LCD_WR_DATA8( 0x2A );
    LCD_WR_DATA8( 0x28 );
    LCD_WR_DATA8( 0x26 );
    LCD_WR_DATA8( 0x2E );
    LCD_WR_DATA8( 0x3A );
    LCD_WR_DATA8( 0x00 );
    LCD_WR_DATA8( 0x01 );
    LCD_WR_DATA8( 0x03 );
    LCD_WR_DATA8( 0x13 );
    LCD_WR_REG( 0xE1 );
    LCD_WR_DATA8( 0x04 );
    LCD_WR_DATA8( 0x16 );
    LCD_WR_DATA8( 0x06 );
    LCD_WR_DATA8( 0x0D );
    LCD_WR_DATA8( 0x2D );
    LCD_WR_DATA8( 0x26 );
    LCD_WR_DATA8( 0x23 );
    LCD_WR_DATA8( 0x27 );
    LCD_WR_DATA8( 0x27 );
    LCD_WR_DATA8( 0x25 );
    LCD_WR_DATA8( 0x2D );
    LCD_WR_DATA8( 0x3B );
    LCD_WR_DATA8( 0x00 );
    LCD_WR_DATA8( 0x01 );
    LCD_WR_DATA8( 0x04 );
    LCD_WR_DATA8( 0x13 );
    //------------------------------------End ST7735S Gamma Sequence-----------------------------//
    LCD_WR_REG( 0x3A ); //65k mode
    LCD_WR_DATA8( 0x05 );
    LCD_WR_REG( 0x29 ); //Display on
}

  • 🌿lcd_init.h
#ifndef __LCD_INIT_H
#define __LCD_INIT_H

#include "stm8l15x.h"

#define USE_HORIZONTAL 1  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏


#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
#define LCD_W 128
#define LCD_H 160

#else
#define LCD_W 160
#define LCD_H 128
#endif



//-----------------LCD端口定义---------------- 

#define LCD_SCLK_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_2)//SCL=SCLK
#define LCD_SCLK_Set() GPIO_SetBits(GPIOD,GPIO_Pin_2)

#define LCD_MOSI_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_5)//SDA=MOSI
#define LCD_MOSI_Set() GPIO_SetBits(GPIOD,GPIO_Pin_5)

#define LCD_RES_Clr()  GPIO_ResetBits(GPIOD,GPIO_Pin_4)//RES
#define LCD_RES_Set()  GPIO_SetBits(GPIOD,GPIO_Pin_4)

#define LCD_DC_Clr()   GPIO_ResetBits(GPIOD,GPIO_Pin_6)//DC
#define LCD_DC_Set()   GPIO_SetBits(GPIOD,GPIO_Pin_6)
 		     
#define LCD_CS_Clr()   GPIO_ResetBits(GPIOD,GPIO_Pin_1)//CS
#define LCD_CS_Set()   GPIO_SetBits(GPIOD,GPIO_Pin_1)

#define LCD_BLK_Clr()  GPIO_ResetBits(GPIOE,GPIO_Pin_2)//BLK
#define LCD_BLK_Set()  GPIO_SetBits(GPIOE,GPIO_Pin_2)


//void LCD_GPIO_Init(void);//初始化GPIO
void LCD_Writ_Bus(u8 dat);//模拟SPI时序
void LCD_WR_DATA8(u8 dat);//写入一个字节
void LCD_WR_DATA(u16 dat);//写入两个字节
void LCD_WR_REG(u8 dat);//写入一个指令
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//设置坐标函数
void LCD_ST7735_Init(void);//LCD初始化

#endif
  • 📝main函数DEMO代码
int main( void )
{
    float t = 0;
    /* STM8 configuration */
    MCU_Config();

    /* ST7735 configuration */
    LCD_ST7735_Init();//LCD初始化
    LCD_Fill( 0, 0, LCD_W, LCD_H, WHITE );

    /* Benchmark variables */
    uint8_t i;
    uint16_t frames       = 0;
    uint16_t fps          = 0;
    uint16_t loops        = 0;
    uint16_t loops_overal = 0;

    char     fps_c[15];
    /* Infinite loop */
    for( ;; )
    {

        if( !timer_1s )
        {
            timer_1s     = 1000;
            fps          = frames;
            frames       = 0;
            loops_overal = loops;
            loops        = 0;
        }
        /* ST7735 demo code */
        LCD_ShowChinese( 0, 0, "中景园电子", RED, WHITE, 24, 0 );
        LCD_ShowString( 24, 30, "LCD_W:", RED, WHITE, 16, 0 );
        LCD_ShowIntNum( 72, 30, LCD_W, 3, RED, WHITE, 16 );
        LCD_ShowString( 24, 50, "LCD_H:", RED, WHITE, 16, 0 );
        LCD_ShowIntNum( 72, 50, LCD_H, 3, RED, WHITE, 16 );
        LCD_ShowFloatNum1( 24, 70, t, 4, RED, WHITE, 16 );
        
        LCD_ShowPicture( 70, 80, 40, 40, gImage_1 );
        sprintf( fps_c, " FPS: %02d", fps );
        LCD_ShowString( 0, 122, ( u8* )fps_c, RED, WHITE, 16, 0 );
        sprintf( fps_c, " LOOP: %04d %03d", loops_overal, i );
        LCD_ShowString( 0, 142, ( u8* )fps_c, RED, WHITE, 16, 0 );
        frames++;
        loops++;
        i++;
        t += 0.11;
    }
}

📚驱动工程代码

链接:https://pan.baidu.com/s/1Lx45UUegBsoFI7W74udSyg 
提取码:z072
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值