实现oled12864的基本显示功能如文字。

首先构建stm32cubeide工程,在工程core下面的文件夹inc下,新建两个头文件oled.h和oledfont.h,具体为:

oled.h代码为:

#ifndef __OLED_H
#define __OLED_H 

#include "stdlib.h"    

//Notice:移植时需要修改的部分:1、OLED屏引脚接口定义;2、延迟时间

/*-----------------OLED屏宏定义部分----------------*/
/////------------------------------------------------------/////
//定义OLED屏引脚接口,可根据实际需求修改|demo中:SCL——PB0、SDA——PB1
#define OLED_IIC_Port GPIOB
#define OLED_SCL_Pin  GPIO_PIN_0
#define OLED_SDA_Pin  GPIO_PIN_1
/////------------------------------------------------------/////
#define OLED_SCL_CLR() HAL_GPIO_WritePin(OLED_IIC_Port,OLED_SCL_Pin,GPIO_PIN_RESET)//SCL
#define OLED_SCL_SET() HAL_GPIO_WritePin(OLED_IIC_Port,OLED_SCL_Pin,GPIO_PIN_SET)

#define OLED_SDA_CLR() HAL_GPIO_WritePin(OLED_IIC_Port,OLED_SDA_Pin,GPIO_PIN_RESET)//SDA
#define OLED_SDA_SET() HAL_GPIO_WritePin(OLED_IIC_Port,OLED_SDA_Pin,GPIO_PIN_SET)

#define OLED_CMD  0
#define OLED_DATA 1

uint8_t OLED_GRAM[128][8];

//延时函数
//需要根据时钟树设定灵活修改,确保IIC时序工作在OLED屏能够识别的范围
void delay_us(uint16_t t)
{
    //STM32F103取HSI=8MHz,主频提高后可根据实际情况乘以倍数。
    uint16_t i=t*1;
    while(i--);
}

//IIC起始信号
void I2C_Start(void)
{
    OLED_SDA_SET();
    OLED_SCL_SET();
    delay_us(6);
    OLED_SDA_CLR();
    delay_us(6);
    OLED_SCL_CLR();
    delay_us(6);
}

//IIC结束信号
void I2C_Stop(void)
{
    OLED_SDA_CLR();
    OLED_SCL_SET();
    delay_us(6);
    OLED_SDA_SET();
}

//IIC等待信号响应
void I2C_Ack(void)
{
    OLED_SDA_SET();
    delay_us(6);
    OLED_SCL_SET();
    delay_us(6);
    OLED_SCL_CLR();
    delay_us(6);
}

//向IIC总线写1个字节
void I2C_WtByte(uint8_t dat)
{
    uint8_t i;
    for(i=0;i<8;i++)
    {
        if(dat & 0x80)//将dat的8位从最高位开始依次写入
        {
            OLED_SDA_SET();
        }
        else
        {
            OLED_SDA_CLR();
        }
        delay_us(6);
        OLED_SCL_SET();
        delay_us(6);
        OLED_SCL_CLR();//将时钟信号设置为低电平
        dat<<=1;
    }
}

//向oled屏发送一个字节
//mode:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WtByte(uint8_t dat,uint8_t mode)
{
    I2C_Start();
    I2C_WtByte(0x78);
    I2C_Ack();
    if(mode){I2C_WtByte(0x40);}
    else{I2C_WtByte(0x00);}
    I2C_Ack();
    I2C_WtByte(dat);
    I2C_Ack();
    I2C_Stop();
}

//OLED显示数据更新
void OLED_Refresh(void)
{
    uint8_t i,n;
    for(i=0;i<8;i++)
    {
        OLED_WtByte(0xb0+i,OLED_CMD); //设置行起始地址
        OLED_WtByte(0x00,OLED_CMD);   //设置低列起始地址
        OLED_WtByte(0x10,OLED_CMD);   //设置高列起始地址
     &n

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值