Mikrocontroller – Ein Anfängerhandbuch – Erstellen einer neuen Bibliotheksroutine zum Anzeigen ganzer Zahlen auf dem LCD

Mikrocontroller - Ein Leitfaden für Anfänger - Erstellen einer neuen Bibliotheksroutine zur Anzeige von Ganzzahlen auf dem LCD

Wir wissen, wie man eine Ganzzahl auf dem LCD anzeigt, aber dafür sind viele Codezeilen erforderlich. Machen wir die Anzeige von Ganzzahlen auf dem LCD-Bildschirm und die gewünschte Position der Ganzzahl etwas einfacher. Zuerst schauen wir uns an, was wir tun müssen, um eine Ganzzahl auf dem LCD und an einer bestimmten Stelle anzuzeigen. Unten ist der Code-Snippet dafür:

itoa(TenBitValue, adcResult, 10);
GotoMrLCDsLocation(1, 1);
Send_A_String(adcResult); Send_A_String(" ");

Die itoa-Funktion benötigt drei Parameter: Die ganzzahlige Variable, in diesem Fall die Variable TenBitValue, die den digitalen Wert der analogen Messung speichert, adcResult ist der String oder das Zeichenarray, das den Wert der digitalen Messung in Stringform speichert, damit er auf dem LCD angezeigt werden kann, und schließlich ist 10 die Basis. Die Basis ist das Zahlensystem. Das Standard-Digitalzahlensystem ist in Basis 10 und hat die einzelnen Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8 und 9. Basis 2 hätte nur 2 einzelne Ziffern: 0 und 1.

Ich kann mir vorstellen, Zahlen ständig auf dem LCD anzuzeigen, daher möchte ich definitiv nicht jedes Mal diese vier Codezeilen eingeben, wenn ich Ganzzahlen auf dem LCD haben muss. Es ist also an der Zeit, die LCD-Bibliothek zu erweitern, sodass wir nur eine einzige Codezeile schreiben müssen, um Ganzzahlen auf dem LCD zu platzieren und die Position auch in dieser Codezeile anzugeben. Die übergebenen Parameter sind x und y für die Position, die ganzzahlige Variable und die Anzahl der Ziffern, um Speicherplatz für das Zeichenarray zu schaffen. Die neue Funktion wird wie folgt aussehen:

Send_An_IntegerToMrLCD(x, y, TenBitValue, 4);

Um die Dinge einfacher zu gestalten, wird eine weitere Funktion zur Bibliothek hinzugefügt, um einen String an eine bestimmte Position auf dem LCD zu senden, da wir diese Funktionalität ebenfalls benötigen könnten. Dann können wir dies verwenden, um unsere Ganzzahlfunktion mit dieser Funktion zu erstellen. Hier ist die Funktion, um einen String von Zeichen an eine bestimmte Position auf dem LCD zu senden:

void Send_A_StringToMrLCDWithLocation(uint8_t x, uint8_t y, char *StringOfCharacters)
{
GotoMrLCDsLocation(x, y);
Send_A_String(StringOfCharacters);
}

Jetzt wird unsere Funktion zum Senden einer Ganzzahl viel einfacher zu implementieren sein:

void Send_An_IntegerToMrLCD(uint8_t x, uint8_t y, int IntegerToDisplay, char NumberOfDigits)
{
char StringToDisplay[NumberOfDigits];
itoa(IntegerToDisplay, StringToDisplay, 10);
Send_A_StringToMrLCDWithLocation(x, y, StringToDisplay); Send_A_String(" ");
}

Hier ist die neue und verbesserte Bibliotheksdatei:

//These are the Includes
#include
#include
#include "Mr.LCD"

//These are the Routines
void Check_IF_MrLCD_isBusy()
{
DataDir_MrLCDsCrib = 0;
MrLCDsControl |= 1< MrLCDsControl &= ~1<
while (MrLCDsCrib >= 0x80)
{
Peek_A_Boo();
}

DataDir_MrLCDsCrib = 0xFF; //0xFF means 0b11111111
}

void Peek_A_Boo()
{
MrLCDsControl |= 1< asm volatile ("nop");
asm volatile ("nop");
MrLCDsControl &= ~1< }

void Send_A_Command(unsigned char command)
{
Check_IF_MrLCD_isBusy();
MrLCDsCrib = command;
MrLCDsControl &= ~ ((1< Peek_A_Boo();
MrLCDsCrib = 0;
}

void Send_A_Character(unsigned char character)
{
Check_IF_MrLCD_isBusy();
MrLCDsCrib = character;
MrLCDsControl &= ~ (1< MrLCDsControl |= 1< Peek_A_Boo();
MrLCDsCrib = 0;
}

void Send_A_String(char *StringOfCharacters)
{
while(*StringOfCharacters > 0)
{
Send_A_Character(*StringOfCharacters++);
}
}

void GotoMrLCDsLocation(uint8_t x, uint8_t y)
{
Send_A_Command(0x80 + firstColumnPositionsForMrLCD[y-1] + (x-1));
}

void Send_A_StringToMrLCDWithLocation(uint8_t x, uint8_t y, char *StringOfCharacters)
{
GotoMrLCDsLocation(x, y);
Send_A_String(StringOfCharacters);
}

void Send_An_IntegerToMrLCD(uint8_t x, uint8_t y, int IntegerToDisplay, char NumberOfDigits)
{
char StringToDisplay[NumberOfDigits];
itoa(IntegerToDisplay, StringToDisplay, 10);
Send_A_StringToMrLCDWithLocation(x, y, StringToDisplay); Send_A_String(" ");
}

void InitializeMrLCD()
{
DataDir_MrLCDsControl |= 1< _delay_ms(15);

Send_A_Command(0x01); //Clear Screen 0x01 = 00000001
_delay_ms(2);
Send_A_Command(0x38);
_delay_us(50);
Send_A_Command(0b00001110);
_delay_us(50);
}

So verwende ich die neue Funktion innerhalb einer Interrupt-Service-Routine. Für die zukünftige Referenz ist es keine gute Programmierpraxis, zu viele Anweisungen innerhalb einer ISR (Interrupt Service Routine) zu haben, denn wenn es zu lange dauert, können andere ISRs oder eine weitere Konvertierung für diese bestimmte ISR möglicherweise nicht ausgeführt werden. Es ist am besten, die langen Anweisungen innerhalb der unendlichen Schleife zu handhaben. Zum Beispiel könnte ich eine globale Flag-Variable im Interrupt auf 1 setzen und in der unendlichen Schleife diese Flag-Variable überprüfen, ob sie 1 ist, und wenn ja, könnte sie die Anweisungen dort ausführen anstatt in der ISR.

ISR(ADC_vect)
{
uint8_t TheLow - ADCL;
uint16_t TenBitValue = ADCH<<2 | TheLow>>6;

Send_An_IntegerToMrLCD(x, y, TenBitValue, 4);

ADCSRA |= 1< }
Zurück zum Blog

Hinterlasse einen Kommentar

Bitte beachte, dass Kommentare vor der Veröffentlichung freigegeben werden müssen.