Begrijp het principe van OLED-display - Verschillende manieren om OLED-modules te gebruiken
De OLED-module heeft vier werkwijzen, namelijk 6800 en 8080 parallelle interfaces, 4-draad serie SPI-interface-modus en IIC-interface-modus.De relatie tussen de instellingen BS1/BS2 en de modulesinterface-modus is weergegeven in de volgende tabel::
De standaardinstelling van de SAEF Technology OLED-module is BS0 tot GND, BS1 en BS2 tot VCC (modus 8080), indien u deze op andere modi wilt instellen,je moet de BS0-BS2 instellingen aanpassen met een soldeermachine aan de achterkant van de OLED(Hardware vervangen)
Uit het schema kunnen we zien dat er in totaal 16 pinnen uitgetrokken zijn, en van de 16 lijnen, hebben we slechts 15 pinnen gebruikt, en een van hen hangt.En er zijn er nog 13 over.In verschillende modi is het aantal signaallijnen dat we nodig hebben verschillend, in de 8080-modus zijn alle 13 nodig, waarvan er één gebruikelijk is, namelijk de reset-lijn RST (RES),die we direct kunnen verbinden met de reset van de MCU (om te bevestigen dat de reset methode is hetzelfde)In IIC-modus zijn slechts 2 regels nodig!
De werkwijze van de IIC heeft slechts twee lijnen nodig, en de werkwijze van de IIC is om twee draden te gebruiken om de IIC te simuleren om gegevens te verkrijgen.
De OLED-controller is SSD1306, dat wil zeggen: het naakte scherm wordt aangedreven door SSD1306, die ook een meer gebruikte led-driverchip is.
Video-geheugen voor OLED-modules
OLED zelf heeft geen video geheugen, en het video geheugen is afhankelijk van SSD1306 te leveren.Elke pagina bevat 128 bytes, in totaal 8 pagina's, dat is precies 128 x 64 dot matrix grootte.
Omdat OLED echter niet één dotmatrix tegelijk kan besturen, kan het slechts een 8-dotmatrix besturen.
Omdat elk schrijven in bytes wordt geschreven, is er een probleem, als we de schrijf-alleen modus gebruiken om de module te bedienen, dan moeten we 8 punten tegelijk schrijven, dus wanneer we een punt tekenen,We moeten de huidige toestand van elk bit van de byte waar het punt om te worden ingesteld is (0/1Anders zal de geschreven gegevens de vorige staat overschrijven, en het resultaat zal zijn dat sommige punten die niet hoeven te worden weergegeven worden weergegeven,of die die moeten worden weergegeven niet worden weergegevenIn de leesbare modus kunnen we eerst de te schrijven byte uitlezen, de huidige situatie krijgen, en het vervolgens in de gram schrijven nadat we het te herschrijven bit hebben gewijzigd,zodat het de vorige situatie niet beïnvloedtDit vereist echter de mogelijkheid om de GRAM te lezen, voor 3-draad of 4-draad SPI-modus ondersteunt de module niet lezen, en de read->-to-> write-modus is ook relatief traag.
Dus de methode die we gebruiken is om een OLED GRAM (in totaal 128 bytes) te maken in de STM32, en bij elke wijziging, alleen de GRAM op de STM32 (eigenlijk SRAM), en na de wijziging,de GRAM op de STM32 tegelijk op de OLED GRAM schrijvenDeze methode heeft natuurlijk ook nadelen, d.w.z. voor microcontrollers met een zeer kleine SRAM (zoals de 51-serie) is het lastiger.
Video-geheugen van OLED
Het opslagformaat is als volgt:
Eén, twee, drie... 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];
Update het video-geheugen op het LCD-scherm
nietig OLED_Refresh_Gram (nietig)
{
u8 i,n;
voor ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Paginaadres instellen (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Stel de weergavepositie in
OLED_WR_Byte (0x10,OLED_CMD); instellen van de weergavepositie
voor ((n=0; n<128; n++)OLED_WR_Byte ((OLED_GRAM[n][i],OLED_DATA);
}
}
Bevel SSD1306
1Bevel 0X81: Stel het contrast in. Bevat twee bytes, de eerste 0X81 is het commando, en de volgende ene byte is de waarde van het contrast dat moet worden ingesteld. Hoe groter deze waarde is ingesteld, hoe groter de waarde van het contrast.hoe helderder het scherm zal zijn.
2: commando 0XAE/0XAF: 0XAE om het display commando uit te schakelen; 0XAF om het display commando aan te zetten.
3: Bevel 0X8D: bevat 2 bytes, de eerste is het commandowoord, de tweede is de ingestelde waarde, de tweede byte van BIT2 geeft de schakeltoestand van de laadpomp aan, het bit is 1,de laadpomp is aanWanneer de module is geïnitieerd, moet dit worden ingeschakeld, anders ziet u het scherm niet.
4: commando 0XB0~B7: Wordt gebruikt om het paginaadres in te stellen en de onderste drie cijfers komen overeen met het paginaadres van de GRAM.
5: commando 0X00~0X0F: wordt gebruikt om de onderste vier cijfers van het startkolomadres in te stellen bij het weergeven.
6: commando 0X10~0X1F: wordt gebruikt om het startkolomadres van het scherm vier cijfers hoger in te stellen.
Voor meer opdrachten, verwijzen we u hiernaar, het wordt sterk aanbevolen om het te zien, het is zeer gedetailleerd: SSD1306 (OLED driver chip) instructies in detail
Na het introduceren van de werkmodus en de driver chip, kunnen we beginnen met het gebruik van deze IIC OLED module
Gedetailleerde code
#define OLED_CMD 0 // schrijf opdracht
#define OLED_DATA 1 //Schrijf gegevens
Initialiseren van de OLED
Start de SSD1306
void OLED_Init (vrij)
GPIO_InitTypeDef;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, AANVOLK); activeer de klok op de A-poort
De in de bijlage vermelde gegevens zijn van toepassing op de in de bijlage bij Verordening (EG) nr. 45/2001 bedoelde gegevens.
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; Push-pull output
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; snelheid 50MHz
GPIO_Init ((GPIOA, &GPIO_InitStructure); Initialiseer de GPIO
GPIO_SetBits ((GPIOA,GPIO_Pin_5 door GPIO_Pin_7);
delay_ms(200);
OLED_WR_Byte ((0xAE,OLED_CMD);
OLED_WR_Byte ((0x00,OLED_CMD);//---stel laag kolomadres in
OLED_WR_Byte ((0x10,OLED_CMD);//---stel hoog kolomadres in
OLED_WR_Byte ((0x40,OLED_CMD);//--stel startlijnadres
OLED_WR_Byte ((0xB0,OLED_CMD);//--stelpaginaadres
OLED_WR_Byte ((0x81,OLED_CMD); // Contractuele controle
Voor de toepassing van deze richtlijn wordt het gebruik van de in bijlage I vermelde technologieën als onderdeel van de productieprocedure beschouwd.
OLED_WR_Byte ((0xA1,OLED_CMD);//set segment remap
Voor de toepassing van deze richtlijn worden de volgende voorschriften toegepast:
Voor de toepassing van de in bijlage I vermelde voorschriften moet de in bijlage I vermelde methode worden toegepast.
Voor de toepassing van deze richtlijn geldt dat de in de bijlage bij Verordening (EG) nr. 1272/2008 bedoelde voorschriften van toepassing zijn.
OLED_WR_Byte ((0xC8,OLED_CMD);//Com scanrichting
OLED_WR_Byte ((0xD3,OLED_CMD);//-set display offset
De in de bijlage bij Verordening (EG) nr. 45/2001 vermelde parameters zijn van toepassing op:
Voor de toepassing van deze richtlijn wordt de volgende bepaling toegepast:
De in de bijlage bij Verordening (EG) nr. 45/2001 vermelde parameters zijn van toepassing op de in de bijlage bij Verordening (EG) nr. 45/2001 bedoelde parameters.
OLED_WR_Byte ((0xD8,OLED_CMD);//uitgezet gebiedskleurmodus
De in de bijlage bij Verordening (EG) nr. 45/2001 vermelde parameters zijn van toepassing op:
Voor de toepassing van deze richtlijn wordt het gebruik van de in bijlage I vermelde systemen als onderdeel van de toepassing van de richtlijnen van de Europese Unie beschouwd, mits deze systemen in overeenstemming zijn met het beginsel van gelijke behandeling.
Het is de bedoeling dat de Commissie de volgende maatregelen neemt om de veiligheid van de luchtvaartmaatschappijen te waarborgen:
OLED_WR_Byte ((0xDA,OLED_CMD);//set com pin configuratie
Het is de bedoeling dat de Commissie de volgende maatregelen neemt:
Voor de toepassing van deze richtlijn wordt het gebruik van de in bijlage I vermelde technologieën als onderdeel van de productieprocedure beschouwd.
De in de bijlage bij Verordening (EG) nr. 45/2001 vermelde parameters zijn van toepassing op de in de bijlage bij Verordening (EG) nr. 45/2001 bedoelde parameters.
OLED_WR_Byte ((0x8D,OLED_CMD);//set charge pump enable
Het is de bedoeling dat de Commissie de volgende aanbevelingen doet:
OLED_WR_Byte ((0xAF,OLED_CMD);//--aanzetten van OLED-paneel}
OLED_Clear(); Maak het scherm schoon, het wordt aanbevolen om het scherm eerst schoon te maken na elke initialisatie is voltooid
Het scherm leegmaken functie, na het scherm leegmaken, is het hele scherm zwart!
nietig OLED_Clear (nietig)
{
u8 i,n;
voor ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Paginaadres instellen (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Stel de weergavepositie in
OLED_WR_Byte (0x10,OLED_CMD); instellen van de weergavepositie
voor ((n=0; n<128; n++)OLED_WR_Byte(0,OLED_DATA);
} // Update het display
}
In de zelfmodule die we gewoonlijk gebruiken, zijn er twee gebruikelijke manieren om de modulaire te nemen, een is 6 * 8, en de andere is 8 * 16,De eerste is om de karakters die we willen in een rechthoekige tabel met 8 rijen en 6 kolommen te nemen, en de tweede is om de tekens te verwijderen in een rechthoekige tabel met 16 rijen en 8 kolommen.ruimte voor de volgende pagina moet worden gebruiktDus we hebben de lettergrootte die we gewoonlijk gebruiken, natuurlijk, dit zijn veelgebruikte lettergroottes, we kunnen ook onze eigen favoriete lettergrootte maken door middel van karaktermodulatie software.
/* Toont een teken op de opgegeven locatie, inclusief enkele tekens
x:0~127
y:0~63
grootte: Selecteer lettertype 16/12*/
de omvang van de vertoning van het beeldscherm is gelijk aan de omvang van het beeldscherm;
{
ongetekende char c=0,i=0;
c=chr-' '; De verschuivingswaarde kan worden verkregen uit het lettertypepatroon, het eerste is'', en het overeenkomstige teken kan worden verkregen door af te trekken
if(x>Max_Column-1) {x=0; y=y+2; } //Max_Column: Maximale kolom: 128; x: instellen van het aantal kolommen; y: instellen van het aantal pagina's
if(Char_Size ==16) // In dit geval is dezelfde kolom van twee pagina's vereist, en de stippeltjesmatrix van 8*16 is vereist
{
OLED_Set_Pos(x,y); Als x = y = 2, zet het dan in kolom 3 op pagina 3, opmerking: er zijn slechts acht rijen per pagina
voor ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i],OLED_DATA); Door de i te verhogen, worden de stippen in een lus getekend en worden alle 8 rijen van de tweede kolom op pagina 2 in de gegevens geschreven
OLED_Set_Pos(x,y+1); Aangezien het aantal stippen niet voldoende is, moet u doorgaan met de stippen in kolom 2 op bladzijde 3
voor ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i+8],OLED_DATA); Ga door met het voltooien van de tekening tot het einde van punt 16
}
andere
{
OLED_Set_Pos ((x,y); 6x8 dot matrix, geen behoefte aan andere pagina's om het schilderen voort te zetten
voor ((i=0; i<6; i++)
OLED_WR_Byte ((F6x8[c][i],OLED_DATA); In een tweedimensionale matrix controleert C de rijen en I de kolommen, dus er zijn geen andere bewerkingen nodig om de tekening af te maken
}
}
De volgende if(x>120) is geen fout, omdat de vorige x+=8; Er is een verklaring in de volgende notities, dus je kunt erover nadenken.
void OLED_ShowString ((u8 x,u8 y,u8 *chr,u8 Char_Size) // Toont de string
{
ongetekende char j=0;
while (chr[j]!='0') // Controleer of de string eindigt
{
OLED_ShowChar ((x,y,chr[j],Char_Size); teken de tekens één voor één
x + = 8; x is ingesteld op een kolom, de grootte van een teken is 8 * 16, dat wil zeggen de rij is 16 en de kolom is 8, en elke keer wordt weergegeven als een, moet je 8 kolommen naar de hogere kolom
als(x>120) {x=0; y+=2; } // Het maximum is 128 kolommen, als het wordt overschreden, moet je opnieuw beginnen met de nulkolom, omdat je andere pagina's nodig hebt om het schilderen op dit moment voort te zetten,om overlappingen te voorkomen, heb je y + = 2 nodig.
j++; teken strings in een lus
}
}
2 cijfers worden weergegeven, beide geschreven in de onderstaande code, en het moet worden opgemerkt dat de "" hieronder de ASCII-waarde van 32 vertegenwoordigt
M^n functie
u32 oled_pow ((u8 m,u8 n)
{
u32 resultaat=1;
terwijl (n-) resultaat*=m;
retourresultaat;
}
Toon 2 cijfers
x,y: startcoördinaten
len: het aantal cijfers van het getal
grootte: de lettergrootte
modus: modus 0, vulmodus; 1. overlappingsmodus
num: numerieke waarde (0~4294967295);
void OLED_ShowNum ((u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
voor t=0; t { Temp=(num/oled_pow(10,len-t-1))%10; if(show==0&&t<(len-1)) { if(temp==0) { De in punt 3 van dit hoofdstuk vermelde parameters zijn van toepassing op: doorgaan; } anders verschijnt=1; } OLED-display Char ((x+(size2/2) *t,y,temp+'0',size2); } De bovenstaande verschillende zijn onze meest elementaire gebruik, sommige Xi willen het gebruiken om meer verschillende operaties te voltooien, het volgende is, voordat de introductie,eerst introduceren onze veelgebruikte modellen software. PC naar LCD 2002 Dit is hoe het werkt. Wanneer we het gebruiken, openen we eerst het bestand in de linkerbovenhoek en maken we een nieuw bestand.Er is een versnelling in de hoek., en we moeten het openen zodra we de grootte hebben ingesteld. Als je alles bovenop hebt, kun je tekenen wat je wilt. Omdat OLED 128 x 64 is, is onze maximale grootte dit, we kunnen schrijven op 128 x 64, tekenen, enz.Dat is ook een manier om het scherm te vullen., en er is een soort impression software aan de achterkant, die wordt verkregen als een afbeelding, zoals sommige anime personages. Nu we de gereedschappen hebben geïntroduceerd, zijn we klaar om door te gaan met onze operaties! 1Trek een rechte lijn 2: Toon afbeeldingen (zoals sommige anime personages) Het voelt een beetje lang, er zijn meer manieren om te spelen.
Meestal gebruiken we hetzelfde punt als in de onderstaande figuur als we een rechte lijn willen tekenen, krijgen we altijd een punt, dit komt omdat de tekengrootte die we over het algemeen gebruiken is 6 * 8 of 8 * 16,en de puntgrootte binnenin is niet vol van de hele rechthoek (hierboven uitgelegd)Wat we moeten doen is onze karaktersoftware openen en het punt groter maken!
Contactpersoon: Mrs. Christina
Tel.: +8618922869670
Fax: 86-755-2370-9419