历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-10-29 来源:eefocus

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,

推荐阅读

史海拾趣

CML Microcircuits公司的发展小趣事

为了进一步扩大市场份额,CML Microcircuits公司开始积极拓展全球市场。通过与当地代理商和分销商建立合作关系,CML的产品逐渐进入了全球各地的电子市场。同时,公司还设立了多个海外研发中心和销售中心,以便更好地服务全球客户。这些举措不仅提升了CML的品牌知名度,也为其带来了更多的商业机会。

HCH Co公司的发展小趣事

背景:面对电子行业的快速变化和多元化需求,HCH Co公司意识到仅凭一己之力难以应对所有挑战。因此,公司积极寻求与其他行业的跨界合作机会,以共同推动电子行业的创新发展。

发展:通过与汽车、医疗、教育等多个行业的领军企业建立合作关系,HCH Co公司成功将自身的电子技术和产品应用于更广泛的领域。例如,与汽车制造商合作开发智能驾驶系统、与医疗机构合作研发远程医疗设备等。跨界合作不仅为公司带来了新的增长点,也促进了不同行业之间的技术交流和资源共享。未来,HCH Co公司将继续秉承开放合作的理念,与更多行业伙伴携手共创美好未来。

请注意,以上五个故事是基于假设构建的,旨在反映电子行业中企业可能的发展路径和趋势。实际情况中,“HCH Co”公司的具体发展故事可能有所不同。

长运通(CYT)公司的发展小趣事

长运通注重与高校和研究机构的合作,积极引进和培养人才。公司与电子科技大学、西安电子科技大学等知名高校建立了紧密的合作关系,共同开展技术研发和人才培养。通过与高校的合作,长运通不仅获得了更多的技术资源支持,也为公司培养了一批高素质的研发人才。这些人才为公司的发展提供了强有力的支撑。

CyOptics Inc公司的发展小趣事

在被Avago收购后,CyOptics并未停止其技术创新的步伐。公司继续投入研发,推出了一系列新的光学产品和解决方案,以满足不断增长的市场需求。例如,CyOptics的物理介质相关(PMD)IC产品系列,不仅提供了完整的GaAs芯片组件,还提供了跨阻放大器(TIA)、激光驱动器(LD)等一站式芯片套件解决方案,为客户提供了更加便捷和高效的服务。

Hisetec Electronic Co Ltd公司的发展小趣事

背景:在21世纪初,电子产品市场迅速增长,智能手机和平板电脑等移动设备成为新宠。Hisetec Electronic Co Ltd公司凭借其在微电子封装技术的深厚积累,成功研发出一种高密度、低功耗的封装解决方案,大幅提升了手机芯片的能效比。

发展:该技术迅速被市场认可,多家知名手机制造商如三星、苹果等纷纷采用,Hisetec公司因此订单激增,市场份额大幅提升。公司不仅扩大了生产规模,还进一步加大了研发投入,不断推出新的封装技术,巩固了其在电子封装领域的领先地位。

Econais公司的发展小趣事

为了加速产品的市场推广和应用,Econais积极寻求与行业内其他优秀企业的合作。XXXX年,Econais与Xively公司达成战略合作,共同为工业、商业和住宅市场提供一站式的物联网解决方案。通过这次合作,Econais的WiSmart Wi-Fi用户能够无缝连接到Xively云,为各种物联网应用提供强有力的支持。

问答坊 | AI 解惑

08年通信业投资策略:TD待放走向国际

2007年国内通信行业整体并未处于高速上升的周期中,但板块内龙头企业的业绩稳固提升,依靠着海外收入规模的不断扩大,享受到了全球通信行业的景气上升。   2008年将是TD商用元年,规模建设也将拉 开序幕,行业中诸多不确定因素也将找到答案 ...…

查看全部问答>

大家都用什么型号的单片机?

我想用单片机做点东西,不知道用什么型号的单片机?有人说AT89C51淘汰了,真的吗?…

查看全部问答>

历届全国大学生电子竞赛试题汇总

本帖最后由 paulhyde 于 2014-9-15 09:23 编辑 历届全国大学生电子竞赛试题汇总  …

查看全部问答>

食人鱼LED的封装

replyreload += \',\' + 369679;     可以把LED的芯片封装成图 所示的食人鱼形状,这种LED很受用户的欢迎。为什么把这种LED称为食人鱼呢?因为它的形状很像亚马孙河中的食人鱼。用食人鱼来命名LED发光器件的一种产品,也是从 ...…

查看全部问答>

求教ucos的移植问题

要用gcc编译,在x86平台上。。。 本人菜鸟,谁能给一个详细的说明啊。。。。 谢谢。…

查看全部问答>

wince5.0 bootloader中 LEAF_ENTRY 的问题

9263 wince5.0中官方给的bootloader(大部分都是)中有个宏如下: EXPORT        __ENTRY;这个不是宏 ,是的前面代码     LEAF_ENTRY __ENTRY 宏定义为: GBLS    VBar VBar      & ...…

查看全部问答>

wince usb packet

请教怎样用usb packet sensing 来判断USB 是不是USB CABLE插入的。 usb 传输是开始传的数据包是怎样的,在USB driver 在哪里去找啊,谢谢~~!!! usb 2.0…

查看全部问答>

ST的置换活动

http://www.stmicroelectronics.com.cn/activity/stm32_2010/stm32_2010.html   手头有块 STM3210B-LK1  现在联系置换不知道有没有机会 明天28号了 有点晚知道 了…

查看全部问答>

双DMA实现I2S播放SD卡中音乐

 本文讨论SD卡作为存储器,I2S播放音频的解决方案SD卡数据的读取虽然很快,即使在最理想的状态下,播放一秒钟的数据,需要大约%4的时间消耗8(bit)x2(ch)x2(byte)x48000(hz)/36(MHz)=0.042s使用单流程模式,这部分损耗是无法忽略的,只能考 ...…

查看全部问答>

请问avr编程时时钟怎么设置

看过相关文档。说是通过熔丝位、CKSEL熔丝位SUT设置。但是在iom16.h里并没有定义该寄存器。可能我没有理解对,刚接触avr,请高手指点!!…

查看全部问答>