W tym poście chciałbym opisać sposób sterowania wyświetlaczem firmy Nextion, który jest sterowany za pomocą linii UART.
[Źródło: https://nextion.tech]
Wyświetlacze można zamówić np. w sklepie elty (https://elty.pl/pl/c/Nextion-HMI/241).
Model używany prze zemnie w testach to 4.3" NX4827TO43.
Przygotowanie projektu graficznego:
Cały projekt graficzny jaki będzie wymagany dla urządzenia można wykonać w programie udostępnionym przez producenta (Nextion Editor). Interfejs programu jest dosyć intuicyjny i pozwala na weryfikację rozmieszczenia poszczególnych elementów.
Dodatkowo wgrywanie danych można wykonać poprzez podłączenie wyświetlacza przez konwerter UART->USB do komputera (przycisk Upload). Dzięki temu po wgraniu można przetestować działanie wyświetlacza bez konieczności podłączania go pod docelowe urządzenie sterujące.
Dodatkowo wgrywanie danych można wykonać poprzez podłączenie wyświetlacza przez konwerter UART->USB do komputera (przycisk Upload). Dzięki temu po wgraniu można przetestować działanie wyświetlacza bez konieczności podłączania go pod docelowe urządzenie sterujące.
Jednym minusem wyświetlacza, a dokładniej modelu testowanego przeze mnie jest brak obsługi grafik transparentnych (nie wiem jak to wygląda w przypadku droższych modeli). Po wgraniu ich na wyświetlacz wyświetlają się jako jednokolorowy prostokąt. Natomiast widok grafik wgranych do programu Nextion Editor jest poprawny.
Terminal testy:
Wyświetlacz wykorzystuje komunikację przez UART. Co oznacza, że wstępną weryfikację przygotowanego projektu, bądź jego zbudowanie tylko przez przesłane komendy można dokonać w programach typu terminal.
Aby przesłać ramkę w formacie akceptowalnym przez Nextion należy wprowadzać komendę w następujący sposób:
- <komenda>$FF$FF$FF
- np. page 4$FF$FF$FF
Aby wyświetlić tekst na ekranie w stworzonej kontrolce należy umieścić napis w cudzysłowie:
- main.t0.txt="test"
- main.t1.txt="sprawdzenie"
Lub z pominięciem nazwy okna:
- t0.txt="test"
- t1.txt="sprawdzenie"
W każdym przypadku przesłana ramka przez UART musi zawierać zakończenie w postaci trzech bajtów o wartości 0xFF.
Biblioteka:
Pełny wykaz instrukcji do obsługi wyświetlacza można znaleźć na stronie producenta (https://nextion.tech/instruction-set/#s3).
Poniżej opis niektórych z zaimplementowanych funkcji.
Bibliotekę można pobrać z dysku Google pod tym linkiem.
Zmiana wartości pola tekstowego w podanej kontrolce:
Dodanie tekstu do pola txt wybranej kontrolki
W celu załadowania stworzonej w edytorze strony należy podać jej numer, lub jej nazwę:Bibliotekę można pobrać z dysku Google pod tym linkiem.
Assignment Statements:
Zmiana wartości pola tekstowego w podanej kontrolce:
- void Nextion_WriteTxtToControlOnSpecWindow(const uint8_t *windowName,
- const uint8_t *controlName,
- const uint8_t *valueToWrite)
- {
- uint8_t dataToWrite[100] = {0x00};
- uint8_t size = sprintf((char *)dataToWrite, "%s.%s.txt=\"%s\"", windowName, controlName, valueToWrite);
- Nextion_SendCommand(dataToWrite, size + 1);
- }
- void Nextion_WriteTxtToControl(const uint8_t *controlName, const uint8_t *valueToWrite)
- {
- uint8_t dataToWrite[100] = {0x00};
- uint8_t size = sprintf((char *)dataToWrite, "%s.txt=\"%s\"", controlName, valueToWrite);
- Nextion_SendCommand(dataToWrite, size + 1);
- }
Dodanie tekstu do pola txt wybranej kontrolki
- void Nextion_AddTxtToControlOnSpecWindow(const uint8_t *windowName, const uint8_t *controlName, const uint8_t *valueToWrite) {
- uint8_t dataToWrite[100] = {0x00};
- uint8_t size = sprintf((char *)dataToWrite, "%s.%s.txt+=\"%s\"", windowName, controlName, valueToWrite);
- Nextion_SendCommand(dataToWrite, size + 1);
- }
- void Nextion_AddTxtToControl(const uint8_t *controlName, const uint8_t *valueToWrite) {
- uint8_t dataToWrite[100] = {0x00};
- uint8_t size = sprintf((char *)dataToWrite, "%s.txt+=\"%s\"", controlName, valueToWrite);
- Nextion_SendCommand(dataToWrite, size + 1);
- }
Operational Commands:
- void Nextion_LoadNewPage_PageId(const uint8_t pageId)
- {
- uint8_t pageCommand[6] = {0x00};
- pageCommand[0] = 'p';
- pageCommand[1] = 'a';
- pageCommand[2] = 'g';
- pageCommand[3] = 'e';
- pageCommand[4] = ' ';
- pageCommand[5] = pageId + 0x30;
- Nextion_SendCommand(pageCommand, sizeof(pageCommand) + 1);
- }
- void Nextion_LoadNewPage_PagaName(const uint8_t *pageName, const uint8_t pageNameSize)
- {
- uint8_t pageCommand[30] = {0x00};
- pageCommand[0] = 'p';
- pageCommand[1] = 'a';
- pageCommand[2] = 'g';
- pageCommand[3] = 'e';
- pageCommand[4] = ' ';
- for(uint8_t i=0; i<pageNameSize; i++)
- {
- pageCommand[i + 5] = *(pageName + i);
- }
- Nextion_SendCommand(pageCommand, (6 + pageNameSize));
- }
Reset wyświetlacza:
- void Nextion_ResetDisplay(void)
- {
- uint8_t resetCommand[] = "rest";
- Nextion_SendCommand(resetCommand, sizeof(resetCommand));
- }
GUI Design Commands:
Czyszczenie ekranu zadanym kolorem. W postaci ciągu znaków np. BLUE, BROWN itp. Bądź za pomocą koloru RGB565 zapisanego w systemie dziesiętnym.
- void Nextion_ClearScreenWithColorConstant(const uint8_t *colorName, const uint8_t colorNameLength)
- {
- uint8_t clearScreenColorFrame[30] = {0x00};
- clearScreenColorFrame[0] = 'c';
- clearScreenColorFrame[1] = 'l';
- clearScreenColorFrame[2] = 's';
- clearScreenColorFrame[3] = ' ';
- for(uint8_t i=0; i<colorNameLength; i++)
- {
- clearScreenColorFrame[i + 4] = *(colorName + i);
- }
- Nextion_SendCommand(clearScreenColorFrame, (5 + colorNameLength));
- }
- void Nextion_ClearScreenWithColorRGB565(const uint16_t colorRGB565)
- {
- uint8_t clearScreenColorFrame[30] = {0x00};
- uint8_t frameSize = sprintf((char *)clearScreenColorFrame, "cls %u", colorRGB565);
- Nextion_SendCommand(clearScreenColorFrame, (frameSize + 1));
- }
Funkcja odpowiedzialna za przygotowanie końcowej ramki do wysłania:
- static size_t Nextion_SendCommand(uint8_t *command, const uint8_t commandSize)
- {
- uint8_t arrayToSend[(commandSize - 1) + 4];
- for(uint8_t i = 0; i<sizeof(arrayToSend); i++)
- {
- arrayToSend[i] = 0x00;
- }
- for(uint8_t loop = 0; loop < (commandSize - 1); loop++) {
- arrayToSend[loop] = *(command + loop);
- }
- arrayToSend[commandSize - 1] = 0xFF;
- arrayToSend[commandSize + 0] = 0xFF;
- arrayToSend[commandSize + 1] = 0xFF;
- arrayToSend[commandSize + 2] = 0x00;
- return USART_SendString(&arrayToSend[0]);
- }
Wyświetlenie kontrolki text na ekranie:
Wyświetlenie linii na ekranie:
- void Nextion_WriteTxtOnScreen_XStr(uint16_t x, uint16_t y, uint16_t w, uint16_t h,
- uint8_t fontID, char *str, uint32_t bgColour,
- uint32_t fgColour, uint8_t bgType,
- Nextion_FontAlignment_TypeDef xCentre,
- Nextion_FontAlignment_TypeDef yCentre)
- {
- uint8_t commandBuffer[200] = {0x00};
- uint8_t frameSize = sprintf((char *)commandBuffer, "xstr %d,%d,%d,%d,%d,%ld,%ld,%d,%d,%d,\"%s\"",
- x, y, w, h, fontID, fgColour, bgColour, xCentre, yCentre, bgType, str);
- Nextion_SendCommand(commandBuffer, (frameSize + 1));
- }
Wyświetlenie linii na ekranie:
- void Nextion_DeleteTxtToControlOnSpecWindow(const uint8_t *windowName, const uint8_t *controlName, const uint8_t numberOfCharsToDelete) {
- uint8_t dataToWrite[100] = {0x00};
- uint8_t size = sprintf((char *)dataToWrite, "%s.%s.txt-=%u", windowName, controlName, numberOfCharsToDelete);
- Nextion_SendCommand(dataToWrite, size + 1);
- }
- void Nextion_DeleteTxtToControl(const uint8_t *controlName, const uint8_t numberOfCharsToDelete) {
- uint8_t dataToWrite[100] = {0x00};
- uint8_t size = sprintf((char *)dataToWrite, "%s.txt-=%u", controlName, numberOfCharsToDelete);
- Nextion_SendCommand(dataToWrite, size + 1);
- }
System Variables:
Ustawienie wartości podświetlenia. Komenda DIM ustawia wartość do momentu resetu wyświetlacza. Natomiast DIMS zapisuje ustawienia w wyświetlaczu na stałe:
- void Nextion_SetBacklight_Dim(uint8_t dimPercentValue)
- {
- if(dimPercentValue > 100) {
- dimPercentValue = 100;
- }
- uint8_t dimFrame[30] = {0x00};
- uint8_t frameSize = sprintf((char *)dimFrame, "dim=%u", dimPercentValue);
- Nextion_SendCommand(dimFrame, (frameSize + 1));
- }
- void Nextion_SetBacklight_Dims(uint8_t dimPercentValue)
- {
- if(dimPercentValue > 100) {
- dimPercentValue = 100;
- }
- uint8_t dimFrame[30] = {0x00};
- uint8_t frameSize = sprintf((char *)dimFrame, "dims=%u", dimPercentValue);
- Nextion_SendCommand(dimFrame, (frameSize + 1));
- }
Ustawienie wartości baudrate dla komunikacji z wyświetlaczem:
- void Nextion_SetUartBaudrate_Baud(Nextion_Baudrate_TypeDef baudrateValue)
- {
- uint8_t dimFrame[30] = {0x00};
- uint8_t frameSize = sprintf((char *)dimFrame, "baud=%u", baudrateValue);
- Nextion_SendCommand(dimFrame, (frameSize + 1));
- }
- void Nextion_SetUartBaudrate_Bauds(Nextion_Baudrate_TypeDef baudrateValue)
- {
- uint8_t dimFrame[30] = {0x00};
- uint8_t frameSize = sprintf((char *)dimFrame, "bauds=%u", baudrateValue);
- Nextion_SendCommand(dimFrame, (frameSize + 1));
- }
Poniżej pełny wykaz funkcji jaki został zaimplementowany w bibliotece:
Assign Statement:
Operational Commands:
Gnu Design Commands:
System Variables:
Assign Statement:
- //Assign Statement//
- //Write txt to specific control, clears previously write txt in control
- void Nextion_WriteTxtToControlOnSpecWindow(const uint8_t *windowName, const uint8_t *controlName, const uint8_t *valueToWrite);
- void Nextion_WriteTxtToControl(const uint8_t *controlName, const uint8_t *valueToWrite);
- //Add txt to existing txt value in control
- void Nextion_AddTxtToControlOnSpecWindow(const uint8_t *windowName, const uint8_t *controlName, const uint8_t *valueToWrite);
- void Nextion_AddTxtToControl(const uint8_t *controlName, const uint8_t *valueToWrite);
- //Delete selected number of chars from control
- void Nextion_DeleteTxtToControlOnSpecWindow(const uint8_t *windowName, const uint8_t *controlName, const uint8_t numberOfCharsToDelete);
- void Nextion_DeleteTxtToControl(const uint8_t *controlName, const uint8_t numberOfCharsToDelete);
- //Change font size in control
- void Nextion_ChangeFontSizeInControl(const uint8_t *windowName, const uint8_t *controlName, const uint8_t fontID);
Operational Commands:
- //Operational Commands
- //PAGE
- void Nextion_LoadNewPage_PageId(const uint8_t pageId);
- void Nextion_LoadNewPage_PagaName(const uint8_t *pageName, const uint8_t pageNameSize);
- //REST
- void Nextion_ResetDisplay(void);
- //REF
- void Nextion_RefreshDisplay_ComName(const uint8_t *componentName);
- void Nection_RefreshDisplay_ComId(const uint8_t comId);
- //CLICK
- void Nextion_TriggerClick_ComName(const uint8_t *componentName, const uint8_t touchPressRelease);
- void Nextion_TriggerClick_ComId(const uint8_t comId, const uint8_t touchPressRelease);
- //REF_START
- void Nextion_StopRefDefaultWaveform(void);
- //REF_STOP
- void Nextion_StopsRefDefaultWaveform(void);
- //GET
- void Nextion_SendAttribute(const uint8_t *attribute);
- //SENDME
- void Nextion_SendNumberOfCurrentlyLoadedPage(const uint8_t *attribute);
Gnu Design Commands:
- //GUI Design Commands//
- //CLS
- void Nextion_ClearScreenWithColorConstant(const uint8_t *colorName, const uint8_t colorNameLength);
- void Nextion_ClearScreenWithColorRGB565(const uint16_t colorRGB565);
- //PIC
- void Nextion_DispResoursePicture_Pic(const uint16_t xPos, const uint16_t yPos, const uint8_t picId);
- //PICQ
- void Nextion_CropPicture_Picq(const uint16_t xUpperLeftCorner, const uint16_t yUpperLeftCorner,
- const uint16_t widthCropArea, const uint16_t heightCropArea, const uint8_t picId);
- //XPIC
- void Nextion_AdvancedCropPicture_Xpic(const uint16_t xUpperLeftCorner, const uint16_t yUpperLeftCorner,
- const uint16_t widthCropArea, const uint16_t heightCropArea, const uint16_t xUpperLeftCornerCropArea, const uint16_t yUpperLeftCornerCropArea, const uint8_t picId);
- //XSTR
- void Nextion_WriteTxtOnScreen_XStr(const uint16_t xPos, const uint16_t yPos, const uint16_t contrWidth, const uint16_t contrHeight,
- const uint8_t fontID, const uint32_t bgColour, const uint32_t fgColour, const uint8_t bgFill,
- const Nextion_FontAlignment_TypeDef xCentre, const Nextion_FontAlignment_TypeDef yCentre, const char *str);
- //FILL
- void Nextion_FillAreaWithColor_Fill(const uint16_t xStart, const uint16_t yStart, const uint16_t fillWidth, const uint16_t fillHeight, const uint16_t rgb565Colour);
- //LINE
- void Nextion_DrawLineOnScreen_Line(const uint16_t xStart, const uint16_t yStart, const uint16_t xEnd, const uint16_t yEnd, const uint16_t rgb565Colour);
- //DRAW
- void Nextion_DrawHollowRectange_Draw(const uint16_t xUpperLeftCorner, const uint16_t yUpperLeftCorner, const uint16_t xLowerRightCorner, const uint16_t yLowerRightCorner, const uint16_t rgb565Colour);
- //CIR
- void Nextion_DrawHollowCircle_Cir(const uint16_t xCenterPoint, const uint16_t yCenterPoint, const uint16_t circleRadius, const uint16_t rgb565Colour);
- //CIRS
- void Nextion_DrawFilledCircle_Cirs(const uint16_t xCenterPoint, const uint16_t yCenterPoint, const uint16_t circleRadius, const uint16_t rgb565Colour);
System Variables:
- //System Variables//
- //DIM
- void Nextion_SetBacklight_Dim(uint8_t dimPercentValue);
- //DIMS
- void Nextion_SetBacklight_Dims(uint8_t dimPercentValue);
- //BAUD
- void Nextion_SetUartBaudrate_Baud(Nextion_Baudrate_TypeDef baudrateValue);
- //BAUDS
- void Nextion_SetUartBaudrate_Bauds(Nextion_Baudrate_TypeDef baudrateValue);
- //SPAX
- void Nextion_SetDefaultRenderingFontForXstr_Spax(const uint8_t fontValue);
- //SPAY
- void Nextion_SetDefaultRenderingSpaceForXstr_Spay(const uint16_t fontValue);
- //THC
- void Nextion_SetTouchDrawingBrushColor_Thc(const uint16_t color);
- //THDRA
- void Nextion_TurnsInternalDrawindFunct_Thdra(uint8_t functionValue);
- //USSP
- void Nextion_SetsInterNoSerSleepTim_Ussp(uint16_t usspTimer);
- //THSP
- void Nextion_SetsInterNoTouchSleepTim_Thsp(uint16_t thspTimerVal);
- //THUP
- void Nextion_AutoWakeOnTouch_Thup(uint16_t thupVal);
- //SENDXY
- void Nextion_RealTimeTouchCords_SendXy(uint16_t sendXySendingStatus);
- //DELAY
- void Nextion_DelayFuncMs_Delay(const uint16_t delayTime);
- //SLEEP
- void Nextion_EnterExitSleepMode_Sleep(uint8_t sleepModeVal);
- //BKCMD
- void Nextion_SetLevelReturnData_Bkcmd(uint8_t retDataLevel);
- //WUP
- void Nextion_WakeOnSerialData_Wup(const uint8_t wupValue);
- //USUP
- void Nextion_WakeOnSerialData_Usup(uint8_t usupValue);
Funkcja sprawdzająca otrzymane kody od wyświetlacza i wprowadzająca je do struktury:
Szkielet funkcji odpowiedzialnej za wykonanie akcji w zależności od otrzymanej komendy:
Jedyną sytuacją jaką należy sprawdzić jest 0x00 czyli Start Up lub Invalid Instruction. Ponieważ mają one zdefiniowane te same kody komendy. Różnica polega w wielkości przesłanej ramki danych.
Bibliotekę można w bardzo łatwy sposób przenieść na inne mikrokontrolery. Wystarczy zmodyfikować funkcję przesyłające dane. Tak aby odpowiadały one wybranemu układowi.
- typedef struct Nextion_ReceiveFrame{
- uint8_t commandCode;
- uint8_t receiveData[10];
- }Nextion_ReceiveFrame_TypedefStruct;
- //Return Codes dependent on bkcmd value being greater than 0
- #define NEXTION_INVALID_INSTRUCTION_CODE 0x00 //0x00 0xFF 0xFF 0xFF
- #define NEXTION_INSTRUCTION_SUCCESSFUL_CODE 0x01 //0x01 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_COMPONENT_ID_CODE 0x02 //0x02 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_PAGE_ID_CODE 0x03 //0x03 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_PICTURE_ID_CODE 0x04 //0x04 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_FONT_ID 0x05 //0x05 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_FILE_OPERAT_CODE 0x06 //0x06 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_CRC_CODE 0x09 //0x09 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_BAUDRATE_CODE 0x11 //0x11 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_WAVEFORM_ID_CHANNEL_CODE 0x12 //0x12 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_VAR_NAME_ATRRIBUTE_CODE 0x1A //0x1A 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_VAR_OPERATION_CODE 0x1B //0x1B 0xFF 0xFF 0xFF
- #define NEXTION_FAILED_ASSIGNMENT_CODE 0x1C //0x1C 0xFF 0xFF 0xFF
- #define NEXTION_FAILED_EEPROM_OPER_CODE 0x1D //0x1D 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_QUANT_OF_PARAM_CODE 0x1E //0x1E 0xFF 0xFF 0xFF
- #define NEXTION_FAILED_IO_OPERAT_CODE 0x1F //0x1F 0xFF 0xFF 0xFF
- #define NEXTION_INVALID_ESCAPE_CHAR_CODE 0x20 //0x20 0xFF 0xFF 0xFF
- #define NEXTION_TOO_LONG_VAR_NAME_CODE 0x23 //0x23 0xFF 0xFF 0xFF
- //Return Codes not affected by bkcmd value, valid in all cases
- #define NEXTION_STARTUP_CODE 0x00 //0x00 0x00 0x00 0xFF 0xFF 0xFF
- #define NEXTION_SERIAL_BUFFER_OVERFLOW 0x24 //0x24 0xFF 0xFF 0xFF
- #define NEXTION_RETURN_CODE_TOUCH_EVENT 0x65 //0x65 0x00 0x01 0x01 0xFF 0xFF 0xFF
- #define NEXTION_CURRENT_PAGE_NUMBER 0x66 //0x66 0x01 0xFF 0xFF 0xFF
- #define NEXTION_TOUCH_COORDINATE_AWAKE 0x67 //0x67 0x00 0x7A 0x00 0x1E 0x01 0xFF 0xFF 0xFF
- #define NEXTION_TOUCH_COORDINATE_SLEEP 0x68 //0x68 0x00 0x7A 0x00 0x1E 0x01 0xFF 0xFF 0xFF
- #define NEXTION_STRING_DATA_ENCLOSED 0x70 //0x70 0x61 0x62 0x31 0x32 0x33 0xFF 0xFF 0xFF
- #define NEXTION_NUMERIC_DATA_ENCLOSED 0x71 //0x71 0x01 0x02 0x03 0x04 0xFF 0xFF 0xFF
- #define NEXTION_AUTO_ENTERED_SLEEP_MODE 0x86 //0x86 0xFF 0xFF 0xFF
- #define NEXTION_AUTO_WAKE_FROM_SLEEP 0x87 //0x87 0xFF 0xFF 0xFF
- #define NEXTION_READY 0x88 //0x88 0xFF 0xFF 0xFF
- #define NEXTION_START_MICRO_SD_UPGRADE 0x89 //0x89 0xFF 0xFF 0xFF
- #define NEXTION_TRANSPARENT_DATA_FINISHED 0xFD //0xFD 0xFF 0xFF 0xFF
- #define NEXTION_TRANSPARENT_DATA_READY 0xFE //0xFE 0xFF 0xFF 0xFF
- Nextion_ReceiveFrame_TypedefStruct Nextion_DecodeReceiveMsg(uint8_t *recFrame, uint8_t recFrameFlag, uint8_t recMsgLength)
- {
- Nextion_ReceiveFrame_TypedefStruct Nextion_ReceiveFrame;
- Nextion_ReceiveFrame.commandCode = 0x00;
- for(uint8_t i=0; i<sizeof(Nextion_ReceiveFrame.receiveData); i++)
- {
- Nextion_ReceiveFrame.receiveData[i] = 0x00;
- }
- if(recFrameFlag == 0)
- {
- Nextion_ReceiveFrame.commandCode = 0x31;
- return Nextion_ReceiveFrame; //No Frame Received
- }
- if(recMsgLength < 4 || recMsgLength > 9)
- {
- Nextion_ReceiveFrame.commandCode = 0x32;
- return Nextion_ReceiveFrame; //Receive too few or too many bytes
- }
- Nextion_ReceiveFrame.commandCode = *(recFrame + 0);
- if(recMsgLength == 4)
- {
- return Nextion_ReceiveFrame;
- }
- for(uint8_t i=0; i<(recMsgLength - 4); i++)
- {
- Nextion_ReceiveFrame.receiveData[i] = *(recFrame + i + 1);
- }
- return Nextion_ReceiveFrame;
- }
Szkielet funkcji odpowiedzialnej za wykonanie akcji w zależności od otrzymanej komendy:
- void Nextion_MakeActionForReceiveMsg(Nextion_ReceiveFrame_TypedefStruct *ReceiveMsgStructPtr)
- {
- switch(ReceiveMsgStructPtr->commandCode)
- {
- case NEXTION_INVALID_INSTRUCTION_CODE:
- if(msgLength == 6)
- {
- //NEXTION_START_UP_CODE
- }
- else
- {
- //NEXTION_INVALID_INSTRUCTION_CODE
- }
- break;
- case NEXTION_INSTRUCTION_SUCCESSFUL_CODE:
- /* */
- break;
- case NEXTION_INVALID_COMPONENT_ID_CODE:
- /* */
- break;
- case NEXTION_INVALID_PAGE_ID_CODE:
- /* */
- break;
- //...
- //...
- //...
- default:
- break;
- }
- }
Jedyną sytuacją jaką należy sprawdzić jest 0x00 czyli Start Up lub Invalid Instruction. Ponieważ mają one zdefiniowane te same kody komendy. Różnica polega w wielkości przesłanej ramki danych.
Bibliotekę można w bardzo łatwy sposób przenieść na inne mikrokontrolery. Wystarczy zmodyfikować funkcję przesyłające dane. Tak aby odpowiadały one wybranemu układowi.
Np. dla LPC1769 funkcję wysyłające informację wyglądają następująco:
- static void USART_SendChar(const uint8_t c)
- {
- while( !(LPC_UART0->LSR & UART_LSR_THRE) );
- LPC_UART0->THR = c;
- }
- static size_t USART_SendString(const uint8_t * str) {
- uint16_t charCount = 0;
- while(*str) {
- USART_SendChar(*str++);
- charCount++;
- }
- return charCount;
- }
Odbieranie danych od wyświetlacza w przerwaniu od RX:
- void UART0_IRQHandler(void) {
- uint32_t iirSource = 0;
- iirSource = LPC_UART0->IIR;
- iirSource &= UART_IIR_INTID_MASK;
- if(iirSource == UART_IIR_INTID_RDA) {
- memset(rxbuf, 0, sizeof rxbuf);
- if(UART_RcvData(rxbuf, sizeof rxbuf))
- {
- uartDataReceived = true;
- NVIC_DisableIRQ(UART0_IRQn);
- }
- }
- }
Strony:
[1] Strona producenta: https://nextion.tech/[2] Wykaz rozkazów: https://nextion.tech/instruction-set/#s3