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

news2024/10/2 22:29:44

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/787905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java基础教程】(四十六)IO篇 · 下:System类对IO的支持:错误输出、信息输出、系统输入,字符缓冲流、扫描流和对象序列化流~

Java基础教程之IO操作 下 &#x1f539;本节学习目标1️⃣ System类对 IO 的支持1.1 错误输出&#xff1a;System.err1.2 信息输出&#xff1a;System.out1.3 系统输入&#xff1a;System. in 2️⃣ 字符缓冲流&#xff1a;BufferedReader3️⃣ 扫描流&#xff1a;Scanner4️⃣…

【Latex】官方文档教你长公式对齐方法

具体请参见下面链接 Aligning equations with amsmath - Overleaf, Online LaTeX Editor 详细介绍了各种公式的对齐方式&#xff0c;特别是 长公式的换行方法 以及多公式排列情况&#xff1a;

ctfshow-web2

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 最简单的SQL注入0x02 Write Up 这道题很多wp&#xff0c;但是为了完整性还是写一下 知道这里是sql注入&#xff0c;确认一下是什么类型的闭合 使用a or 11 #进行测试 可以知道闭合是单引号闭合&#xff0c;然后查一下显示的…

openGauss学习笔记-20 openGauss 简单数据管理-DISTINCT

文章目录 openGauss学习笔记-20 openGauss 简单数据管理-DISTINCT20.1 语法格式20.2 参数说明20.3 示例 openGauss学习笔记-20 openGauss 简单数据管理-DISTINCT DISTINCT关键字与SELECT语句一起使用&#xff0c;用于去除重复记录&#xff0c;只获取唯一的记录。 当一个表中有…

【python中级】 base64编码将图片数据转化为成字符串

【python中级】 base64编码将图片数据转化为成字符串 1、背景2、图片base64编码1、背景 在Qt编程的时候,有的地方比如logo需要加载图片,在程序打包之后,需要将图片拷贝进项目。 能不能将图片转化成一串字符串,使用该字符串代替图像地址。 即这样就可以字符串变量的形式编…

Terraform学习日记-AWS-EC2

terraform install https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli 这里我们使用 aws-linux-2022 作为执行环境 # sudo yum install -y yum-utils# sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/…

选择合适的图表,高效展现数据魅力

随着大数据时代的来临&#xff0c;数据的重要性愈发凸显&#xff0c;数据分析和可视化成为了决策和传递信息的重要手段。在数据可视化中&#xff0c;选择合适的图表是至关重要的一环&#xff0c;它能让数据更加生动、直观地呈现&#xff0c;为观众提供更有说服力的信息。本文将…

从娱乐产品到效率工具,ARknovv首款AR眼镜回归“AR本质”

如果说2022年是AR的元年&#xff0c;2023年则有望成为消费级AR眼镜的新拐点。 今年AR眼镜行业发展明显加快&#xff0c;且不断有大厂入局&#xff1a;今年2月小米发布无线AR眼镜探索版&#xff1b;3月荣耀也推出了一款全新的观影眼镜&#xff1b;而苹果在6月发布的MR头显Visio…

【java】2208. 将数组和减半的最少操作次数

给你一个正整数数组 nums 。每一次操作中&#xff0c;你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。&#xff08;注意&#xff0c;在后续操作中你可以对减半过的数继续执行操作&#xff09; 请你返回将 nums 数组和 至少 减少一半的 最少 操作数。 示例 1&#…

Android性能优化之游戏的Theme背景图

近期&#xff0c;对游戏的内存优化&#xff0c;通过内存快照发现&#xff0c;某个Activity的theme背景图 占用3M 多。考虑着手对齐进行优化。 问题 查看游戏中的内存快照&#xff0c;发现有一个图片bitmap 占用3M 多&#xff0c;设置在Activity的背景中&#xff1a; 查看Phon…

用户档案与用户画像:很容易混淆

用户档案与用户画像&#xff1a;很容易混淆 需求分析或设计需要梳理 趣讲大白话&#xff1a;搞清楚怎么来&#xff0c;才能用好 【趣讲信息科技236期】 **************************** User Profile&#xff0c;不知道谁提出来的。被译为用户档案或用户简要&#xff0c;它是基于…

一篇文章搞定《APP的启动流程》

一篇文章搞定《APP的启动流程》 前言冷启动、温启动、热启动启动中的重要成员简介zygote进程InstrumentationSystemServer进程ActivityManagerServiceBinderActivityThread 启动的步骤详解一、点击桌面图标二、创建进程三、初始化APP进程四、APP进程与System_server的绑定五、初…

《深度解析Docker与微服务架构:构建灵活可扩展的现代应用》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【SQL语句复习】第1-2章

SQL复习 学习目标&#xff1a;复习SQL语句 学习地址&#xff1a;https://linklearner.com/learn/detail/70 第一章 初始数据库 数据库是将大量数据保存起来&#xff0c;通过计算机加工而成的可以进行高效访问的数据集合。该数据集合称为数据库&#xff08;Database&#xf…

大学生用一周时间给麦当劳做了个App(Vue版)

背景 有个大学生粉丝最近私信联系我&#xff0c;说基于我之前开源的多语言项目做了个仿麦当劳的项目&#xff0c;虽然只是个样子货&#xff0c;但是收获颇多&#xff0c;希望把自己写的代码开源出来供大家一起学习进度。这个小伙伴确实是非常积极上进&#xff0c;很多大学生&a…

C盘空间不足:解决办法完整教程

当C盘空间不足时&#xff0c;你可以尝试以下几种解决方案&#xff1a; 1. 清理临时文件&#xff1a;使用Windows自带的磁盘清理工具&#xff0c;可以删除临时文件、回收站中的文件和其他不必要的系统文件&#xff0c;释放一些空间&#xff0c;推荐使用工具分区助手。 2. 卸载不…

数据库版本管理工具Flyway入门实战

From version control to continuous delivery, Flyway helps individuals, teams, and enterprises build on application delivery processes to automate database development. 1.引言 在项目开发中&#xff0c;一直在探索如何进行数据库的版本管理。关注的公众号推送了…

踩坑 视觉SLAM 十四讲第二版 ch8 编译及运行问题

1.fmt相关 CMakeLists.txt中&#xff1a;在后面加上 fmt target_link_libraries(optical_flow ${OpenCV_LIBS} fmt ) target_link_libraries(direct_method ${OpenCV_LIBS} ${Pangolin_LIBRARIES} fmt )2.不存在用户定义的从 "std::_Bind<void (OpticalFlowTracker::…

动态内存管理函数的使用与优化技巧(内存函数、柔性数组)

目录 前言 一、动态内存函数 为什么存在动态内存分配 动态内存函数介绍 malloc和free calloc realloc 常见的错误 经典笔试题目 二、C/C程序的内存开辟 三、柔性数组 柔性数组的特点&#xff1a; 柔性数组的使用 柔性数组的优势 前言 动态内存管理函数是C语言中非常重要的一部…

Verilog 学习之路(三)——牛客刷题篇

1.输入序列连续的序列检测 题面 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJH9kHFH-1690301233803)(https://s2.loli.net/2023/07/26/HJPXR2mhbaVCG6d.png)]思路 对于序列检测题目&#xff0c;常规的解法有两种&#xff1a;状态机法和序列缓存…