让Pegasus天马座开发板用上OLED屏

news2024/9/28 21:23:58

继上篇《让Pegasus天马座开发板吃上STM8S标准库》移植完标准库之后,于是我又想为天马座开发板添加一块屏幕。终于在我的零件箱底下找到了沉入箱底多年的0.96OLED屏幕。

屏幕介绍

这个是128x64像素的屏幕模块,其使用的SSD1306的驱动IC。而目前该模组,只支持3/4线SPI及I2C通信方式。

 硬件连接

我将天马座开发板通过4线SPI方式与OLED屏模组进行通信。板子与屏幕相关的连接如下代码所示

/****************时钟*********************/
#define OLED_SCL_PORT  (GPIOC)
#define OLED_SCL_PINS  (GPIO_PIN_3)

/****************数据*********************/
#define OLED_SDA_PORT  (GPIOC)
#define OLED_SDA_PINS  (GPIO_PIN_4)

/****************复位*********************/
#define OLED_RES_PORT  (GPIOC)
#define OLED_RES_PINS  (GPIO_PIN_5)

/****************数据/命令*********************/
#define OLED_DC_PORT  (GPIOC)
#define OLED_DC_PINS  (GPIO_PIN_6)

/****************片选*********************/
#define OLED_CS_PORT  (GPIOC)
#define OLED_CS_PINS  (GPIO_PIN_7)

接线图如下: 

 功能定义

我根据STM8S003P6及OLED硬件资源情况,主要定义了以下几个功能。

  1. 屏幕显示文字及数字
  2. 屏幕显示按钮的状态
  3. 通过按钮对屏幕显示参数进行配置

功能实现 

OLED驱动移植

在购买OLED屏幕时候,卖家已经提供了该屏幕的SSD1306驱动。因此,只需将相关代码移植到Pegasus天马座开发板示例工程代码中即可。此处,移植过程不做介绍。如有需要的小伙伴,可参考我释放出来的工程代码,进行了解。

功能代码

实现功能定义的代码如下:

main.c

#include "config.h"
#include "delay.h"
#include "oled.h"

#define LED_GPIO_PORT       GPIOD
#define LED_PIN  			GPIO_PIN_4

#define BUTTON_GPIO_PORT    GPIOD
#define BUTTON_PIN  		GPIO_PIN_3

uint32_t count = 0;
#define TIM4_PERIOD       124

void tim4_isr() __interrupt(ITC_IRQ_TIM4_OVF)
{
    static uint16_t ctr = 0;
    if (++ctr >= 100) {
		count++;
        ctr = 0;
    }
    /* Cleat Interrupt Pending bit */
    TIM4_ClearITPendingBit(TIM4_IT_UPDATE);    
}

static void set_timer()
{
    /* Time base configuration */
    TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
    /* Clear TIM4 update flag */
    TIM4_ClearFlag(TIM4_FLAG_UPDATE);
    /* Enable update interrupt */
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
    
    /* enable interrupts */
    enableInterrupts();

    /* Enable TIM4 */
    TIM4_Cmd(ENABLE);
}

static void init_gpio()
{
    GPIO_Init(LED_GPIO_PORT, LED_PIN, GPIO_MODE_OUT_PP_LOW_FAST);
    GPIO_Init(BUTTON_GPIO_PORT, BUTTON_PIN, GPIO_MODE_IN_PU_NO_IT); 
    OLED_Init(); 
}


void set_screen_color_and_display(uint8_t cfg)
{
    // BIT0作为屏幕颜色控制  0: 正常显示, 1: 反色显示
    OLED_ColorTurn(cfg & 0x01);
    // BIT1作为屏幕颜色控制  0: 正常显示   1: 屏幕翻转显示  
    OLED_DisplayTurn((cfg >> 1) & 0x01);
}

void main(void)
{
	static uint8_t testBuffer[32] = {0};
	static uint8_t k = 0;
    bool isKeyDown = FALSE;
    uint8_t screenCfg = 0;
    uint8_t t = ' ';
	disable_interrupts();
	for (uint16_t i = 0; i < sizeof(testBuffer); i++)
	{
		testBuffer[i] = i;
	}
	enable_interrupts();
	LOG("Startup...\r\n");
	DUMP(testBuffer,sizeof(testBuffer));
	init_gpio();
	set_timer();
    OLED_ColorTurn(0);//0正常显示,1 反色显示
    OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示    
    while (1)
    {             
        GPIO_WriteReverse(LED_GPIO_PORT,LED_PIN);
        isKeyDown = GPIO_ReadInputPin(BUTTON_GPIO_PORT,BUTTON_PIN) == RESET;
        LOG("<OLED Test> app_sdcc == %u -- %lu, key %s\r\n",k++,count, isKeyDown ? "down" : "up");
        if (isKeyDown == TRUE)
        {
           if (++screenCfg > 3)
           {
                screenCfg = 0;
           }
           set_screen_color_and_display(screenCfg);
           OLED_Clear();
        }
        
        OLED_ShowString(25,0,"Pegasus Board",8);
        OLED_ShowString(35,2,"2023/09/20",8);
        OLED_ShowString(20,4,isKeyDown ? "Button Down" : "Button Up  ",8);
        OLED_ShowNum(103,4,k,3,8);
        OLED_ShowString(0,6,"ASCII:",8);  
        OLED_ShowString(63,6,"CODE:",8);
        OLED_ShowChar(48,6,t,8);
        t++;
        if(t>'~')t=' ';
        OLED_ShowNum(103,6,t,3,8);
        delay_ms(500);
    }
} 


#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  LOG("Wrong parameters value: file %s on line %d\r\n", file, line);	

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

运行效果

让Pegasus天马座开发板用上OLED屏

工程分享

工程下载路径

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

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

相关文章

软件测试为什么外包更好?权威软件测试外包公司应该具备的资质

软件测试外包公司是一家专门从事软件测试服务的企业&#xff0c;其主要任务是帮助公司或个人进行软件产品的测试工作。相比较于自行开设测试部门或雇佣全职测试人员&#xff0c;外包软件测试具有成本更低、灵活性更高的优势。同时&#xff0c;外包公司通常拥有丰富的测试经验和…

Java高级-Junit单元测试框架

单元测试框架 1.介绍2.案例、断言机制3.常见注解 1.介绍 单元测试 就是在针对最小的功能单元方法&#xff0c;编写测试代码对其正确性测试 Junit单元测试框架 可以对方法进行测试&#xff0c;是第三方公式开源出来的 优点 可以灵活的编写测试代码&#xff0c;可以针对某个…

Stable Diffusion 参数介绍及用法

大模型 CheckPoint 介绍 作用&#xff1a;定调了作图风格&#xff0c;可以理解为指挥者 安装路径&#xff1a;models/Stable-diffusion 推荐&#xff1a; AnythingV5Ink_v32Ink.safetensors cuteyukimixAdorable_midchapter2.safetensors manmaruMix_v10.safetensors counterf…

leetcode刷题笔记——位运算

C/C语言中逻辑右移和算数右移共享同一个运算符>> 如果运算数类型是unsigned则采用逻辑右移&#xff0c;而signed则采用算数右移。对于signed类型的数据&#xff0c;如果需要使用算数右移&#xff0c;或者unsigned类型的数据需要使用逻辑右移&#xff0c;都需要进行类型转…

JAVASE---认识异常

在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。 1.算数异常 2.数组越界异常 3.空指针异常 java中不同类型的异常&#xff0c;都有与其对应的类来进行描述。 异常的体系结构 1. Throwable&#xff1a;是异常体系的顶层类&#xff0c;其派生出两个重要的子…

阿里云服务器租用费用价格表(2023新版报价)

租用阿里云服务器怎么收费&#xff1f;阿里云服务器配置不同一年价格也不同&#xff0c;阿里云2核2G3M带宽108元一年、2核4G4M带宽297.98元12个月&#xff0c;云服务器u1公网带宽可选1M到5M&#xff0c;系统盘为ESSD云盘40GB起&#xff0c;CPU内存配置可选2核2G、2核4G、4核8G、…

Python爬虫在电商数据获取与分析中的应用

前言 随着电商平台的兴起&#xff0c;越来越多的人开始在网上购物。而对于电商平台来说&#xff0c;商品信息、价格、评论等数据是非常重要的。因此&#xff0c;抓取电商平台的商品信息、价格、评论等数据成为了一项非常有价值的工作。本文将介绍如何使用Python编写爬虫程序&a…

BaseRecyclerView - 一个强大的RecyclerAdapter框架

官网 BRVAH 项目介绍 高效的使用RecyclerView应对项目中的常见需求的Adapter&#xff0c;RecycleView从未如此简单&#xff01; BRVAH官方使用指南 BRVAH官方使用指南&#xff08;持续更新&#xff09; - 简书

智慧交通:连接城市未来的纽带

在当今快节奏的现代生活中&#xff0c;交通问题一直是城市面临的重要挑战之一。拥堵、事故和空气污染等问题不仅影响着居民的日常生活&#xff0c;也对经济和环境产生了负面影响。为了解决这些问题&#xff0c;智慧交通作为一项重要的技术和社会创新出现在我们的视野中。 智慧交…

docker镜像相关

docker镜像相关 docker镜像相关理解解释unionFS&#xff08;联合文件系统&#xff09;镜像加载原理docker镜像要采用这种分层结构 重点理解docker镜像commit 操作实例案例演示总结 docker镜像相关理解 解释 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;它包含…

软考高级之系统架构师之企业应用集成EAI

概述 在企业信息化建设的过程中&#xff0c;由于缺乏统一规划和总体布局&#xff0c;往往形成多个信息孤岛。信息孤岛使数据的一致性无法得到保证&#xff0c;信息无法共享和反馈&#xff0c;需要重复多次的采集和输入。信息孤岛是企业信息化一个重要的负面因素&#xff0c;其…

SpringBoot结合Vue.js+axios框架实现增删改查功能+网页端实时显示数据库数据(包括删除多条数据)

本文适用对象&#xff1a;已有基础的同学&#xff0c;知道基础的SpringBoot配置和Vue操作。 在此基础上本文实现基于SpringBoot和Vue.js基础上的增删改查和数据回显、刷新等。 一、实时显示数据库数据 实现步骤&#xff1a; 第1步&#xff1a;编写动态请求响应类&#xff1…

由河北吉力宝战略发展规划看中国品牌商业发展新方向

当今时代&#xff0c;一个经济体的发展和崛起背后&#xff0c;往往是一批民族品牌在提供强力的支撑。中国作为全世界最大的发展中国家&#xff0c;在经济建设中取得了举世瞩目的发展成就&#xff0c;各个行业涌现出一批优秀的国民品牌。 随着高质量发展成为各行各业的广泛共识…

docker alpine:3.16 root权限安装Anaconda3-2020.07-Linux-x86_64和jdk

首先查看系统版本: rootfv-az454-287:/tmp# uname -a Linux fv-az454-287 5.15.0-1046-azure #53~20.04.1-Ubuntu SMP Mon Aug 28 14:17:23 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux rootfv-az454-287:/tmp# grep NA /etc/os-release NAME"Ubuntu" PRETTY_NAME&q…

笔记本电脑没有麦克风,声音无法找到输入设备

新买的电脑没有扬声器&#xff0c;电脑声音没有输入设备&#xff0c;在开腾讯会议的时候才发现竟然有这个问题。 网上找原因&#xff0c;哎&#xff0c;找了一大堆每一个靠谱的 这让我想起来上次电脑没有热键的问题&#xff0c;所有问题的终极解决方案&#xff0c;都在源头那里…

加密算法总结

数字签名、信息加密 是前后端开发都经常需要使用到的技术&#xff0c;应用场景包括了用户登入、交易、信息通讯、oauth 等等&#xff0c;不同的应用场景也会需要使用到不同的签名加密算法&#xff0c;或者需要搭配不一样的 签名加密算法 来达到业务目标。这里简单的给大家介绍几…

如何给我们项目中的node_modules里面的包打补丁

背景 我们项目所依赖的一个包因为版本问题&#xff0c;可能在低版本的情况下&#xff0c;会出现报错。我们希望能patch这个错误。 // shopee-rn/nebula import { reportUIError } from shopee/react-native-sdk;useEffect(() > {if (!__DEV__) {reportUIError(); // shope…

node_modules/XXX/index.js:XXX;XX ||= XXX?.[level];SyntaxError: Une

这个语法是 ECMAScript 2021的语法 还挺新的 对node版本要求会比较高 这里这个 icon || this.options.icon?.[level];意思就是 如果this.options.icon [level] 拿得到值 就等于它 否则 如果拿不到 icon 就等于自己 要解决这个问题 一个是你可以提高node版本 但我不建议 还是…

centos 部署 xray

目录 1、部署 xray 2、部署测试靶场 jdk8 安装 tomcat 部署 3、测试 基础 web 扫描 GET 请求的扫描&#xff1a; POST 请求的扫描 参数和选项说明 1、部署 xray 选择最新的 xray 社区版下载 Releases chaitin/xray GitHub 解压后运行&#xff1a; ./xray_linux_a…

公司用什么软件监控员工工作状态的?(如何监控员工上班电脑的工作情况?)

在现代的商业环境中&#xff0c;管理和监控员工的工作内容是至关重要的。为了确保员工的工作效率和质量&#xff0c;公司需要使用一些工具来监控他们的工作进程。以下是五款实用的监控员工工作内容的软件&#xff0c;其中包括了洞察眼MIT系统。 洞察眼MIT系统 洞察眼MIT系统是…