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

2023-09-20 19:12:02

继上篇《让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屏

工程分享

工程下载路径

更多推荐

ReactNative中升级IOS 17版本Crash解决

ReactNative中升级IOS17版本Crash解决ReactNative中升级IOS17版本Crash解决一、问题描述二、原因分析三、解决方案决策3.1设置宽高为非零值3.2使用新的UIGraphicsImageRenderer替换就版本的UIGraphicsBeginImageContext四、可能使用到该AP

构建无缝的服务网格体验:分享在生产环境中构建和管理服务网格的最佳实践

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Go 微服务开发框架 DMicro 的设计思路

Go微服务开发框架DMicro的设计思路DMicro源码地址:Gitee:dmicro:dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等背景DMicro诞生的背景,是因为我写了10来年的PHP,想在公司内部推广Go,公司内部的组件及rpc协议都是基于swoole定制化开发的。调研了市

个人所思所想录

🧑‍💻作者名称:DaenCode🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······😎人生感悟:尝尽人生百味,方知世间冷暖。📖所属专栏:项目所感所想文章目录🌟绪论🌟编

平价护眼台灯推荐,2023百元台灯性价比最高的品牌推荐

想要选好护眼台灯首先我们要知道什么是护眼台灯,大的方向来看,护眼台灯就是可以保护视力的台灯,深入些讲就是具备让灯发出接近自然光特性的光线,同时光线不会伤害人眼而出现造成眼部不适甚至是视力降低的照明设备。从细节上看就要具体到护眼台灯的设计、硬核技术、贴心细节、光源的把控等等,灯光的覆盖面积也是关键,综合下才能确定什么才是

Linux- inode & vnode

什么是inodeinode是UNIX和UNIX-like操作系统中的一个关键概念。它代表了文件系统中文件或目录的元数据。每个文件和目录在文件系统中都有一个与之关联的inode。这个数据结构存储了关于文件的所有信息,除了其名称和实际数据之外。以下是inode中通常包含的信息:文件类型:如常规文件、目录、字符设备、块设备、

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

C++——内存管理

目录C/C++内存分布C++内存管理方式new/delete操作内置类型new和delete操作自定义类型new失败operatornew与operatordelete函数new和delete实现原理内置类型自定义类型定位new常见问题malloc/free和new/delete的区别C/C++内存分布栈又叫堆栈--非

Puppeteer无头浏览器:开启自动化之门,掌握浏览器世界的无限可能

大概还是入门期,我曾用Puppeteer做爬虫工具以此来绕过某网站的防爬机制。近期有需求要做任意链接网页截图,像这种场景非常适合用Puppeteer完成。无头浏览器我已知的还有Selenium。完成截图需求踩的最大的坑不是具体的逻辑代码,而是Docker部署Puppeteer到服务器总是缺少某个包。踩坑过程我想另外写一

如何利用软文推广进行SEO优化(打造优质软文,提升网站排名)

在当今的互联网时代,SEO优化成为了网站推广的关键。而软文推广作为一种有效的推广方式,其优点不仅仅局限于SEO,还可以带来更多的曝光和用户流量。本文将深入探讨如何做好软文推广,从而提升网站排名和流量。了解目标受众群体内容在进行软文推广之前,需要对目标受众群体进行详细的了解。包括年龄、性别、职业、喜好等方面,以便准确把握

什么是ELK

什么是ELKELK并不是一个技术框架的名称,它其实是一个三位一体的技术名词,ELK的每个字母都来自一个技术组件,分别是Elasticsearch(简称ES)、Logstash和Kibana。三个技术组件是独立的,后两个被elastic公司收购,通常配合起来使用。ELK的组成部分Elasticsearch:是一个分布式的

热文推荐