1-1 STM32-0.96寸OLED显示与控制

news2024/12/21 8:06:07

1.0 模块原理图


2.0 0.96OLED简介


资料下载:https://jiangxiekeji.com/download.html

程序介绍:https://jiangxiekeji.com/tutorial/oled.html


SSD1306是一款OLED/PLED点阵显示屏的控制器,可以嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务

驱动接口:128个SEG引脚和64个COM引脚,对应128x64像素点阵显示屏

内置显示存储器(GDDRAM):128x64 bit(128x8 Byte)SRAM

供电:VDD=1.65~3.3V(IC逻辑),VCC=7~15V(面板驱动)

通信接口:8位6800/8080并行接口,3/4线SPI接口,I2C接口


3.0 SSD1306定义及引脚框图


 4.0 通信接口选择与通信线定义


 图片解读:


5.0 6800并口协议


提到 "6800",最著名的可能是 Motorola 6800 微处理器。这是由摩托罗拉公司在1974年发布的8位微处理器,它在当时的计算机和嵌入式系统中扮演了重要角色。


6.0 8080并口协议



7.0 4线SPI



8.0 3线SPI



9.0 0.96寸显示屏命令表



10.0 开启指令



11.0 IIC通讯协议

注:IIC协议实现参考这一篇文章:STM32 IIC协议实现-CSDN博客 


12.0 程序实现


12.0.1 发送命令

// OLED发送命令
void OLED_WriteCommand(uint8_t command)
{
    IIC_Start();
    IIC_SendByte(0x78);
    IIC_Wait_Ack();
    IIC_SendByte(0x00);
    IIC_Wait_Ack();
    IIC_SendByte(command);
    IIC_Wait_Ack();
    IIC_Stop();
}

12.0.2 发送数据

// OLED发送数据
void OLED_WriteData(uint8_t data)
{
    IIC_Start();
    IIC_SendByte(0x78);
    IIC_Wait_Ack();
    IIC_SendByte(0x40);
    MyI2C_ReceiveAck();
    IIC_SendByte(data);
    IIC_Wait_Ack();
    IIC_Stop();
}

12.0.3 设置显示位置

 注:以上的内容来自元地址设置命令表,表示x坐标的位置和Y坐标的位置

// OLED显示位置
void OLED_SetCursor(uint8_t x, uint8_t page)
{
    // 设置显示的X轴低四位
    OLED_WriteCommand(0x00 | (x & 0x0F));
    // 设置显示的X地址高四位
    OLED_WriteCommand(0x10 | (x & 0xF0) >> 4);
    // 设置显示的页地址
    OLED_WriteCommand(0xB0 | page);
}

12.0.4 初始化OLED

 注:这个操作也就是开启显示器的显示,将显示器从关闭状态转换为打开状态

// 初始化OLED
void OLED_Init(void)
{
    // 初始化IIC
    IIC_Init();

    Delay_ms(100);

    OLED_WriteCommand(0xAE);

    OLED_WriteCommand(0xD5);
    OLED_WriteCommand(0x80);

    OLED_WriteCommand(0xA8);
    OLED_WriteCommand(0x3F);

    OLED_WriteCommand(0xD3);
    OLED_WriteCommand(0x00);

    OLED_WriteCommand(0x40);

    OLED_WriteCommand(0xA1);

    OLED_WriteCommand(0xC8);

    OLED_WriteCommand(0xDA);
    OLED_WriteCommand(0x12);

    OLED_WriteCommand(0x81);
    OLED_WriteCommand(0xCF);

    OLED_WriteCommand(0xD9);
    OLED_WriteCommand(0xF1);

    OLED_WriteCommand(0xDB);
    OLED_WriteCommand(0x30);

    OLED_WriteCommand(0xA4);

    OLED_WriteCommand(0xA6);

    OLED_WriteCommand(0x8D);
    OLED_WriteCommand(0x14);

    OLED_WriteCommand(0xAF);

    Delay_ms(100);
}

12.0.5 清屏函数
// OLED 清屏
void OLED_Clear(void)
{
    for (uint8_t j = 0; j < 8; j++)
    {
        OLED_SetCursor(0, j);
        {
            for (uint8_t i = 0; i < 128; i++)
            {
                OLED_WriteData(0x00);
            }
        }
    }
}

12.0.6 OLED显示字符
// OLED显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char mChar, uint8_t fontSize)
{
    if (fontSize == 8)
    {
        // 设置起始位置
        OLED_SetCursor(x, y);
        uint8_t i = 0;
        for (i = 0; i < 8; i++)
        {
            // 写入数组指定行的第i个数据
            OLED_WriteData(ascii8x16[mChar - ' '][i]);
        }

        OLED_SetCursor(x, y + 1);
        for (i = 0; i < 8; i++)
        {
            OLED_WriteData(ascii8x16[mChar - ' '][i + 8]);
        }
    }
}

12.0.7 OLED显示字符串
void OLED_ShowString(uint8_t X, uint8_t Page, char *String, uint8_t FontSize)
{
    for (uint8_t i = 0; String[i] != '\0'; i++)
    {
        OLED_ShowChar(X + i * FontSize, Page, String[i], FontSize);
    }
}

12.0.8 OLED显示图片
// OLED显示图片
void OLED_ShowImage(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *Image)
{
    for (uint8_t j = 0; j < height; j++)
    {
        // 设置起始位置
        OLED_SetCursor(x, y + j);
        uint8_t i = 0;
        for (i = 0; i < width; i++)
        {
            // 写入数组指定行的第i个数据
            OLED_WriteData(Image[width * j + i]);
        }
    }
}

/**
 * @brief 补充注释
 * 如果高度是1也就是只有8个像素,也就是只有一页
 * 那么显示一页的数据就是遍历width页就是字符的宽度个字节
 * 然后显示对应的数。
 * 如果高度不仅仅是1而是16,也就是代表这个字符是跨2页进行
 * 写入的,那么就要再加一个for循环对第二页的数据进行写入
 * 也就是第二页开始的字节然后写入【0-9】【】
 *
 */

12.0.9 OLED显示汉字

void OLED_ShowChinese(uint8_t X, uint8_t Page, char *Chinese)
{
    // 第一步:先把传递过来的汉字串,拆分为一个个独立的汉字
    char SigleChinese[4] = {0};
    uint8_t pChinese = 0;
    uint8_t pIndex;

    for (uint8_t i = 0; Chinese[i] != '\0'; i++)
    {
        SigleChinese[pChinese] = Chinese[i];
        pChinese++;

        if (pChinese >= 3)
        {
            pChinese = 0;

            for (pIndex = 0; strcmp(OLED_CF16x16[pIndex].Index, "") != 0; pIndex++)
            {
                if (strcmp(OLED_CF16x16[pIndex].Index, SigleChinese) == 0)
                {
                    break;
                }
            }

            OLED_ShowImage(X + ((i + 1) / 3 - 1) * 16, Page, 16, 2, OLED_CF16x16[pIndex].Data);
        }
    }
}
12.0.10 OLED头文件
#ifndef _OLED_H_
#define _OLED_H_
#include <stdint.h>

// OLED初始化
void OLED_Init(void);

// OLED发送命令
void OLED_WriteCommand(uint8_t command);

// OLED发送数据
void OLED_WriteData(uint8_t data);

// OLED显示位置
void OLED_SetCursor(uint8_t x, uint8_t page);

// OLED 清屏
void OLED_Clear(void);

// OLED显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char mChar, uint8_t fontSize);

// OLED显示图片
void OLED_ShowImage(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *Image);

// void OLED_ShowChinese(uint8_t x, uint8_t y, char *chinese);

void OLED_ShowChinese(uint8_t X, uint8_t Page, char *Chinese);

void OLED_ShowString(uint8_t X, uint8_t Page, char *String, uint8_t FontSize);

#endif

12.0.11 字符编码

注:该字符编码放在一个单独的C语言文件中

#include <stdint.h>
#include <stdio.h>

const uint8_t ascii8x16[][16] =
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*" ",0*/

        0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, /*"!",1*/

        0x00, 0x10, 0x0C, 0x02, 0x10, 0x0C, 0x02, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*""",2*/

        0x00, 0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x00,
        0x00, 0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x00, /*"#",3*/

        0x00, 0x70, 0x88, 0x88, 0xFC, 0x08, 0x30, 0x00,
        0x00, 0x18, 0x20, 0x20, 0xFF, 0x21, 0x1E, 0x00, /*"$",4*/

        0xF0, 0x08, 0xF0, 0x80, 0x60, 0x18, 0x00, 0x00,
        0x00, 0x31, 0x0C, 0x03, 0x1E, 0x21, 0x1E, 0x00, /*"%",5*/

        0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00,
        0x1E, 0x21, 0x23, 0x2C, 0x19, 0x27, 0x21, 0x10, /*"&",6*/

        0x00, 0x12, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"'",7*/

        0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00,
        0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00, /*"(",8*/

        0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00,
        0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, /*")",9*/

        0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00,
        0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00, /*"*",10*/

        0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00,
        0x00, 0x01, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x01, /*"+",11*/

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x90, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, /*",",12*/

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /*"-",13*/

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, /*".",14*/

        0x00, 0x00, 0x00, 0x00, 0xC0, 0x38, 0x04, 0x00,
        0x00, 0x60, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, /*"/",15*/

        0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00,
        0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, /*"0",16*/

        0x00, 0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, /*"1",17*/

        0x00, 0x70, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00,
        0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, /*"2",18*/

        0x00, 0x30, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00,
        0x00, 0x18, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, /*"3",19*/

        0x00, 0x00, 0x80, 0x40, 0x30, 0xF8, 0x00, 0x00,
        0x00, 0x06, 0x05, 0x24, 0x24, 0x3F, 0x24, 0x24, /*"4",20*/

        0x00, 0xF8, 0x88, 0x88, 0x88, 0x08, 0x08, 0x00,
        0x00, 0x19, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, /*"5",21*/

        0x00, 0xE0, 0x10, 0x88, 0x88, 0x90, 0x00, 0x00,
        0x00, 0x0F, 0x11, 0x20, 0x20, 0x20, 0x1F, 0x00, /*"6",22*/

        0x00, 0x18, 0x08, 0x08, 0x88, 0x68, 0x18, 0x00,
        0x00, 0x00, 0x00, 0x3E, 0x01, 0x00, 0x00, 0x00, /*"7",23*/

        0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00,
        0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, /*"8",24*/

        0x00, 0xF0, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
        0x00, 0x01, 0x12, 0x22, 0x22, 0x11, 0x0F, 0x00, /*"9",25*/

        0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, /*":",26*/

        0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, /*";",27*/

        0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00,
        0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, /*"<",28*/

        0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
        0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, /*"=",29*/

        0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00,
        0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, /*">",30*/

        0x00, 0x70, 0x48, 0x08, 0x08, 0x88, 0x70, 0x00,
        0x00, 0x00, 0x00, 0x30, 0x37, 0x00, 0x00, 0x00, /*"?",31*/

        0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00,
        0x07, 0x18, 0x27, 0x28, 0x2F, 0x28, 0x17, 0x00, /*"@",32*/

        0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00,
        0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, /*"A",33*/

        0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00,
        0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, /*"B",34*/

        0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00,
        0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, /*"C",35*/

        0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
        0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, /*"D",36*/

        0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00,
        0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, /*"E",37*/

        0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00,
        0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, /*"F",38*/

        0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00,
        0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, /*"G",39*/

        0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08,
        0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, /*"H",40*/

        0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00,
        0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, /*"I",41*/

        0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00,
        0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, /*"J",42*/

        0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00,
        0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, /*"K",43*/

        0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, /*"L",44*/

        0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00,
        0x20, 0x3F, 0x01, 0x3E, 0x01, 0x3F, 0x20, 0x00, /*"M",45*/

        0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08,
        0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, /*"N",46*/

        0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
        0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, /*"O",47*/

        0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00,
        0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, /*"P",48*/

        0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
        0x0F, 0x10, 0x28, 0x28, 0x30, 0x50, 0x4F, 0x00, /*"Q",49*/

        0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00,
        0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, /*"R",50*/

        0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00,
        0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, /*"S",51*/

        0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00,
        0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, /*"T",52*/

        0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08,
        0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, /*"U",53*/

        0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08,
        0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, /*"V",54*/

        0x08, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x08, 0x00,
        0x00, 0x03, 0x3E, 0x01, 0x3E, 0x03, 0x00, 0x00, /*"W",55*/

        0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08,
        0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, /*"X",56*/

        0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00,
        0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, /*"Y",57*/

        0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00,
        0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, /*"Z",58*/

        0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00,
        0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, /*"[",59*/

        0x00, 0x04, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, /*"\",60*/

        0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00,
        0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, /*"]",61*/

        0x00, 0x00, 0x04, 0x02, 0x02, 0x04, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"^",62*/

        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, /*"_",63*/

        0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"`",64*/

        0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00,
        0x00, 0x19, 0x24, 0x24, 0x12, 0x3F, 0x20, 0x00, /*"a",65*/

        0x10, 0xF0, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00,
        0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, /*"b",66*/

        0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
        0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, /*"c",67*/

        0x00, 0x00, 0x80, 0x80, 0x80, 0x90, 0xF0, 0x00,
        0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, /*"d",68*/

        0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
        0x00, 0x1F, 0x24, 0x24, 0x24, 0x24, 0x17, 0x00, /*"e",69*/

        0x00, 0x80, 0x80, 0xE0, 0x90, 0x90, 0x20, 0x00,
        0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, /*"f",70*/

        0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
        0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, /*"g",71*/

        0x10, 0xF0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
        0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, /*"h",72*/

        0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, /*"i",73*/

        0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00,
        0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, /*"j",74*/

        0x10, 0xF0, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00,
        0x20, 0x3F, 0x24, 0x06, 0x29, 0x30, 0x20, 0x00, /*"k",75*/

        0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, /*"l",76*/

        0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
        0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, /*"m",77*/

        0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
        0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, /*"n",78*/

        0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
        0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, /*"o",79*/

        0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00,
        0x80, 0xFF, 0x91, 0x20, 0x20, 0x11, 0x0E, 0x00, /*"p",80*/

        0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00,
        0x00, 0x0E, 0x11, 0x20, 0x20, 0x91, 0xFF, 0x80, /*"q",81*/

        0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00,
        0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, /*"r",82*/

        0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
        0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, /*"s",83*/

        0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x10, 0x00, /*"t",84*/

        0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00,
        0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, /*"u",85*/

        0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00,
        0x00, 0x03, 0x0C, 0x30, 0x0C, 0x03, 0x00, 0x00, /*"v",86*/

        0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80,
        0x01, 0x0E, 0x30, 0x0C, 0x07, 0x38, 0x06, 0x01, /*"w",87*/

        0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00,
        0x00, 0x20, 0x31, 0x0E, 0x2E, 0x31, 0x20, 0x00, /*"x",88*/

        0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80,
        0x00, 0x81, 0x86, 0x78, 0x18, 0x06, 0x01, 0x00, /*"y",89*/

        0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
        0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, /*"z",90*/

        0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x02,
        0x00, 0x00, 0x00, 0x00, 0x01, 0x3E, 0x40, 0x40, /*"{",91*/

        0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, /*"|",92*/

        0x02, 0x02, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x40, 0x40, 0x3E, 0x01, 0x00, 0x00, 0x00, 0x00, /*"}",93*/

        0x00, 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"~",94*/
};

13.0 主函数文件

#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "IIC_Drv.h"
#include "LED.h"
#include "MyI2C.h"
#include "OLED.h"

const uint8_t Img[] =
	{
		0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
		0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, /*"n",78*/
};

const uint8_t Image[] =
{
		0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0xB0, 0xF0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61,
		0xF9, 0x8F, 0x83, 0x01, 0xE1, 0x39, 0x0D, 0x07, 0x21, 0x21, 0x21, 0x21, 0x23, 0x22, 0x20, 0x20, 0xFE, 0x23, 0x31, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x31, 0x1F, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x08, 0x0E, 0x38, 0x60, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"未命名文件",0*/
};

const uint8_t Hao[] =
	{
		0x10, 0x10, 0xF0, 0x1F, 0x10, 0xF0, 0x00, 0x80, 0x82, 0x82, 0xE2, 0x92, 0x8A, 0x86, 0x80, 0x00, 0x40, 0x22, 0x15, 0x08, 0x16, 0x61, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, /*"好",0*/
};

// const uint8_t MyChar[][32] =
// {
// 		0x00, 0x80, 0x60, 0xF8, 0x07, 0x40, 0x20, 0x18, 0x0F, 0x08, 0xC8, 0x08, 0x08, 0x28, 0x18, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x0C, 0x03, 0x40, 0x80, 0x7F, 0x00, 0x01, 0x06, 0x18, 0x00,
// 		/*"你",0*/

// 		0x10, 0x10, 0xF0, 0x1F, 0x10, 0xF0, 0x00, 0x80, 0x82, 0x82, 0xE2, 0x92, 0x8A, 0x86, 0x80, 0x00, 0x40, 0x22, 0x15, 0x08, 0x16, 0x61, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
// 		/*"好",1*/

// 		0x20, 0x20, 0x20, 0xFE, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x47, 0x44, 0x44, 0x44, 0x47, 0x40, 0x40, 0x40, 0x00, 0x00,
// 		/*"世",2*/

// 		0x00, 0x00, 0x00, 0xFE, 0x92, 0x92, 0x92, 0xFE, 0x92, 0x92, 0x92, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x04, 0x84, 0x62, 0x1E, 0x01, 0x00, 0x01, 0xFE, 0x02, 0x04, 0x04, 0x08, 0x08, 0x00,
// 		/*"界",3*/
// };

extern const uint8_t ascii8x16[][16];

int main(void)
{
	OLED_Init();
	OLED_Clear();

	// OLED_ShowChar(20, 1, 'X', 8);

	// OLED_ShowString(0, 0, "helloword!", 8);

	// OLED_ShowImage(0, 0, 8, 2, Img);

	// OLED_ShowImage(0, 0, 8, 2, ascii8x16[4]);

	// OLED_ShowImage(10, 5, 30, 4, Image);

	// OLED_ShowImage(0, 0, 16, 2, Hao);

	// OLED_ShowImage(20, 1, 16, 2, MyChar[3]);

	OLED_ShowChinese(10, 2, "你好世界");

	while (1)
	{
	}
}

OLED_C文件

#include "stm32f10x.h"
#include "MyI2C.h"
#include "IIC_Drv.h"
#include "Delay.h"
#include "OLED.h"
#include <string.h>

extern const uint8_t ascii8x16[][16];

typedef struct {
	char Index[6];
	uint8_t Data[32];
} ChineseCell_t;

const ChineseCell_t OLED_CF16x16[] = {
	
	"你",
	0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
	0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,/*0*/

	"好",
	0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
	0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,/*1*/

	"世",
	0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,
	0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00,/*2*/

	"界",
	0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,
	0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00,/*3*/
	
	//...
	
	"",
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};

// OLED发送命令
void OLED_WriteCommand(uint8_t command)
{
    IIC_Start();
    IIC_SendByte(0x78);
    IIC_Wait_Ack();
    IIC_SendByte(0x00);
    IIC_Wait_Ack();
    IIC_SendByte(command);
    IIC_Wait_Ack();
    IIC_Stop();
}

// OLED发送数据
void OLED_WriteData(uint8_t data)
{
    IIC_Start();
    IIC_SendByte(0x78);
    IIC_Wait_Ack();
    IIC_SendByte(0x40);
    MyI2C_ReceiveAck();
    IIC_SendByte(data);
    IIC_Wait_Ack();
    IIC_Stop();
}

// OLED显示位置
void OLED_SetCursor(uint8_t x, uint8_t page)
{
    // 设置显示的X轴低四位
    OLED_WriteCommand(0x00 | (x & 0x0F));
    // 设置显示的X地址高四位
    OLED_WriteCommand(0x10 | (x & 0xF0) >> 4);
    // 设置显示的页地址
    OLED_WriteCommand(0xB0 | page);
}

// 初始化OLED
void OLED_Init(void)
{
    // 初始化IIC
    IIC_Init();

    Delay_ms(100);

    OLED_WriteCommand(0xAE);

    OLED_WriteCommand(0xD5);
    OLED_WriteCommand(0x80);

    OLED_WriteCommand(0xA8);
    OLED_WriteCommand(0x3F);

    OLED_WriteCommand(0xD3);
    OLED_WriteCommand(0x00);

    OLED_WriteCommand(0x40);

    OLED_WriteCommand(0xA1);

    OLED_WriteCommand(0xC8);

    OLED_WriteCommand(0xDA);
    OLED_WriteCommand(0x12);

    OLED_WriteCommand(0x81);
    OLED_WriteCommand(0xCF);

    OLED_WriteCommand(0xD9);
    OLED_WriteCommand(0xF1);

    OLED_WriteCommand(0xDB);
    OLED_WriteCommand(0x30);

    OLED_WriteCommand(0xA4);

    OLED_WriteCommand(0xA6);

    OLED_WriteCommand(0x8D);
    OLED_WriteCommand(0x14);

    OLED_WriteCommand(0xAF);

    Delay_ms(100);
}

// OLED 清屏
void OLED_Clear(void)
{
    for (uint8_t j = 0; j < 8; j++)
    {
        OLED_SetCursor(0, j);
        {
            for (uint8_t i = 0; i < 128; i++)
            {
                OLED_WriteData(0x00);
            }
        }
    }
}

// OLED显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char mChar, uint8_t fontSize)
{
    if (fontSize == 8)
    {
        // 设置起始位置
        OLED_SetCursor(x, y);
        uint8_t i = 0;
        for (i = 0; i < 8; i++)
        {
            // 写入数组指定行的第i个数据
            OLED_WriteData(ascii8x16[mChar - ' '][i]);
        }

        OLED_SetCursor(x, y + 1);
        for (i = 0; i < 8; i++)
        {
            OLED_WriteData(ascii8x16[mChar - ' '][i + 8]);
        }
    }
}

// OLED显示字符串
// void OLED_ShowString(uint8_t x, uint8_t y, char *string, uint8_t fontSize)
// {
//     uint8_t i = 0;
//     for (i = 0; string[i] != '\0'; i++)
//     {
//         // 每个字符对应的起始坐标等于最初的起始坐标,
//         OLED_ShowChar(x + i * fontSize, y, string[i], fontSize);
//     }
// }
void OLED_ShowString(uint8_t X, uint8_t Page, char *String, uint8_t FontSize)
{
    for (uint8_t i = 0; String[i] != '\0'; i++)
    {
        OLED_ShowChar(X + i * FontSize, Page, String[i], FontSize);
    }
}

// OLED显示图片
void OLED_ShowImage(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *Image)
{
    for (uint8_t j = 0; j < height; j++)
    {
        // 设置起始位置
        OLED_SetCursor(x, y + j);
        uint8_t i = 0;
        for (i = 0; i < width; i++)
        {
            // 写入数组指定行的第i个数据
            OLED_WriteData(Image[width * j + i]);
        }
    }
}
/**
 * @brief 补充注释
 * 如果高度是1也就是只有8个像素,也就是只有一页
 * 那么显示一页的数据就是遍历width页就是字符的宽度个字节
 * 然后显示对应的数。
 * 如果高度不仅仅是1而是16,也就是代表这个字符是跨2页进行
 * 写入的,那么就要再加一个for循环对第二页的数据进行写入
 * 也就是第二页开始的字节然后写入【0-9】【】
 *
 */

// void OLED_ShowChinese(uint8_t x, uint8_t y, char *chinese)
// {
//     // 第一步:先把传递过来的汉字串,拆分为一个个独立的汉字
//     char SigleChinese[4] = {0};
//     uint8_t pChinese = 0;

//     // 定义一个变量用于存放索引
//     uint8_t pIndex;

//     // 第二步:遍历汉字字模,一一匹配汉字索引
//     for (uint8_t i = 0; chinese[i] != '\0'; i++)
//     {
//         SigleChinese[pChinese] = chinese[i];
//         pChinese++;

//         if (pChinese >= 3)
//         {
//             pChinese = 0;

//             for (pIndex = 0; strcmp(OLED_CF16X16[pIndex].Index, "") != 0; pIndex++)
//             {
//                 if (strcmp(OLED_CF16X16[pIndex].Index, SigleChinese) == 0)
//                 {
//                     break;
//                 }
//             }
//             // 第三步:取出指定位置的字模数据
//             OLED_ShowImage(x + ((i + 1) / 3 - 1) * 16, y, 16, 2, OLED_CF16X16[pIndex].Data);
//         }
//     }
// }

void OLED_ShowChinese(uint8_t X, uint8_t Page, char *Chinese)
{
    char SigleChinese[4] = {0};
    uint8_t pChinese = 0;
    uint8_t pIndex;

    for (uint8_t i = 0; Chinese[i] != '\0'; i++)
    {
        SigleChinese[pChinese] = Chinese[i];
        pChinese++;

        if (pChinese >= 3)
        {
            pChinese = 0;

            for (pIndex = 0; strcmp(OLED_CF16x16[pIndex].Index, "") != 0; pIndex++)
            {
                if (strcmp(OLED_CF16x16[pIndex].Index, SigleChinese) == 0)
                {
                    break;
                }
            }

            OLED_ShowImage(X + ((i + 1) / 3 - 1) * 16, Page, 16, 2, OLED_CF16x16[pIndex].Data);
        }
    }
}

OLED_H文件:

#ifndef _OLED_H_
#define _OLED_H_
#include <stdint.h>

// OLED初始化
void OLED_Init(void);

// OLED发送命令
void OLED_WriteCommand(uint8_t command);

// OLED发送数据
void OLED_WriteData(uint8_t data);

// OLED显示位置
void OLED_SetCursor(uint8_t x, uint8_t page);

// OLED 清屏
void OLED_Clear(void);

// OLED显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char mChar, uint8_t fontSize);

// OLED显示图片
void OLED_ShowImage(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *Image);

// void OLED_ShowChinese(uint8_t x, uint8_t y, char *chinese);

void OLED_ShowChinese(uint8_t X, uint8_t Page, char *Chinese);

void OLED_ShowString(uint8_t X, uint8_t Page, char *String, uint8_t FontSize);

#endif

编译以上程序输出如下结果:


...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Visual Studio 2022中配置C++计算机视觉库Opencv

本文主要介绍下载OpenCV库以及在Visual Studio 2022中配置、编译C计算机视觉库OpenCv的方法 1.Opencv库安装 ​ 首先&#xff0c;我们需要安装OpenCV库&#xff0c;作为一个开源库&#xff0c;我们可以直接在其官网下载Releases - OpenCV&#xff0c;如果官网下载过慢&#x…

QT:QDEBUG输出重定向和命令行参数QCommandLineParser

qInstallMessageHandler函数简介 QtMessageHandler qInstallMessageHandler(QtMessageHandler handler) qInstallMessageHandler 是 Qt 框架中的一个函数&#xff0c;用于安装一个全局的消息处理函数&#xff0c;以替代默认的消息输出机制。这个函数允许开发者自定义 Qt 应用…

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

OpenGL ES 03 加载3张图片并做混合处理

OpenGL ES 02 加载3张图片并做混合处理 什么是纹理单元纹理单元的作用使用纹理单元的步骤详细解释加载图片并绑定到到GPU纹理单元采样器的设置1.设置采样器变量的纹理单元编号&#xff0c;目的是为了告诉纹理采样器&#xff0c;从哪个纹理单元采集数据2.如果你没有显式地设置采…

临床外显子组测序分析中的那些坑(上)

大规模并行测序技术或下一代测序已成为基因诊断和研究的标准技术&#xff0c;尤其是外显子组和基因组测序现在已经在世界范围内广泛应用于患者的分子诊断。在过去几年中&#xff0c;许多实验室都在努力应对基于全新技术建立基因检测工作流程的挑战。测序技术中持续引入新的仪器…

【Tomcat】第六站(最后一站啦!):数据的返回

1. 引言 前端资源比如html页面&#xff0c;进行返回。截止到目前我们写的项目架构不支持前端页面&#xff08;静态资源 &#xff09;。 2. 数据的返回 2.1 准备 为了能够写前端页面&#xff0c;新建一个项目。选择Maven项目&#xff0c;下一步&#xff0c;下一步。 加载完…

ai论文生成器:分享8款AI一键生成论文的写作软件

在撰写毕业论文的过程中&#xff0c;高效利用各类软件工具可以极大地提升写作效率与质量。以下是八个免费的神器软件工具&#xff0c;它们各自在论文撰写、文献管理、语法校对、数据可视化等方面发挥着重要作用。希望这些推荐能帮助你顺利完成毕业论文的写作。 千笔AI论文&…

【Ubuntu 20.04】notepad++的安装与汉化

一&#xff0c;简介 本文介绍如何在Ubuntu虚拟机中安装notepad&#xff0c;供参考。 二&#xff0c;操作步骤 2.1 notepad的安装 sudo snap install notepad-plus-plus

Cherno C++学习笔记 P45 拷贝与拷贝构造函数

在这一篇文章当中&#xff0c;我们会学习一下C当中的复制以及复制构造函数&#xff0c;当然&#xff0c;还会用一个相对比较完整的代码类作为例子。这也是我们第一次写一个相对比较长的和完整的代码。 对于C来说&#xff0c;理解复制是非常重要的&#xff0c;因为整个C变成可以…

uniapp入门 01创建项目模版

0安装 hbuilder x 标准版 1.创建模版工程 2.创建官方 案例工程 index.uvuewen 文件解析 <!-- 模版 标签 --> <template><view></view></template><!-- 脚本 --> <script>export default {data() {return {}},onLoad() {},methods:…

kubeadm安装K8s高可用集群之集群初始化及master/node节点加入calico网络插件安装

系列文章目录 1.kubeadm安装K8s高可用集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 3.kubeadm安装K8s高可用集群之集群初始化及master/node节点加入集群calico网络插件安装 kubeadm安装K8s高可用集群之集群初始化及master/node节点加入ca…

【NLP】序列到序列(seq2seq)建模工具fairseq使用详解

文章目录 一、fairseq简介二、安装方式2.1 pip安装2.2 源码安装 三、fairseq命令工具3.1 fairseq-preprocess3.2 fairseq-train3.3 fairseq-generate3.4 fairseq-interactivate3.5 fairseq-score3.6 fairseq-eval-lm 4. 常见报错报错1 参考资料 一、fairseq简介 fairseq 是 Fa…

28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强

A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法&#xff1a;无模型水下图像增强方法&#xff1a;基于深度学习的水下图像增强方法&#xff1a; 论文方法概述像素分布…

ArkTs组件的学习

一. AlphabetIndexer 可以与容器组件联动用于按逻辑结构快速定位容器显示区域的组件 参数名类型必填说明arrayValueArray<string>是字母索引字符串数组&#xff0c;不可设置为空selectednumber是初始选中项索引值若超出索引值范围则取默认值0 class Lxr{tImg:Resource…

Python读取Excel批量写入到PPT生成词卡

一、问题的提出 有网友想把Excel表中的三列数据&#xff0c;分别是&#xff1a;单词、音标和释义分别写入到PPT当中&#xff0c;每一张PPT写一个单词的内容。这种批量操作是python的强项&#xff0c;尤其是在办公领域&#xff0c;它能较好地解放双手&#xff0c;读取Excel表后…

百度面试手撕 go context channel部分学习

题目 手撕 对无序的切片查询指定数 使用context进行子协程的销毁 并且进行超时处理。 全局变量定义 var (startLoc int64(0) // --- 未处理切片数据起始位置endLoc int64(0) // --- 切片数据右边界 避免越界offset int64(0) // --- 根据切片和协程数量 在主线程 动态设…

Otsu 二值化算法:原理、实现与应用

摘要&#xff1a; 本文深入探讨了 Otsu 二值化算法&#xff0c;详细阐述其原理&#xff0c;包括类间方差的计算与阈值确定机制。分别给出了该算法在 C#、Python 和 C 中的实现代码示例&#xff0c;并对代码进行了详细注释与分析。此外&#xff0c;还探讨了 Otsu 二值化算法在图…

uniApp使用腾讯地图提示未添加maps模块

uniApp使用腾讯地图&#xff0c;打包提示未添加maps模块解决方案 这是报错信息&#xff0c;在标准基座运行的时候是没问题的&#xff0c;但是打包后会提示未添加&#xff0c;可以通过在mainfest里面把地图插件上腾讯地图的key更换高德地图的key&#xff0c;定位服务可以继续用腾…

Deepin/Linux clash TUN模式不起作用,因网关导致的问题的解决方案。

网关导致的问题的解决方案 查看路由 ip route寻找默认路由 默认路由应当为Mihomo default dev Mihomo scope link 如果不是&#xff0c;则 sudo ip route add default dev Mihomo在clash TUN开关状态发生变化时&#xff0c;Mihomo网卡会消失&#xff0c;所以提示找不到网卡…

scala中正则表达式的使用

正则表达式&#xff1a; 基本概念 在 Scala 中&#xff0c;正则表达式是用于处理文本模式匹配的强大工具。它通过java.util.regex.Pattern和java.util.regex.Matcher这两个 Java 类来实现&#xff08;因为 Scala 运行在 Java 虚拟机上&#xff0c;可以无缝使用 Java 类库&…