STM32CUBEMX(12)--IIC,12864OLED(0.96寸)移植

发布者:清新天空最新更新时间:2023-09-28 来源: elecfans关键字:STM32CUBEMX  IIC  移植 手机看文章 扫描二维码
随时随地手机看文章

概述

I2C总线硬件简单,资源消耗少,只有时钟和数据线。本例程主要讲解如何点亮0.96寸的OLED屏幕,本例程采用的是STM32F030R8T6,64K大小的Flash。


硬件准备

首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:

在这里插入图片描述

OLED显示屏就是淘宝上IIC接口的12864模块。在这里插入图片描述

选择芯片型号

使用STM32CUBEMX选择芯片stm32f030r8,如下所示:

在这里插入图片描述

配置时钟源

HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:

在这里插入图片描述

配置时钟树

STM32F0的最高主频到48M,所以配置48即可:

在这里插入图片描述

IIC配置

本次实验使用的IIC与显示屏通信,配置如下。

在这里插入图片描述

生成工程设置

注意在生产工程设置中不能出现中文,不然会报错。

在这里插入图片描述

生成代码

在这里插入图片描述

配置keil

在这里插入图片描述


驱动代码

oled.c

#include "oled.h"

#include "i2c.h"

#include "oledfont.h"          //头文件


uint8_t CMD_Data[]={

0xAE,    

0x00,    

0x10,    

0x40,    

0xB0,

0x81,

0xFF,

0xA1,

0xA6,

0xA8,

0x3F,                    

0xC8,

0xD3,

0x00,

0xD5,

0x80,

0xD8,

0x05,

0xD9,

0xF1,

0xDA,

0x12,

0xD8,

0x30,

0x8D,

0x14,    

0xAF    

};      //初始化命令



void WriteCmd(void)

{

    uint8_t i = 0;

    for(i=0; i<27; i++)

    {

        HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,CMD_Data+i,1,0x100);

    }

}

//向设备写控制命令

void OLED_WR_CMD(uint8_t cmd)

{

    HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);

}

//向设备写数据

void OLED_WR_DATA(uint8_t data)

{

    HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,0x100);

}

//初始化oled屏幕

void OLED_Init(void)

{     

    HAL_Delay(200);


    WriteCmd();

}

//清屏

void OLED_Clear(void)

{

    uint8_t i,n;            

    for(i=0;i<8;i++)  

    {  

        OLED_WR_CMD(0xb0+i);//设置页地址(0~7)

        OLED_WR_CMD (0x00); //设置显示位置—列低地址

        OLED_WR_CMD (0x10); //设置显示位置—列高地址

        for(n=0;n<128;n++)

            OLED_WR_DATA(0);//更新显示

    } 

}

//开启OLED显示    

void OLED_Display_On(void)

{

    OLED_WR_CMD(0X8D);  //SET DCDC命令

    OLED_WR_CMD(0X14);  //DCDC ON

    OLED_WR_CMD(0XAF);  //DISPLAY ON

}

//关闭OLED显示     

void OLED_Display_Off(void)

{

    OLED_WR_CMD(0X8D);  //SET DCDC命令

    OLED_WR_CMD(0X10);  //DCDC OFF

    OLED_WR_CMD(0XAE);  //DISPLAY OFF

}    

//坐标设置 

void OLED_Set_Pos(uint8_t x, uint8_t y) 

{     

    OLED_WR_CMD(0xb0+y);

    OLED_WR_CMD(((x&0xf0)>>4)|0x10);

    OLED_WR_CMD(x&0x0f);


void OLED_On(void)  

{  

    uint8_t i,n;            

    for(i=0;i<8;i++)  

    {  

        OLED_WR_CMD(0xb0+i);    //设置页地址(0~7)

        OLED_WR_CMD(0x00);      //设置显示位置—列低地址

        OLED_WR_CMD(0x10);      //设置显示位置—列高地址   

        for(n=0;n<128;n++)

            OLED_WR_DATA(1); 

    } //更新显示

}

unsigned int oled_pow(uint8_t m,uint8_t n)

{

    unsigned int result=1;   

    while(n--)result*=m;    

    return result;

}

//显示2个数字

//x,y :起点坐标     

//len :数字的位数

//size:字体大小

//mode:模式    0,填充模式;1,叠加模式

//num:数值(0~4294967295);              

void OLED_ShowNum(uint8_t x,uint8_t y,unsigned int num,uint8_t len,uint8_t size2)

{             

    uint8_t t,temp;

    uint8_t enshow=0;                          

    for(t=0;t10,len-t-1))%10;

        if(enshow==0&&t<(len-1))

        {

            if(temp==0)

            {

                OLED_ShowChar(x+(size2/2)*t,y,' ',size2);

                continue;

            }else enshow=1; 


        }

        OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 

    }

//在指定位置显示一个字符,包括部分字符

//x:0~127

//y:0~63

//mode:0,反白显示;1,正常显示                 

//size:选择字体 16/12 

void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)

{          

    unsigned char c=0,i=0;  

        c=chr-' ';//得到偏移后的值         

        if(x>128-1)

        {

            x=0;

            y=y+2;

        }

        if(Char_Size ==16)

            {

            OLED_Set_Pos(x,y);  

            for(i=0;i<8;i++)

                OLED_WR_DATA(F8X16[c*16+i]);

            OLED_Set_Pos(x,y+1);

            for(i=0;i<8;i++)

                OLED_WR_DATA(F8X16[c*16+i+8]);

            }

            else {  

                OLED_Set_Pos(x,y);

                for(i=0;i<6;i++)

                OLED_WR_DATA(F6x8[c][i]);


            }

}


//显示一个字符号串

void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)

{

    unsigned char j=0;

    while (chr[j]!='')

    {       

        OLED_ShowChar(x,y,chr[j],Char_Size);//一次显示一个字符

            x+=8;

        if(x>120){x=0;y+=2;}

            j++;

    }

}

//显示汉字

//hzk 用取模软件得出的数组

void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)

{                      

    uint8_t t,adder=0;

//定位(0xbx,x为第几行。0x1x ,x为列地址 高四位;0x0x,x为列地址第4位。

//比如你想定 位到第3行,第126(0x7e)列,就要写WrCmd(0xb3);WrCmd(0x17);WrCmd(0x0e);)    

    OLED_Set_Pos(x,y);  

    for(t=0;t<16;t++)

        {

                OLED_WR_DATA(Hzk[2*no][t]);

                adder+=1;

     }    

        OLED_Set_Pos(x,y+1);    

    for(t=0;t<16;t++)

            {   

                OLED_WR_DATA(Hzk[2*no+1][t]);

                adder+=1;

      }                    

}

oled.h

#ifndef __OLED_H__

#define __OLED_H__


#include "stm32f0xx_hal.h"


///

#define   OLED_GPIO_CLK_ENABLE()         __HAL_RCC_GPIOA_CLK_ENABLE()


#define   GPIOx_OLED_PORT               GPIOB

#define   OLED_SCK_PIN                  GPIO_PIN_6

#define   OLED_SCK_ON()                 HAL_GPIO_WritePin(GPIOx_OLED_PORT, OLED_SCK_PIN, GPIO_PIN_SET)

#define   OLED_SCK_OFF()                HAL_GPIO_WritePin(GPIOx_OLED_PORT, OLED_SCK_PIN, GPIO_PIN_RESET)

#define   OLED_SCK_TOGGLE()             HAL_GPIO_TogglePin(GPIOx_OLED_PORT, OLED_SCK_PIN)

#define   OLED_SDA_PIN                  GPIO_PIN_7

#define   OLED_SDA_ON()                 HAL_GPIO_WritePin(GPIOx_OLED_PORT, OLED_SDA_PIN, GPIO_PIN_SET)

#define   OLED_SDA_OFF()                HAL_GPIO_WritePin(GPIOx_OLED_PORT, OLED_SDA_PIN, GPIO_PIN_RESET)

#define   OLED_SDA_TOGGLE()             HAL_GPIO_TogglePin(GPIOx_OLED_PORT, OLED_SDA_PIN)

///


void WriteCmd(void);

void OLED_WR_CMD(uint8_t cmd);

void OLED_WR_DATA(uint8_t data);

void OLED_Init(void);

void OLED_Clear(void);

void OLED_Display_On(void);

void OLED_Display_Off(void);

void OLED_Set_Pos(uint8_t x, uint8_t y);

void OLED_On(void);

void OLED_ShowNum(uint8_t x,uint8_t y,unsigned int num,uint8_t len,uint8_t size2);

void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size);

void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size);

void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);


#endif

oledfont.h

#ifndef __OLEDFONT_H__

#define __OLEDFONT_H__


#include "stm32f0xx_hal.h"


//8*6 ASCII字符集点阵

const unsigned char F6x8[][6] =        

{

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp

    0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !

    0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "

    0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #

    0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $

    0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %

    0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &

    0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '

    0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (

    0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )

    0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *

    0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +

[1] [2] [3]
关键字:STM32CUBEMX  IIC  移植 引用地址:STM32CUBEMX(12)--IIC,12864OLED(0.96寸)移植

上一篇:ACM32F070对比STM32F070的差异说明
下一篇:基于STM32F103C8T6单片机的计步器设计

推荐阅读最新更新时间:2024-11-14 18:03

Linux操作系统在S3C2410开发板上的的移植过程
ARM9S3C2410微处理器与Linux的结合越来越紧密,逐渐在嵌入式领域得到广范的应用。目前,在便携式消费类电子产品、无线设备、汽车、网络、存储产品等都可以看到S3C2410与Linux相结合的身影。 S3C2410微处理器是一款由Samsung公司为手持终端设计的低价格、低功耗、高性能,基于ARM920T核的微处理器。它带有内存管理单元(MMU),采用0.18mm工艺和AMBA新型总线结构,主频可达203MHz。同时,它支持Thumb16位压缩指令集,从而能以较小的存储空间获得32位的系统性能。 在众多嵌入式操作系统中,Linux目前发展最快、应用最为广泛。性能优良、源码开放的Linux具有体积小、内核可裁减、网络功
[单片机]
Linux操作系统在S3C2410开发板上的的<font color='red'>移植</font>过程
STM8S硬件IIC卡在判忙,注意事项
具体的代码我就不贴了,21IC有很多示例,放到自己的工程死都不通。后面放弃,改用模拟IIC。今天又尝试半天,居然通了,特意发文章纪念,且帮助有同样困惑的人。 2.下面是关键,下面这样设置IO可正常使用硬件IIC GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_OD_HIZ_SLOW); //IIC,OD outPut GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_OD_HIZ_SLOW); //IIC,OD outPut //或者 GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_OD_HIZ_FAST)
[单片机]
gsm库(libgsm)在ARM-Linux下的移植
GSM是常见的VOIP的语音编解码库,在Linux下用libgsm来实现。在项目中需要用到libgsm库。因此试着直接编译GSM库来编译.官网已经停止服务了,因此在这个网址下了最新版来编译 解压后发现,这个Makefile是一个手写而非 Au toconf生成的Makefile,并且只有编译静态库,而没有常见的动态库的Makefile. 因此将其修改一下,使用其能在ARM编译并且成动态库。这也是一个典型的Makefile的修改练习,如果想编译成静态库,简单把 LIBEXT 改成 a即可 # Copyright 1992-1996 by Jutta Degener and Carsten Bormann, Technis
[单片机]
gsm库(libgsm)在ARM-Linux下的<font color='red'>移植</font>
基于IIC总线的单片机排队系统接口设计
  0 引言   本文以银行现有排队系统为实例,提出了IIC总线的单片机排队系统接口设计,通过对系统的仿真模拟试验,不仅简化设计电路,减小电路板面积,节省常规设计中的元器件,减少使用各项费用,而且系统能耗、消噪、可靠性等性能得到提高。   在MCS-51系列单片机不带IIC总线接口组成的数据测控和智能仪表仪器中,可以通过IIC总线增加系统的接口器件种类,降低系统成本,提高应用系统性能。   1 IIC总线   IIC总线(Inter Integrate Circuit Bus)是一种双向二线制总线,由串行时钟线(SCL)与串行数据线(SDA)构成,通过两根线连接不同的具有IIC总线的器件,在不同的器件间传送数据,数据传输速
[单片机]
基于<font color='red'>IIC</font>总线的单片机排队系统接口设计
ucosii在stm32上的移植详解4
详解3中有一个问题还没解释,就是stm32f10x_it.c中已经有SysTick中断函数的定义SysTick_Handler(),为什么官方版非要弄个OS_CPU_SysTickHandler()。答案就在启动文件上,一般我们自己开发基于stm32芯片的软件,都会使用标准外设库CMSIS中提供的启动文件,而官方移植的启动文件却是自己写的,在两个文件init.s,vectors.s中(Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK)。init.s负责进入main(),vectors.s设置中断向量。OS_CPU_SysTickHandler和OS_CPU_PendSVHand
[单片机]
Lua在单片机中的移植
Lua代码符合ANSI C标准,只要有C编译器的开发环境就能跑Lua。 虽说只要有C编译器就能跑Lua,但是单片机的环境太简单,有些C标准的内容仍旧无法支持。 Lua的官网是:www.lua.org 移植 1) 把 lua.c 和 luac.c 删除,这两个是一个Lua Shell,和平台相关,单片机中一般没用。 2) 对内存敏感的项目可以替换掉 lauxlib.c 文件里 l_alloc 函数调用的 free 和 realloc 函数。 3) loslib.c 和系统相关,单片机中最多跑RTOS,所以这个文件可以删除。 4) liolib.c 中使用了标准文件操作fopen、fclose、fread、fwrite等函数
[单片机]
关于ARM7 S3C4510B上μClinux移植问题
Linux是一种支持多种体系结构处理器的操作系统,有很强的移植性。描述了将μClinux移植到基于S3C4510B处理器目标板上的方法与过程。首先介绍了S3C4510B处理器和μClinux,并简单说明了如何搭建移植环境,然后着重讨论了在该开发板上Bootloader的设计实现以及μClinux内核的移植方法,最后对在这种基于μClinux的嵌入式系统环境下如何开发应用程序做了简单说明。 1引言 ARM(AdvancedRISCMachines),既可以认为是一个公司的名字,也可以认为是对一微处理器的通称,还可以认为是一种技术的名字。 1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术知识
[单片机]
关于ARM7 S3C4510B上μClinux<font color='red'>移植</font>问题
STM32F103移植到AT32F403A之MDK(二)
上一篇我们已经实现了不改硬件,只改软件情况下将STM32F103C8T6替换为AT32F403ACGT7的过程,但毕竟STM32F103C8T6已经是10多年前的东西了,用现在的AT32F403ACGT7替换实在是大材小用了,毕竟这颗是主频能到240M的M4。 上篇我们解决了替换能用的问题,本篇我们来结合AT32F403ACGT7的优势,实现不改硬件只改BOM降成本的方法。 从接触MCU开始,MCU外围电路中就缺少不了很重要的器件,那就晶振,晶振是MCU的时钟源。随着技术的不断发展,越来越多的MCU将晶振集成到了MCU内部,但集成到内部后真的就能够省略掉外部晶振吗,当然不是,由于技术和工艺问题,前些年的MCU还无法完全摆脱
[单片机]
STM32F103<font color='red'>移植</font>到AT32F403A之MDK(二)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved