Prueba de pantalla OLED de 0,96 pulgadas y análisis detallado de código Comunicación SPI

Primera vez intentando encender

Dirección del código del programa , contraseña: 1234.
Compré un OLED de dos colores y descargué la información. Tenía un Arduino 8266 en la mano, así que lo usé por conveniencia. La razón principal para usar Arduino es que la llave del microcontrolador es demasiado grande y es problemático encontrar el archivo y modificar los pines. De hecho, los principios de la comunicación SPI son los mismos.
Primer intento, encontré problemas:
1. Es necesario modificar el número de PIN en la información.
2. El archivo **font.h y el archivo de proyecto (.ino)** de varios caracteres obtenidos mediante el módulo de matriz de puntos deben colocarse en el Clip de archivo del mismo nivel en el interior. En la introducción se recomienda colocarlo en la carpeta lib de Arduino, pero para mayor comodidad, también se puede leer directamente, así que simplemente muévalo a una carpeta. Y este es sólo un archivo de caracteres de muestra, no es necesario guardarlo.
Insertar descripción de la imagen aquí
3. Cabe señalar que si solo se suministra el voltaje de la fuente de alimentación, el OLED no se iluminará. Al principio sospeché que la pantalla estaba rota, luego, luego de conectar el cable de señal y descargar el programa, descubrí que la pantalla era normal, no sé por qué los colores tomados por el teléfono móvil estaban un poco distorsionados.
Insertar descripción de la imagen aquí

El controlador SSD1306 lee el análisis del tiempo de trabajo

Insertar descripción de la imagen aquí
Como se puede ver en el diagrama de tiempos, incluye principalmente 6 tipos de tiempo: ciclo de reloj, tiempo de configuración de dirección, tiempo de selección de chip, tiempo de lectura y escritura de datos, tiempo alto y bajo en el ciclo del reloj, tiempo de flanco ascendente y descendente. ciclo
: mayor que 100 ns = 10 -7 s, es decir, la frecuencia del reloj es menor que 10 MHz,
el tiempo de bajo y alto nivel en el ciclo del reloj : mayor que 15 ms
configuración/tiempo de retención de dirección (datos/comando), Tiempo de escritura/lectura de datos: configurando si desea transmitir datos o ordenar , encontrará dos tipos. El valor del tiempo es el mismo. Básicamente, escribir comandos y escribir direcciones son transferencias de información.
Tiempo de flanco ascendente y descendente : El máximo es 40 ns. En teoría, la forma de onda ideal debería ser una onda rectangular, es decir, los flancos ascendente y descendente son 0 s.

Análisis general del tiempo:
en primer lugar, la primera vez es cuando entra en vigor el tiempo de selección del chip cs . Después de todo, el dispositivo no se ha seleccionado bien y no tiene sentido enviar datos o comandos, ya que la transmisión de datos o comandos se completa en el flanco ascendente del reloj , por lo que durante el período del flanco ascendente, se debe garantizar que el nivel de D/C (datos/comando) y la transmisión de datos sean estables.

Análisis de configuraciones comunes (en realidad, la comprensión de cómo conducir SSD1306)

Parámetros básicos OLED

Pantalla de dos colores de 0,96 pulgadas, compatible con comunicación IIC y spi, 128*64 píxeles, memoria de visualización de 8 páginas, lo que equivale a dividir las líneas de la pantalla en 8 partes según el número de bytes

Uso de comandos y método de búsqueda del manual del conductor

Fuente: Hay muchas formas, algunas de las cuales solo proporcionan contenido común. Si desea conocer el manual detallado, puede visitar algunos sitios web sobre manuales de hardware (como chips semiconductores, etc.) para verificar y descargar. Es una interceptación de una parte de la tabla de comandos para explicar cómo usarla.
Insertar descripción de la imagen aquí

Comando de inicialización

El siguiente OLED_WR_Byte es una función definida: la MCU escribe el programa en el controlador para controlar la pantalla. Dependiendo del software de programación y de la MCU, el programa puede aparecer en diferentes formas, pero los comandos básicos son los mismos. Estos comandos se pueden encontrar a través del manual.
Varios comandos que son más importantes y que a menudo necesitan ser cambiados:
1. Establecer contraste : Aquí se siente como brillo. El comando es como se muestra a continuación. De acuerdo con la forma de ver el comando manual anterior, puede saber que necesita enviar el comando dos veces . El primer 0x81 es solo para informar al conductor. El primer comando propio es el valor de contraste
Insertar descripción de la imagen aquí
2. Los comandos relacionados con la pantalla incluyen pantalla encendida (AF)/apagada (AE), bit de datos 0 (A7) o 1 (A6). ) encendido, arriba y abajo, izquierda y derecha (26/27), todo se puede encontrar en el manual
Insertar descripción de la imagen aquí

Comando de ubicación de visualización de dirección

Consulte la Tabla de comandos de configuración de direcciones 3 en la Tabla de comandos 9 en el manual.
La posición de visualización de esta pantalla de control debe controlar el modo de dirección de memoria, el inicio de la columna, el inicio y el final de la fila. En primer lugar, sabemos
que hay 8 páginas, lo que equivale a almacenar 8 cachés de pantalla de 128*64

Hay tres modos de dirección de memoria : modo de dirección de página , modo de dirección horizontal , modo de dirección vertical

Insertar descripción de la imagen aquí

	OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WR_Byte(0x02,OLED_CMD);//也就是A[1:0]=10b
Modo de direccionamiento de página

Este modo: El puntero irá automáticamente al principio cuando llegue al final de cada página, pero no irá a la página siguiente.
Insertar descripción de la imagen aquí
Este modo requiere dos comandos para establecer la posición inicial de la columna.
Insertar descripción de la imagen aquí
Configuración del inicio de la página
Insertar descripción de la imagen aquí

Modo de direccionamiento horizontal

Este tipo de distribución de direcciones salta automáticamente al principio al final de la línea, y la página pasa automáticamente a la siguiente. Cuando finalice la última página, apuntará a la primera. Insertar descripción de la imagen aquí
Establecer el inicio y el final de la columna
Insertar descripción de la imagen aquí
Establecer el inicio de la página
Insertar descripción de la imagen aquí

La distribución de direcciones del siguiente patrón es de arriba a abajo y de izquierda a derecha.
Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

Transferencia de datos de bytes (datos/comando)

Insertar descripción de la imagen aquí
La configuración en el programa a continuación coincide exactamente con el diagrama de tiempo de transmisión de datos anterior.
Insertar descripción de la imagen aquí

Visualización de datos de caracteres

El método general consiste en tomar un módulo de los caracteres y, cuando se completan los ajustes de inicialización, los datos de la matriz de fuentes se pasan a la
marca de letras ASCII del controlador.
Insertar descripción de la imagen aquí

	void OLED_Set_Pos(unsigned char x, unsigned char y) 
{
    
     
	/*
	x±íʾ¿ªÊ¼ÏÔʾµÄÏñËØÆðʼλÖÃ
	y±íʾÏÔʾÔÚÄÇÒ»Ò³
	*/
	OLED_WR_Byte(0xb0+y,OLED_CMD);     //ÉèÖõØÖ·Ò³£¬y¡Ê[0£¬7]
	//½«ÏÔʾµÄ¿ªÊ¼µØÖ·ÖеĸßËÄ룬ºÍµÍËÄλ·Ö¿ªºóдÈë¸øOLED
	//¶ø8λµÄ·¶Î§
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);  //ÉèÖÃÏÔʾλÖᪿªÊ¼ÁеØÖ·µÄµÍËÄλ
	OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);    //ÉèÖÃÏÔʾλÖᪿªÊ¼ÁеØÖ·¸ßËÄλ
}   	
/*参数含义(c51程序)
x,显示位置的横坐标x
y,显示位置纵坐标y
下面程序中几个参数是宏定义过的,
size=16(字模16*8),OLED_DATA=1(传送的是数据)
*/
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{
    
          	
	unsigned char c=0,i=0;	
		c=chr-' ';					//字符在ascii位置	
		if(x>Max_Column-1)  //如果显示到最右边
			{
    
    x=0;y=y+2;}	//到最左边,向下移动两个像素
		if(SIZE ==16)
			{
    
    
			OLED_Set_Pos(x,y);	//设置字符显示的起始地址
			for(i=0;i<8;i++)    //将一个字节的8个位按位传送出去
				OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);   //F8X16是取字模的数组,这个传送方式要看具体的取模方式
			OLED_Set_Pos(x,y+1);  //向下移动一个地址页page
			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);
				
			}
}

Si desea analizar los motivos de la asignación de ubicación del código que se muestra arriba, debe considerar la forma de obtener el modelo de fuente.
Insertar descripción de la imagen aquí


{
    
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},/*"-",0*/
/* (8 X 16 , 隶书 )*/

Busque la matriz del carácter "-" en la biblioteca de fuentes e invierta el método del módulo.
Por favor agregue la descripción de la imagen.

Modo módulo, bit bajo primero.
Insertar descripción de la imagen aquí
El siguiente es el método de asignación de direcciones de píxeles en el controlador.
Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

			/*传入显示的数据*/
			OLED_Set_Pos(x,y);	//设置字符显示的起始地址
			for(i=0;i<8;i++)    //将一个字节的8个位按位传送出去
				OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);   //F8X16是取字模的数组,这个传送方式要看具体的取模方式
			OLED_Set_Pos(x,y+1);  //向下移动一个地址页page
			for(i=0;i<8;i++)
				OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
				
			/*设置地址OLED_Set_Pos中的纵轴方向设置,下面手册中命令可以看出*/
			OLED_WR_Byte(0xb0+y,OLED_CMD);	

El modo específico establecido aquí, el segundo dígito hexadecimal indica la página ingresada
Insertar descripción de la imagen aquí

El proceso de escritura de bytes del código anterior se muestra en la siguiente figura, F8X16[c*16+i] , donde c*16 es un carácter que ocupa 16 bytes, por lo que se obtiene el índice de caracteres y se requieren 16 bytes en un carácter. Se envía por bytes, por lo que hay un desplazamiento i . Una vez transferidos los 8 bytes de datos actuales, es necesario cambiar la página en el controlador. La función de **OLED_Set_Pos(x,y+1);** no es solo cambiar una línea, sino cambiar la línea en bytes, es decir, cambiar la página.
Insertar descripción de la imagen aquí

Transferencia de cuerdas

//实际上就是将字符串看作指针,对每个字符遍历显示,直到最后一位
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;   //每个字符横向占8个位
			//到屏幕最右边若不够放下一个字符,会跳转到下一行显示,y+=2是因为,一个字符高度是两个字节
		if(x>120){
    
    x=0;y+=2;} 
			j++;
	}
}

sentimientos y percepciones personales

En general, parece que hay muchos comandos. Pero sigue siendo muy conveniente inicializar de acuerdo con la introducción del manual.
Es importante revisar la hoja de datos. La visualización normal de la pantalla requiere una comprensión clara del módulo de hardware y los métodos de escritura de datos basados ​​en software .
La visualización de la pantalla depende en gran medida del método de modulación de caracteres o imágenes y del método de cableado real del hardware.
Hay dos formas de controlar al conductor: comandos entrantes o datos. El juicio de los comandos o datos entrantes se controla dándole a la pantalla un pin con niveles alto y bajo.

Supongo que te gusta

Origin blog.csdn.net/weixin_43794311/article/details/132719536
Recomendado
Clasificación