기술나눔

TB 작품] 51 싱글칩 프로테우스 시뮬레이션 51 싱글칩 SPI 디스플레이 OLED 캐릭터 드라이버

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

여기에 이미지 설명을 삽입하세요.

// GND 전원 접지
// VCC는 5V 또는 3.3v 전원 공급 장치에 연결됩니다.
// D0 P1^4(SCL)
// D1 P1^3(SDA)
// RES는 P12에 연결됩니다.
//DC는 P11에 연결됩니다.
//CS는 P10에 연결됩니다.

OLED 디스플레이 인터페이스 및 제어 실험 보고서

배경

OLED(유기발광다이오드) 디스플레이는 높은 명암비, 낮은 전력 소모, 빠른 응답 속도로 인해 다양한 전자 기기에 널리 사용되고 있다. 이 실험은 마이크로컨트롤러를 사용하여 OLED 디스플레이를 인터페이스하고 제어하도록 설계되었습니다. 사용된 디스플레이 드라이버는 소형 OLED 화면에 일반적으로 사용되는 컨트롤러인 SSD1306입니다.

하드웨어 구성 요소

  1. OLED 디스플레이: SSD1306 컨트롤러로 구동되는 디스플레이 모듈을 사용합니다.
  2. 마이크로컨트롤러: 8051 기반 마이크로 컨트롤러를 사용하여 OLED 디스플레이를 제어합니다.
  3. 전원 공급 장치: OLED 모듈에 전원을 공급하려면 3.3V 또는 5V 전원 공급 장치가 필요합니다.
  4. 연결선: OLED와 마이크로컨트롤러를 연결하는데 사용됩니다.

회로 연결

  • 접지: 전원 접지에 연결합니다.
  • (주)비씨씨: 3.3V 또는 5V 전원 공급 장치에 연결합니다.
  • D0(SCL): P1^4(SCL)에 연결합니다.
  • D1(SDA): P1^3(SDA)에 연결합니다.
  • 저작권: P12에 연결하세요.
  • 직류: P11에 연결하세요.
  • 씨에스: P10에 연결합니다.

설계 원칙

메모리 구조

OLED의 비디오 메모리 저장 형식은 다음과 같습니다.

[0]0 1 2 3 ... 127
[1]0 1 2 3 ... 127
[2]0 1 2 3 ... 127
...
[7]0 1 2 3 ... 127
  • 1
  • 2
  • 3
  • 4
  • 5

지연 기능

void delay_ms1(unsigned int ms) {
    unsigned int a;
    while (ms) {
        a = 80;
        while (a--);
        ms--;
    }
    return;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

이 지연 기능은 간단한 루프를 통해 밀리초 수준의 지연을 구현하며 OLED 초기화 및 제어 시 안정적인 작동을 보장하는 데 사용됩니다.

바이트 쓰기

OLED 모드에 따라 바이트는 병렬 또는 직렬 인터페이스를 통해 SSD1306에 기록됩니다. 다음 코드는 병렬 및 직렬 모드의 쓰기 작업을 보여줍니다.

#if OLED_MODE == 1
// 并行模式
void OLED_WR_Byte(u8 dat, u8 cmd) {
    DATAOUT(dat);
    if (cmd) OLED_DC_Set();
    else OLED_DC_Clr();
    OLED_CS_Clr();
    OLED_WR_Clr();
    OLED_WR_Set();
    OLED_CS_Set();
    OLED_DC_Set();
}
#else
// 串行模式
void OLED_WR_Byte(u8 dat, u8 cmd) {
    u8 i;
    if (cmd) OLED_DC_Set();
    else OLED_DC_Clr();
    OLED_CS_Clr();
    for (i = 0; i < 8; i++) {
        OLED_SCLK_Clr();
        if (dat & 0x80) OLED_SDIN_Set();
        else OLED_SDIN_Clr();
        OLED_SCLK_Set();
        dat <<= 1;
    }
    OLED_CS_Set();
    OLED_DC_Set();
}
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

주요 기능 구현

커서 위치 설정
void OLED_Set_Pos(unsigned char x, unsigned char y) {
    OLED_WR_Byte(0xb0 + y, OLED_CMD);
    OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);
    OLED_WR_Byte((x & 0x0f) | 0x01, OLED_CMD);
}
  • 1
  • 2
  • 3
  • 4
  • 5
디스플레이 제어

OLED 디스플레이를 켜고 끕니다.

void OLED_Display_On(void) {
    OLED_WR_Byte(0X8D, OLED_CMD); // SET DCDC命令
    OLED_WR_Byte(0X14, OLED_CMD); // DCDC ON
    OLED_WR_Byte(0XAF, OLED_CMD); // DISPLAY ON
}

void OLED_Display_Off(void) {
    OLED_WR_Byte(0X8D, OLED_CMD); // SET DCDC命令
    OLED_WR_Byte(0X10, OLED_CMD); // DCDC OFF
    OLED_WR_Byte(0XAE, OLED_CMD); // DISPLAY OFF
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
화면 지우기
void OLED_Clear(void) {
    u8 i, n;
    for (i = 0; i < 8; i++) {
        OLED_WR_Byte(0xb0 + i, OLED_CMD); // 设置页地址(0~7)
        OLED_WR_Byte(0x00, OLED_CMD);     // 设置显示位置—列低地址
        OLED_WR_Byte(0x10, OLED_CMD);     // 设置显示位置—列高地址
        for (n = 0; n < 128; n++) OLED_WR_Byte(0, OLED_DATA);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
표시 문자

지정된 위치에 문자를 표시합니다.

void OLED_ShowChar(u8 x, u8 y, u8 chr) {
    unsigned char c = 0, i = 0;
    c = chr - ' ';
    if (x > Max_Column - 1) {
        x = 0; y = y + 2;
    }
    if (SIZE == 16) {
        OLED_Set_Pos(x, y);
        for (i = 0; i < 8; i++) OLED_WR_Byte(F8X16[c * 16 + i], OLED_DATA);
        OLED_Set_Pos(x, y + 1);
        for (i = 0; i < 8; i++) OLED_WR_Byte(F8X16[c * 16 + i + 8], OLED_DATA);
    } else {
        OLED_Set_Pos(x, y + 1);
        for (i = 0; i < 6; i++) OLED_WR_Byte(F6x8[c][i], OLED_DATA);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
표시 문자열
void OLED_ShowString(u8 x, u8 y, u8 *chr) {
    unsigned char j = 0;
    while (chr[j] != '0') {
        OLED_ShowChar(x, y, chr[j]);
        x += 8;
        if (x > 120) {
            x = 0; y += 2;
        }
        j++;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

초기화

OLED 초기화 프로세스에는 디스플레이가 올바르게 작동하는지 확인하기 위한 일련의 구성 명령이 포함됩니다.

void OLED_Init(void) {
    OLED_RST_Set();
    delay_ms1(100);
    OLED_RST_Clr();
    delay_ms1(100);
    OLED_RST_Set();

    OLED_WR_Byte(0xAE, OLED_CMD); // 关闭OLED面板
    OLED_WR_Byte(0x00, OLED_CMD); // 设置低列地址
    OLED_WR_Byte(0x10, OLED_CMD); // 设置高列地址
    OLED_WR_Byte(0x40, OLED_CMD); // 设置起始行地址
    OLED_WR_Byte(0x81, OLED_CMD); // 设置对比度控制寄存器
    OLED_WR_Byte(0xCF, OLED_CMD); // 设置SEG输出电流亮度
    OLED_WR_Byte(0xA1, OLED_CMD); // 设置段/列映射
    OLED_WR_Byte(0xC8, OLED_CMD); // 设置COM/行扫描方向
    OLED_WR_Byte(0xA6, OLED_CMD); // 设置正常显示
    OLED_WR_Byte(0xA8, OLED_CMD); // 设置多路复用比率
    OLED_WR_Byte(0x3f, OLED_CMD); // 1/64 duty
    OLED_WR_Byte(0xD3, OLED_CMD); // 设置显示偏移
    OLED_WR_Byte(0x00, OLED_CMD); // 不偏移
    OLED_WR_Byte(0xd5, OLED_CMD); // 设置显示时钟分频比/振荡频率
    OLED_WR_Byte(0x80, OLED_CMD); // 设置时钟为100帧/秒
    OLED_WR_Byte(0xD9, OLED_CMD); // 设置预充电周期
    OLED_WR_Byte(0xF1, OLED_CMD); // 设置预充电为15时钟和放电为1时钟
    OLED_WR_Byte(0xDA, OLED_CMD); // 设置COM引脚硬件配置
    OLED_WR_Byte(0x12, OLED_CMD);
    OLED_WR_Byte(0xDB, OLED_CMD); // 设置VCOMH
    OLED_WR_Byte(0x40, OLED_CMD); // 设置VCOM解除电平
    OLED_WR_Byte(0x20, OLED_CMD); // 设置页地址模式
    OLED_WR_Byte(0x02, OLED_CMD);
    OLED_WR_Byte(0x8D, OLED_CMD); // 设置电荷泵使能/禁用
    OLED_WR_Byte(0x14, OLED_CMD); // 设置(0x10)禁用
    OLED_WR_Byte(0xA4, OLED_CMD); // 禁用整个显示
    OLED_WR_Byte(0xA6, OLED_CMD); // 禁用反向显示
    OLED_WR_Byte(0xAF, OLED_CMD); // 打开OLED面板
    OLED_Clear();
    OLED_Set_Pos(0, 0);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

재료

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
  • 1