Oled implementa pantalla de animación - chico de baloncesto

Oled implementa pantalla de animación - chico de baloncesto

El módulo de visualización Oled, usar la definición de caracteres para borrar la interfaz causará copos de nieve en la pantalla; si char i, j; está firmado, significa de -128 a 127, lo que hará que se traguen algunos números, use int o char sin firmar ( que significa ningún símbolo)

Equipo: placa de desarrollo 51 y módulo de pantalla OLED de 4 pines de 0,96 pulgadas.

Para decirlo sin rodeos, la visualización de la animación consiste en separar la imagen GIF en una imagen cuadro por cuadro, y mostrar una imagen es similar a mostrar una imagen.

Paso 1: Extraiga y separe las imágenes. Se recomienda Gifsplitter.

inserte la descripción de la imagen aquí

Paso 2: Reduzca la calidad de la imagen, cambie la imagen a formato bmp y ajuste el tamaño a 128 × 64 (puede ajustarlo dentro del software o usar la aplicación Windows Paint). Los detalles son los siguientes:

inserte la descripción de la imagen aquí

Paso 3: tome el módulo de la imagen (el paso más engorroso, donde está el software de módulo de una tecla, estoy ansioso por decirle) Estoy usando CopyLeft Bu Horse2000 aquí, y se recomienda usar PCtolCD

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Después de tomar el módulo, añádele la matriz. El código específico es el siguiente:

#include "reg52.h"
#include "intrins.h"

sbit scl = P0^1;
sbit sda = P0^3;


void IIC_Start()
{
    
    
    scl = 0;
    sda = 1;
    scl = 1;
    _nop_();
    sda = 0;
    _nop_();
}

void IIC_Stop()
{
    
    
    scl = 0;
    sda = 0;
    scl = 1;
    _nop_();
    sda = 1;
    _nop_();
}

char IIC_ACK()
{
    
    
    char flag;
    sda = 1;//就在时钟脉冲9期间释放数据线
    _nop_();
    scl = 1;
    _nop_();
    flag = sda;
    _nop_();
    scl = 0;
    _nop_();

    return flag;
}

void IIC_Send_Byte(char dataSend)
{
    
    
    int i;

    for(i = 0; i<8; i++) {
    
    
        scl = 0;//scl拉低,让sda做好数据准备
        sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda
        _nop_();//发送数据建立时间
        scl = 1;//scl拉高开始发送
        _nop_();//数据发送时间
        scl = 0;//发送完毕拉低
        _nop_();//
        dataSend = dataSend << 1;
    }
}

void Oled_Write_Cmd(char dataCmd)
{
    
    
    //	1. start()
    IIC_Start();
    //
    //	2. 写入从机地址  b0111 1000 0x78
    IIC_Send_Byte(0x78);
    //	3. ACK
    IIC_ACK();
    //	4. cotrol byte: (0)(0)000000 写入命令   (0)(1)000000写入数据
    IIC_Send_Byte(0x00);
    //	5. ACK
    IIC_ACK();
    //6. 写入指令/数据
    IIC_Send_Byte(dataCmd);
    //7. ACK
    IIC_ACK();
    //8. STOP
    IIC_Stop();
}

void Oled_Write_Data(char dataData)
{
    
    
    //	1. start()
    IIC_Start();
    //
    //	2. 写入从机地址  b0111 1000 0x78
    IIC_Send_Byte(0x78);
    //	3. ACK
    IIC_ACK();
    //	4. cotrol byte: (0)(0)000000 写入命令   (0)(1)000000写入数据
    IIC_Send_Byte(0x40);
    //	5. ACK
    IIC_ACK();
    ///6. 写入指令/数据
    IIC_Send_Byte(dataData);
    //7. ACK
    IIC_ACK();
    //8. STOP
    IIC_Stop();
}


void Oled_Init(void) {
    
    
    Oled_Write_Cmd(0xAE);//--display off
    Oled_Write_Cmd(0x00);//---set low column address
    Oled_Write_Cmd(0x10);//---set high column address
    Oled_Write_Cmd(0x40);//--set start line address
    Oled_Write_Cmd(0xB0);//--set page address
    Oled_Write_Cmd(0x81); // contract control
    Oled_Write_Cmd(0xFF);//--128
    Oled_Write_Cmd(0xA1);//set segment remap
    Oled_Write_Cmd(0xA6);//--normal / reverse
    Oled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)
    Oled_Write_Cmd(0x3F);//--1/32 duty
    Oled_Write_Cmd(0xC8);//Com scan direction
    Oled_Write_Cmd(0xD3);//-set display offset
    Oled_Write_Cmd(0x00);//

    Oled_Write_Cmd(0xD5);//set osc division
    Oled_Write_Cmd(0x80);//
    
    Oled_Write_Cmd(0xD8);//set area color mode off
    Oled_Write_Cmd(0x05);//
    
    Oled_Write_Cmd(0xD9);//Set Pre-Charge Period
    Oled_Write_Cmd(0xF1);//
    
    Oled_Write_Cmd(0xDA);//set com pin configuartion
    Oled_Write_Cmd(0x12);//
    
    Oled_Write_Cmd(0xDB);//set Vcomh
    Oled_Write_Cmd(0x30);//
    
    Oled_Write_Cmd(0x8D);//set charge pump enable
    Oled_Write_Cmd(0x14);//
    
    Oled_Write_Cmd(0xAF);//--turn on oled panel
}

void Oled_Clear(void) {
    
    
    int i,j;
    Oled_Write_Cmd (0x20);                    //set memory addressing mode
    Oled_Write_Cmd (0x02);                    //page addressing mode

    for(i=0; i<8; i++) {
    
    
        Oled_Write_Cmd(0xB0+i);               //ÉèÖÃÒ³µØÖ·£¨0~7£©
        Oled_Write_Cmd(0x00);                 //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
        Oled_Write_Cmd(0x10);                 //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·
        for(j=0; j<128; j++) {
    
    
            Oled_Write_Data(0);
        }
    }
}






void Oled_Show_Image(unsigned char *image) {
    
    
    unsigned char i;
    unsigned int j;

    for(i=0; i<8; i++) {
    
    
        Oled_Write_Cmd(0xB0+i); //page0 ——page7
    
        Oled_Write_Cmd(0x00); //每个page从第0列开始
        Oled_Write_Cmd(0x10);
    
        for(j=128*i; j<128*(i+1); j++) {
    
    
            Oled_Write_Data(image[j]);
        }
    }
}
void main()
{
    
    
    //1. OLED初始化
    Oled_Init();
    //2. 选择一个位置
    //2.1 确认页寻址模式
    Oled_Write_Cmd(0x20);
    Oled_Write_Cmd(0x02);
    Oled_Clear();
    //Oled_Show_Image(bmpImager);
    while(1) {
    
    //取模代码太多就不写出来了

        Oled_Show_Image(bmpImager41);
        _nop_();
        Oled_Show_Image(bmpImager42);
        _nop_();
        Oled_Show_Image(bmpImager43);
        _nop_();
        Oled_Show_Image(bmpImager44);
        _nop_();
        Oled_Show_Image(bmpImager45);
        _nop_();
        Oled_Show_Image(bmpImager46);
        _nop_();
    }

}

Este código causará algunos problemas con la velocidad de fotogramas de la pantalla de Oled. Debería deberse a demasiadas funciones de retraso, redundancia de código u otros problemas. Bienvenido a comunicarse y resolver.
Demostración de efectos

estudiar

Supongo que te gusta

Origin blog.csdn.net/weixin_54882070/article/details/129717803
Recomendado
Clasificación