Komma igång med OLED-displayer (12 / 16 steg)
Steg 12: Hur man rita en cirkel?
Vi kan använda följande kod för att generera en cirkel på skärmen:
#include //Include tråd bibliotek för I2C kommunikation
#define höjd 64
#define bredd 128
CONST int RST = 10; Tilldela stift 10 för återställning
int i; Ställ in variabeln i som heltal
statiska unsigned char array [1024]; Buffert array
void setup() {
pin_init(); Initiera pins
initialize_OLED(); Initiera skärm
MEMSET (array, 0, sizeof(array)); Initiera arrayen med 0s
Circle(63,31,10); Rita cirklar, (x, y, R)
Flush(); Skicka data
}
void loop() {
}
void pin_init() {
Serial.BEGIN(9600); Ange baud för seriell överföring
pinMode (RST, OUTPUT); Ange första som utgång
}
void initialize_OLED() {
Wire.BEGIN(); Initiera I2C gränssnitt
digitalWrite (RST, låg); Ange första pin låg
Delay(100); Vänta 100 ms
digitalWrite (RST, hög); Ange första pin hög
Wire.beginTransmission(0x3D); Börja meddelandet med slav
Wire.write(0x00); Kommandot ström
Wire.write(0xAE); Ställ in skärm
Wire.write(0xD5); Ställa in displayen klockfrekvens klyftan förhållandet/oscillator
Wire.write(0x80);
Wire.write(0xA8); Ställ in multiplex förhållandet
Wire.write(0x3F);
Wire.write(0xD3); Ställ in displayen offset
Wire.write(0x00);
Wire.write(0x40); Ställ in displayen startlinjen
Wire.write(0x8D); Ställ in charge pump
Wire.write(0x14); VCC genereras av inre DC/DC krets
Wire.write(0xA1); Ställa in segmentet re-karta
Wire.write(0xC0); Ange COM-utgång scan riktning
Wire.write(0xDA); Ange COM pins maskinvarukonfiguration
Wire.write(0x12);
Wire.write(0x81); Ange kontrastkontroll
Wire.write(0xCF);
Wire.write(0xD9); Förväg ändrade viss
Wire.write(0xF1);
Wire.write(0xDB); Inställd VCOMH avmarkerat nivå
Wire.write(0x40);
Wire.write(0xA4); Ange hela displayen på/av
Wire.write(0xA6); Ställ in normal/inversen display
Wire.write(0x20); Ställ in minne adress läge
Wire.write(0x00); Horisontella
Wire.write(0xAF); Ange visning på
Wire.endTransmission(); Avsluta kommunikation med slav
}
/ * Mittpunkten cirkel algoritm * /
void cirkel (int x0, int y0, int R) {
int x = R; Ange x är lika med radien
int y = 0;
int de = 1-x;
medan (x > = y) {
draw_pixel (x + x0, y + y0); Första Oktanten
draw_pixel (y + x0, x + y0); Andra Oktanten
draw_pixel (-y + x0, x + y0); Tredje Oktanten
draw_pixel (-x + x0, y + y0); Fjärde Oktanten
draw_pixel (-x + x0, -y + y0); Femte Oktanten
draw_pixel (-y + x0, - x + y0); Sjätte Oktanten
draw_pixel (y + x0, - x + y0); Sjunde Oktanten
draw_pixel (x + x0, -y + y0); Åtta Oktanten
y ++;
om (de < = 0) {
de += 2 * y + 1.
}
annat {
x--;
de += 2 *(y-x) + 1;
}
}
}
void draw_pixel (int x, int y) {
om ((x<0) || (x > = bredd) || (y < 0) || (y > = höjd)) {//Check avgränsningar
hemkomst.
}
annat {
Array [x + (y/8) * bredd] | = _BV((y%8)); Store pixel i en matris
}
}
void Flush() {
Wire.beginTransmission(0x3D); Börja meddelandet med slav
Wire.write(0x00); Kommandot ström
Wire.write(0x00); Ställa in lägre kolumn startadressen för sidan adressering läge
Wire.write(0x10); Ställa högre kolumn startadressen för sidan adressering läge
Wire.write(0x40); Ställ in displayen startlinjen
Wire.endTransmission(); Avsluta kommunikation med slav
unsigned char twbrbackup = TWBR; Två tråd bithastighet registrera
TWBR = 12; Inställd på 400kHz
för (osignerad kort q = 0; q < (bredd * höjd/8), q ++) {
Wire.beginTransmission(0x3D); Börja meddelandet med slav
Wire.write(0x40); Dataström
för (unsigned char w = 0; w < 16; w ++) {
Wire.write(array[q]); Överföra data som ska visas
q ++;
}
q--;
Wire.endTransmission(); Avsluta kommunikation med slav
}
TWBR = twbrbackup;
}
Funktionen cirklar bygger på Mittpunkten cirkel algoritm används för att generera cirklar med pixlar. Algoritmen ritar en bildpunkt i taget i varje Oktanten av cirkeln med hjälp av symmetri tills omkrets är klar. Gång, används funktionen pixel för att rita varje pixel av cirkeln varje gång det kallas i programmet. Se följande länk för mer information om algoritmen:
https://en.wikipedia.org/wiki/Midpoint_circle_algo...
Genom att ge vår krets fungerar tre argument (ursprung på (x, y) och radius), vi kan nu Rita en cirkel som den ovan.
I detta exempel cirkelns ursprung (63,31) och har en radie på 10, vilket genererar en cirkel med en radie på 10 pixlar i mitten av sidan.