Compreender o princípio do ecrã OLED - Várias maneiras de usar módulos OLED
O módulo OLED tem quatro modos de funcionamento, nomeadamente interfaces paralelas 6800 e 8080, modo de interface SPI serial de 4 fios e modo de interface IIC.A relação entre as definições BS1/BS2 e o modo de interface do módulo é apresentada no quadro seguinte::
A definição por defeito do módulo OLED da SAEF Technology é BS0 para GND, BS1 e BS2 para VCC (modo 8080), se quiser definir para outros modos,você precisa modificar as configurações BS0-BS2 com um solda no verso do OLED(Mudança de hardware)
A partir do esquema, podemos saber que há um total de 16 pinos desenhados, e das 16 linhas, usamos apenas 15 pinos, e um deles está pendurado.E restam 13.Em diferentes modos, o número de linhas de sinal que precisamos é diferente, no modo 8080, todos os 13 são necessários, um dos quais é comum, ou seja, a linha de redefinição RST (RES),que podemos conectar diretamente para a redefinição da MCU (para confirmar que o método de redefinição é o mesmo)No modo IIC, são necessárias apenas 2 linhas!
O modo de trabalho do IIC só precisa de duas linhas, e o modo de trabalho do IIC é usar dois fios para simular o IIC para obter dados.
O controlador OLED é SSD1306, ou seja: o ecrã nu é accionado por SSD1306, que também é um chip de driver LED mais utilizado.
Memória de vídeo do módulo OLED
O próprio OLED não possui memória de vídeo, e sua memória de vídeo depende do SSD1306 para fornecer.Cada página contém 128 bytes, um total de 8 páginas, que é exatamente 128 * 64 tamanho de matriz de pontos.
No entanto, como o OLED não pode controlar uma matriz de pontos de cada vez, ele só pode controlar uma matriz de 8 pontos; e é um controle de varredura vertical;
Porque cada escrita é escrita em bytes, há um problema, se usarmos o modo de somente escrita para operar o módulo, então, temos que escrever 8 pontos de cada vez, então quando desenhamos um ponto,devemos descobrir o estado atual de cada bit do byte onde o ponto a ser definido está localizado (0/1?). Caso contrário, os dados escritos irá substituir o estado anterior, e o resultado será que alguns pontos que não precisam ser exibidos são exibidos,ou aqueles que devem ser exibidos não são exibidosNo modo legível, podemos ler o byte a ser escrito primeiro, obter a situação atual, e depois escrever no gramado depois de modificar o bit a ser reescrito,para que não afete a situação anteriorNo entanto, isso requer a capacidade de ler a GRAM, para o modo SPI de 3 fios ou 4 fios, o módulo não suporta leitura e o modo read->-to-> write também é relativamente lento.
Então o método que usamos é criar um GRAM OLED (um total de 128 bytes) dentro do STM32, e em cada modificação, apenas modificar o GRAM no STM32 (na verdade SRAM), e após a modificação,escrever o GRAM no STM32 no GRAM OLED de uma só vezNaturalmente, este método também tem desvantagens, isto é, para os microcontroladores com SRAM muito pequena (como a série 51), é mais problemático.
Memória de vídeo de OLED
O formato de armazenamento é o seguinte:
0 1 2 3... 127
//[1]0 1 2 3... 127
//[2]0 1 2 3... 127
//[3]0 1 2 3... 127
//[4]0 1 2 3... 127
//[5]0 1 2 3... 127
//[6]0 1 2 3... 127
//[7]0 1 2 3... 127
u16 OLED_GRAM[128][8];
Atualize a memória de vídeo para o LCD
Não válido OLED_Refresh_Gram
{
U8 i, n;
para ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Indicar endereço da página (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Definir a posição de exibição
OLED_WR_Byte (0x10,OLED_CMD); Definir a posição de exibição
para ((n=0; n<128; n++) OLED_WR_Byte ((OLED_GRAM[n][i],OLED_DATA);
}
}
Comando SSD1306
1Comando 0X81: Configure o contraste. Contém dois bytes, o primeiro 0X81 é o comando e o seguinte byte é o valor do contraste a ser definido.Quanto mais brilhante for o ecrã.
2: Comando 0XAE/0XAF: 0XAE para desligar o comando de exibição; 0XAF para ligar o comando de exibição.
3: comando 0X8D: contém 2 bytes, o primeiro é a palavra de comando, o segundo é o valor definido, o segundo byte de BIT2 indica o estado de comutação da bomba de carga, o bit é 1,A bomba de carga está ligadaQuando o módulo é inicializado, isso deve ser habilitado, caso contrário você não verá a exibição na tela.
4: Comando 0XB0~B7: Usado para definir o endereço da página, e os três dígitos inferiores correspondem ao endereço da página do GRAM.
5: Comando 0X00~0X0F: Usado para definir os quatro dígitos inferiores do endereço da coluna inicial ao exibir.
6: Comando 0X10~0X1F: Usado para definir o endereço da coluna de início do ecrã quatro dígitos mais alto.
Para mais comandos, por favor, consulte este, é altamente recomendado para vê-lo, é muito detalhado: SSD1306 (OLED driver chip) instruções em detalhes
Depois de introduzir o modo de trabalho e driver chip, podemos começar a usar este módulo IIC OLED
Código detalhado
#define OLED_CMD 0 // escrever comando
#definir OLED_DATA 1 //Escrever dados
Iniciar o OLED
Iniciar o SSD1306
emissão de um sinal OLED_Init
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, Ativar); Ativar o relógio na porta A
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; saída Push-pull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; Velocidade 50MHz
GPIO_Init ((GPIOA, &GPIO_InitStructure); Iniciar o GPIO
GPIO_SetBits ((GPIOA,GPIO_Pin_5 em GPIO_Pin_7);
delay_ms(200);
Display desligado
OLED_WR_Byte ((0x00,OLED_CMD);//--- definir endereço de coluna baixa
OLED_WR_Byte ((0x10,OLED_CMD);//---definir endereço de coluna alta
OLED_WR_Byte ((0x40,OLED_CMD);//--definir endereço de linha de início
OLED_WR_Byte ((0xB0,OLED_CMD);//--indicar endereço da página
OLED_WR_Byte ((0x81,OLED_CMD); // Controlo de contrato
O número de unidades de produção é o número de unidades de produção.
OLED_WR_Byte ((0xA1,OLED_CMD);//remap do segmento de conjunto
OLED_WR_Byte ((0xA6,OLED_CMD);//--normal / inverso
O número de unidades de transmissão é o seguinte:
O número de unidades de produção é o número de unidades de produção.
OLED_WR_Byte ((0xC8,OLED_CMD);//Com direção de varredura
OLED_WR_Byte ((0xD3,OLED_CMD);//-set display offset
O número de unidades de produção é igual ou superior a:
OLED_WR_Byte ((0xD5,OLED_CMD);//set osc division
O número de unidades de produção é o seguinte:
OLED_WR_Byte ((0xD8,OLED_CMD);//estabelecer o modo de cor da área desligado
O número de unidades de produção é o seguinte:
Para efeitos do presente regulamento, a utilização de um sistema de transmissão de dados é considerada como uma atividade económica, uma atividade económica ou uma atividade económica.
A partir de 1 de janeiro de 2014, a Comissão adoptou uma decisão relativa à aplicação do presente regulamento, em conformidade com o n.o 1 do artigo 4.o do Regulamento (CE) n.o 765/2008.
OLED_WR_Byte ((0xDA,OLED_CMD);//configuração de pin com
O que é que se passa?
O sistema de transmissão de dados é um sistema de transmissão de dados.
A partir de 1 de janeiro de 2014, a Comissão adoptou uma decisão relativa à aplicação do presente regulamento, em conformidade com o artigo 4.o, n.o 3, do Regulamento (CE) n.o 765/2008.
OLED_WR_Byte ((0x8D,OLED_CMD);//Ativar a bomba de carga
O que é que é o "Old-Range" (Old-Range)?
OLED_WR_Byte ((0xAF,OLED_CMD);//-- ligar o painel oled}
OLED_Clear(); Limpe a tela, recomenda-se limpar a tela primeiro após cada inicialização é concluída
Função de limpeza de tela, depois de limpar a tela, toda a tela fica preta! É o mesmo que não acender!!
não válido OLED_Clear (não válido)
{
U8 i, n;
para ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Indicar endereço da página (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Definir a posição de exibição
OLED_WR_Byte (0x10,OLED_CMD); Definir a posição de exibição
para ((n=0; n<128; n++)OLED_WR_Byte(0,OLED_DATA);
} // Atualizar a exibição
}
No auto-módulo que usamos normalmente, há duas maneiras comuns de tomar o modular, um é 6 * 8, e o outro é 8 * 16,O primeiro é tirar os caracteres que queremos numa tabela retangular com 8 linhas e 6 colunas, e a segunda é retirar os caracteres de uma tabela retangular com 16 linhas e 8 colunas.espaço para a página seguinte precisa ser usadoEntão temos o tamanho da fonte que usamos normalmente, é claro, estes são tamanhos de fonte comumente usados, também podemos fazer o nosso próprio tamanho de fonte favorito através de um software de modulação de caracteres.
/* Mostra um caracter no local especificado, incluindo alguns caracteres
x:0~127
y:0~63
Tamanho: Selecionar fonte 16/12*/
O número de unidades de produção é igual ou superior a:
{
char não assinado c=0,i=0;
c=chr-' '; O valor de deslocamento pode ser obtido a partir do padrão de fonte, o primeiro é " ', e o caráter correspondente pode ser obtido subtraindo
if(x>Max_Column-1) {x=0; y=y+2; } //Max_Column: Coluna máxima: 128; x: definir o número de colunas; y: definir o número de páginas
if(Char_Size ==16) // Neste caso, a mesma coluna de duas páginas é necessária, e a matriz de pontos de 8*16 é necessária
{
OLED_Set_Pos(x,y); Se x = y = 2, então definir para a coluna 3 na página 3, nota: há apenas oito linhas por página
para ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i],OLED_DATA); Incrementando o i, os pontos são desenhados em um loop, e todas as 8 linhas da segunda coluna na página 2 são escritas nos dados
OLED_Set_Pos(x,y+1); Uma vez que o número de pontos não é suficiente, você precisa continuar os pontos na coluna 2 na página 3
para ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i+8],OLED_DATA); continuar a terminar o desenho até ao final do ponto 16
}
outros
{
OLED_Set_Pos ((x,y); matriz de pontos 6x8, sem necessidade de outras páginas para continuar a pintura
para ((i=0; i<6; i++)
OLED_WR_Byte ((F6x8[c][i],OLED_DATA); Em uma matriz bidimensional, C controla as linhas e I controla as colunas, por isso não são necessárias outras operações para terminar o desenho
}
}
O seguinte se ((x>120) não é um erro, porque o anterior x + = 8; Há uma explicação nas notas a seguir, então você pode pensar sobre isso.
void OLED_ShowString ((u8 x,u8 y,u8 *chr,u8 Char_Size) // Mostra a cadeia
{
char não assinado j=0;
while (chr[j]!='0') // Verifique se a cadeia termina
{
OLED_ShowChar ((x,y,chr[j],Char_Size); Desenhe os caracteres um por um
x + = 8; x é definido para uma coluna, o tamanho de um caractere é 8 * 16, ou seja, a linha é 16 e a coluna é 8, e cada vez que ele é exibido como um, você precisa mover 8 colunas para a coluna superior
se(x>120) {x=0; y+=2; } // O máximo é de 128 colunas, se ele for excedido, você precisa começar a partir da coluna zero novamente, porque você precisa de outras páginas para continuar a pintura neste momento,para evitar a sobreposição, você precisa de y + = 2.
j++; Desenhar cordas em um loop
}
}
2 números são exibidos, ambos escritos no código abaixo e deve-se notar que o "" abaixo representa o valor ASCII de 32
M^n função
U32 oled_pow ((u8 m,u8 n)
{
Resultado u32=1;
enquanto ((n--) resultado*=m;
resultado de retorno;
}
Mostrar 2 números
x,y: coordenadas de início
len: Número de dígitos do número
tamanho: o tamanho da fonte
Modo: modo 0, modo de enchimento;
Num: valor numérico (0~4294967295);
O número de imagens de LED emitidas deve ser igual ou superior a:
{
u8 t,temp;
u8 enshow=0;
para t=0; t { Temp=(num/oled_pow(10,len-t-1))%10; se (mostrar) { se (temporalmente) { O sistema de transmissão de imagem deve ser equipado com um sistema de transmissão de imagem com um sistema de transmissão de imagem com um sistema de transmissão de imagem com um sistema de transmissão de imagem com um sistema de transmissão de imagem com um sistema de transmissão de imagem com um sistema de transmissão de imagem. continuar; Se não, mostra 1. } Display OLED Char ((x+(size2/2) *t,y,temp+'0',size2); } Os vários acima são o nosso uso mais básico, alguns Xi querem usá-lo para completar mais operações diferentes, o seguinte é, antes da introdução,Primeiro introduzimos o nosso software de modelagem comumente usado. PC para LCD 2002 É assim que funciona! Quando o usamos, primeiro abrimos o arquivo no canto superior esquerdo e criamos um novo.Há uma coisa parecida com uma engrenagem no canto de cima., e precisamos de abri-lo uma vez que temos definido o tamanho. Uma vez que você tem tudo em cima, você pode desenhar o que quiser. porque OLED é 128 x 64, o nosso tamanho máximo é este, podemos escrever em 128 x 64, desenhar, etc, o que sai é uma imagem completa,que também é uma maneira de preencher a tela, e há uma espécie de software de impressão na parte de trás, que é obtido como uma imagem, como alguns personagens de anime. Agora que introduzimos as ferramentas, estamos prontos para avançar para as nossas operações! 1Desenhe uma linha reta. 2: Mostre imagens (como alguns personagens de anime) Parece um pouco longo, há mais maneiras de jogar, para atualizar.
Normalmente usamos o mesmo ponto que na figura abaixo quando queremos desenhar uma linha reta, sempre obtemos um ponto, isso é porque o tamanho de caracteres que geralmente usamos é 6 * 8 ou 8 * 16,e o tamanho do ponto no interior não está cheio de todo o retângulo (explicado acima), o que precisamos de fazer é abrir o nosso software de personagens e fazer o ponto maior!
Pessoa de Contato: Mrs. Christina
Telefone: +8618922869670
Fax: 86-755-2370-9419