历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2021年10月29日 | stm32专题三十:12864 IIC驱动

发布者:yunhui 来源: eefocus关键字:stm32  IIC驱动 手机看文章 扫描二维码
随时随地手机看文章

1 IIC发送数据 / 命令时序

2 12864 图形显示(显存)


RAM的大小是128×64位,RAM分为8页,从PAGE0到PAGE7,用于单色128x64点阵显示。

3 行列设置


1 设置起始行坐标(设置页)


命令 0XB0 ~ 0XB7 用于设置分页,所以我们显示的分页要 + 偏移(0XB0)


2 设置起始列坐标

4 制作字模


1 字模软件设置方式:

2 生成的字模的批处理:


生成的字模如图所示,我们要转成 0X00 这种格式:

使用 sublime 这个软件,可以进行批处理(先全选,然后再 快捷键 Ctrl + Shift + L):

字模生成完毕。


驱动程序如下所示:


bsp_12864.c


#include "bsp_12864.h"

#include "bsp_font.h"

 

/**

  * @brief 向 oled 写入命令

  */

void OLED_Write_Cmd(uint8_t cmd)

{

    uint8_t temp = cmd;

    HAL_I2C_Mem_Write(&I2C_X, OLED_ADDR, CMD_CTRL, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0xFFFF);

}

 

/**

  * @brief 向 oled 写入数据

  */

void OLED_Write_Data(uint8_t data)

{

    uint8_t temp = data;

    HAL_I2C_Mem_Write(&I2C_X, OLED_ADDR, DATA_CTRL, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0xFFFF);

}

 

/**

  * @brief 设置 oled 写入坐标 

  * @param x    列坐标:0 ~ 127

  * @param y    行坐标:0 ~ 63

  */

void OLED_Set_Pos(uint8_t x, uint8_t y)

{

    OLED_Write_Cmd(0xb0 + y);                 // 写入页地址

    OLED_Write_Cmd((x & 0x0f));               // 写入列的地址 (低半字节)

    OLED_Write_Cmd(((x & 0xf0) >> 4) | 0x10); // 写入列的地址(高半字节)

}

 

/**

  * @brief oled 清屏

  */

void OLED_Clear(void)

{

    unsigned char page, row;

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

    {

        OLED_Write_Cmd(0xb0 + page); // 从0 ~ 7页依次写入

        OLED_Write_Cmd(0x00);        // 低位列地址

        OLED_Write_Cmd(0x10);        // 高位列地址

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

        {

            OLED_Write_Data(0X00);

        }

    }

}

 

void OLED_Init(void)

{

    HAL_Delay(100); // 延迟(必须要有)

 

    OLED_Write_Cmd(0xAE); // 关闭显示

 

    OLED_Write_Cmd(0x00); // 设置低列地址

    OLED_Write_Cmd(0x10); // 设置高列地址

    OLED_Write_Cmd(0x40); // 设置起始行地址

    OLED_Write_Cmd(0xB0); // 设置页地址

 

    OLED_Write_Cmd(0x81); // 对比度设置,可设置亮度

    OLED_Write_Cmd(0xFF); // 265

 

    OLED_Write_Cmd(0xA1); // 设置段(SEG)的起始映射地址

    OLED_Write_Cmd(0xA6); // 正常显示;0xa7逆显示

 

    OLED_Write_Cmd(0xA8); // 设置驱动路数(16~64)

    OLED_Write_Cmd(0x3F); // 64duty

 

    OLED_Write_Cmd(0xC8); // 重映射模式,COM[N-1]~COM0扫描

 

    OLED_Write_Cmd(0xD3); // 设置显示偏移

    OLED_Write_Cmd(0x00); // 无偏移

 

    OLED_Write_Cmd(0xD5); // 设置震荡器分频

    OLED_Write_Cmd(0x80); // 使用默认值

 

    OLED_Write_Cmd(0xD9); // 设置 Pre-Charge Period

    OLED_Write_Cmd(0xF1); // 使用官方推荐值

 

    OLED_Write_Cmd(0xDA); // 设置 com pin configuartion

    OLED_Write_Cmd(0x12); // 使用默认值

 

    OLED_Write_Cmd(0xDB); // 设置 Vcomh,可调节亮度(默认)

    OLED_Write_Cmd(0x40); // 使用官方推荐值

 

    OLED_Write_Cmd(0x8D); // 设置OLED电荷泵

    OLED_Write_Cmd(0x14); // 开显示

 

    OLED_Write_Cmd(0xAF); // 开启OLED面板显示

}

 

/**

  * @brief 将 OLED 从休眠中唤醒

  */

void OLED_ON(void)

{

    OLED_Write_Cmd(0X8D); // 设置电荷泵

    OLED_Write_Cmd(0X14); // 开启电荷泵

    OLED_Write_Cmd(0XAF); // OLED 唤醒

}

 

/**

  * @brief 让OLED休眠

  */

void OLED_OFF(void)

{

    OLED_Write_Cmd(0X8D); // 设置电荷泵

    OLED_Write_Cmd(0X10); // 关闭电荷泵

    OLED_Write_Cmd(0XAE); // OLED 休眠

}

 

/**

  * @brief 显示 bsp_font.h 中的ASCII字符 字体为 Consolas

  * @param x:  起始点列坐标:0 ~ 127

  *        y:   起始点页坐标:0 ~ 7

  * @param *ch:要显示的字符串

  */

void OLED_Show_String(uint8_t x, uint8_t y, uint8_t *ch)

{

    uint8_t i = 0, c = 0, k = 0;

 

    while (ch[k] != '')

    {

        c = ch[k] - ' ';

        if (x > 120)

        {

            x = 0;

            y++;

        }

        OLED_Set_Pos(x, y);

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

        {

            OLED_Write_Data(Consolas_8X16[c * 16 + i]);

        }

 

        OLED_Set_Pos(x, y + 1);

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

        {

            OLED_Write_Data(Consolas_8X16[c * 16 + i + 8]);

        }

        x += 8;

        k++;

    }

}

 

/**

  * @brief 显示 bsp_font.h 中的汉字(宋体)

  * @param x:  起始点列坐标:0 ~ 127

  *        y:   起始点页坐标:0 ~ 7

  * @param n:  汉字在字库中的索引

  */

void OLED_Show_CN(uint8_t x, uint8_t y, uint8_t n)

{

    uint8_t i = 0;

    uint16_t k = 32 * n;

    OLED_Set_Pos(x, y);

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

    {

        OLED_Write_Data(CN_16X16[k]);

        k += 1;

    }

    OLED_Set_Pos(x, y + 1);

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

    {

        OLED_Write_Data(CN_16X16[k]);

        k += 1;

    }

}

 

#if 0

// 以下是测试程序

 

  OLED_Init();

 

  OLED_Clear();

 

  for (i = 3; i < 7; i++)

  {

    OLED_Show_CN((i - 3) * 16, 2, i);     // 测试显示中文

  }

  OLED_Show_String(0, 4, "hello world");  // 测试 8*16 字符

 

#endif

bsp_12864.h


#ifndef __BSP_12864_H

#define __BSP_12864_H

 

#include "i2c.h"

 

#define I2C_X           hi2c1

 

#define OLED_ADDR       0x78

#define CMD_CTRL        0X00

#define DATA_CTRL       0X40

 

void OLED_Init(void);

void OLED_Clear(void);

void OLED_ON(void);

void OLED_OFF(void);

void OLED_Show_String(uint8_t x, uint8_t y, uint8_t *ch);

void OLED_Show_CN(uint8_t x, uint8_t y, uint8_t n);

 

#endif /* __BSP_12864_H */

字库文件(部分):


bsp_font.h


// ASCII Consolas字体

const unsigned char Consolas_8X16[] = {

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0xf8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x1b,0x00,0x00,0x00,

    0x00,0x00,0x78,0x08,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x40,0xe0,0x50,0x40,0xf0,0x50,0x40,0x00,0x04,0x1f,0x04,0x04,0x1f,0x04,0x00,

    0x00,0xe0,0xb0,0x10,0xf8,0x10,0x10,0x00,0x00,0x10,0x10,0x7f,0x11,0x13,0x0e,0x00,

    0x30,0x58,0x48,0x70,0x80,0x60,0x30,0x08,0x10,0x18,0x04,0x03,0x0c,0x12,0x12,0x0c,

    0x00,0x60,0xf0,0x90,0x90,0x70,0x00,0x00,0x04,0x1f,0x11,0x11,0x16,0x1c,0x1f,0x10,

    0x00,0x00,0x00,0x78,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x80,0xe0,0x30,0x08,0x00,0x00,0x00,0x00,0x07,0x3f,0x60,0xc0,0x00,0x00,

    0x00,0x00,0x08,0x10,0xe0,0x80,0x00,0x00,0x00,0x00,0x80,0x60,0x38,0x0f,0x00,0x00,

    0x00,0x80,0xa0,0x60,0xd8,0x60,0x90,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,

    0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,0x00,0x02,0x02,0x1f,0x1f,0x02,0x02,0x02,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x58,0x38,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0xc0,0x70,0x18,0x00,0x00,0x20,0x18,0x06,0x01,0x00,0x00,0x00,

    0x00,0xe0,0x30,0x10,0x10,0xb0,0xe0,0x80,0x00,0x0f,0x1a,0x13,0x11,0x18,0x0f,0x03,

    0x00,0x60,0x20,0x30,0xf0,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1f,0x10,0x10,0x00,

    0x00,0x20,0x10,0x10,0x10,0xf0,0xe0,0x00,0x00,0x10,0x18,0x14,0x12,0x11,0x10,0x00,

    0x00,0x10,0x10,0x10,0x10,0xf0,0x60,0x00,0x00,0x10,0x11,0x11,0x11,0x19,0x0e,0x00,

    0x00,0x00,0x80,0x60,0x30,0xf0,0x00,0x00,0x04,0x07,0x05,0x04,0x04,0x1f,0x04,0x04,

    0x00,0xf0,0xf0,0x10,0x10,0x10,0x10,0x00,0x00,0x11,0x11,0x11,0x11,0x19,0x0f,0x00,

    0x00,0xc0,0x60,0x30,0x90,0x10,0x10,0x00,0x00,0x0f,0x19,0x11,0x10,0x11,0x0f,0x00,

    0x00,0x10,0x10,0x10,0x10,0xd0,0x70,0x00,0x00,0x00,0x10,0x1c,0x07,0x01,0x00,0x00,

    0x00,0x60,0xb0,0x90,0x10,0x90,0xe0,0x00,0x00,0x0e,0x12,0x11,0x11,0x13,0x0e,0x00,

    0x00,0xe0,0x30,0x10,0x10,0x30,0xe0,0x00,0x00,0x11,0x11,0x12,0x12,0x09,0x07,0x00,

    0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,

    0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x40,0x58,0x38,0x00,0x00,0x00,

    0x00,0x00,0x00,0x80,0x80,0x40,0x00,0x00,0x00,0x02,0x03,0x05,0x08,0x18,0x10,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x00,

    0x00,0x00,0x40,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x07,0x02,0x00,

    0x00,0x00,0x08,0x18,0x10,0xf0,0xe0,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,

    0x80,0xe0,0x10,0x88,0x88,0x88,0x10,0xe0,0x3f,0x60,0x8f,0x91,0x88,0x9f,0x08,0x0f,

    0x00,0x00,0xc0,0x70,0x30,0xe0,0x00,0x00,0x10,0x1e,0x07,0x04,0x04,0x05,0x0f,0x18,

    0x00,0xf0,0x10,0x10,0x10,0xb0,0xe0,0x00,0x00,0x1f,0x11,0x11,0x11,0x11,0x0e,0x00,

    0x00,0xc0,0x20,0x10,0x10,0x10,0x10,0x00,0x00,0x0f,0x18,0x10,0x10,0x10,0x10,0x00,

    0x00,0xf0,0x10,0x10,0x10,0x30,0xe0,0x80,0x00,0x1f,0x10,0x10,0x10,0x08,0x0f,0x03,

    0x00,0xf0,0xf0,0x10,0x10,0x10,0x10,0x00,0x00,0x1f,0x1f,0x11,0x11,0x11,0x11,0x00,

[1] [2]
关键字:stm32  IIC驱动 引用地址:stm32专题三十:12864 IIC驱动

上一篇:stm32专题二十九:Flash 读写保护
下一篇:stm32专题三十一:电源管理

推荐阅读

在制程推进到10nm以内后,研发难度也越来越大,这点从Intel的10nm从2016年跳票到2019年就可以看出。此前,得益于三星背后的支持,GlobalFoundries(格罗方德,格芯)的7nm走在前列,而且今年3月还邀请少数资深记者前往旗下最先进的纽约Malta的Fab 8工厂,介绍他们计划向7nm EUV推进。   然而,计划赶不上变化,GF今日宣布,出于经济因素考虑,搁置7nm L...
10 月 29 日讯,上汽集团副总裁兼总工程师祖似杰近日表示,“互联网车”概念是希望把互联网外部东西和车联系起来,最终目的是把车变成互联网一员,或者变成物联网的一员。我们是跑在互联网上的汽车,成立的斑马公司变成了网联领头羊,自主品牌近两年的销售增长和这个有关。近日和华为、中国移动是战略合作伙伴,目前在做世界上首辆 5G 汽车,这辆汽车在...
有时候总在想,怎么样的学习才是最好的?就像学习USB,到底只要学到会应用就可以了,还是要深入到协议内容和驱动底层呢?经常对别人说自己会某某东西,其实自己也只是一知半解的,只会些应用去糊弄别人。于是总在安慰自己:我只要会做些应用就可以了!!!下面介绍STM32 USB工程的usb_endp.c文件和usb_istr.c两个文件。首先是usb_endp.c,这个文件很简单...
“树叶杂草是湿垃圾,塑料废纸是干垃圾,一份没吃完的外卖需要把打包盒、残羹、塑料袋、勺筷分别放入不同的垃圾桶……”2019年7月1日,上海通过《上海市生活垃圾管理条例》,拉开了国内进入强制垃圾分类时代的序幕,固废分拣似乎也成了一个迫切的需求。近期,固废分拣装备企业弓叶科技连续完成了天使轮和A轮融资。固废分拣机器人,听着或许有点陌生,但在...

史海拾趣

问答坊 | AI 解惑

谁能帮点忙?

单片机开发系统板设计 任务:1.能支持在线下载 2.带有单片机更换插座 3.电源输入具有5V稳压功能 4.系统板带有四位LED,使用8根数据线控制,还可以增加8个LED二极管。 5.配有1602ALCD插座 6.配有4*4键盘和复位键功能 ...…

查看全部问答∨

LIN协议下载

LIN2.0是现在用得最广泛的 全英文…

查看全部问答∨

LED隔离驱动次边恒流芯片(我调试过的)

1052是1051的升级版 与AP4313基本兼容; 我调的4*1W,恒流效果都挺好; 只是芯片的ic电压受限于18V,所以LED的串联数受限(公用输出电压), 因此需要多绕个绕组给IC供电,才能与LED供电电压分开,才能加大LED数目。…

查看全部问答∨

请问以下环保(RoHS)IC价格:

请问以下环保(RoHS)IC价格: 1.LM1117MPX-33/SOT223/ 2.SN74HCT541D/NF 3.74AHCT14D/SQ-14 4.MAX487EESA/SO-8 5.X5045/SO-8 6.LM158DT/SO-8 7.LM258DT/SO-8 8.LM211DR/SO-8 9.SFH6156-3/SMD-4 10.TLP121GR/SO-4 11.TMS320LF2406APZA 12 ...…

查看全部问答∨

wince 6.0要怎么实现开机启动指定的程序.

     硬件平台是TE6410开发板,嵌入的系统是wince 6.0,现在我做了一个程序,保存在SD卡里面,希望在开启开发板电源后进入系统能自动运行我的程序.查了大量的资料都无法实现(如下),主要原因是在wince系统中写入的任何东西,重启后都 ...…

查看全部问答∨

8563时钟不走?

8563时钟不走,设置数据均正确,不知什么原因?能读出。 其中int脚接地…

查看全部问答∨

如何将JPG文件显示出来??

                                 我现在显示用的都是BMP的文件,但是BMP的文件实在太大了320X240有200多KB,我希望将图形的文件压缩到2-4KB,不知道 ...…

查看全部问答∨

哈哈,版主,在固件中TIM1_CH1输出比较确实有问题!!

库函数的配置好像有问题,因为不是我一个人反应有这种情况! 见帖子“TIM1_CH1做输出比较怎么配置”26楼…

查看全部问答∨

I2C 读写铁电 的问题

我用STM32的I2C老是卡死,一次没调通过。万般无奈之下用了模拟的。读写铁电时发现写进去的是0-7,读出来的全是FF.&nbsp; 很纠结啊,大家有碰到过这个问题吗?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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