#include #define LCD_ADDRESS 0x27 #define LCD_ROWS 2 #define LCD_COLUMNS 16 byte MasArray[32] = { 78, 69, 71, 82, 32, 77, 65, 78, 68, 65, 82, 73, 78, 33, 33, 33, 32, 32, 32, 32, 46, 32, 32, 32, 32, 46, 32, 32, 32, 46, 37, 33 }; char colum1[17]; char colum2[17]; unsigned long previousTime = 0; const unsigned long interval = 200; void delay_ms(unsigned long milliseconds) { unsigned long startTime = millis(); while (millis() - startTime < milliseconds) { // Wait until the specified time has passed } } void lcdCommand(uint8_t command) { Wire.beginTransmission(LCD_ADDRESS); Wire.write(0x00); Wire.write(command); Wire.endTransmission(); } void lcdWrite(uint8_t value) { Wire.beginTransmission(LCD_ADDRESS); Wire.write(0x40); Wire.write(value); Wire.endTransmission(); } void lcdSetCursor(uint8_t row, uint8_t col) { uint8_t row_offsets[] = { 0x00, 0x40 }; uint8_t offset = row_offsets[row] + col; lcdCommand(0x80 | offset); } void lcdClear() { lcdCommand(0x01); // Clear display delay_ms(2); // Delay for clear display command } void lcdInit() { Wire.begin(); lcdCommand(0x38); // Function set: 8-bit mode, 2 lines, 5x8 font lcdCommand(0x0C); // Display control: Display ON, Cursor OFF, Blinking OFF lcdClear(); } void lcdPrint(const char* str) { while (*str) { lcdWrite(*str++); } } void setup() { Serial.begin(9600); lcdInit(); for (int i = 0; i < 32; i++) { if (i < 16) { colum1[i] = (char)MasArray[i]; } else { colum2[i - 16] = (char)MasArray[i]; } } colum1[16] = '\0'; colum2[16] = '\0'; } void loop() { unsigned long currentTime = millis(); if (currentTime - previousTime >= interval) { previousTime = currentTime; for (int i = 15; i > 0; i--) { lcdSetCursor(i, 0); lcdPrint(colum1); lcdSetCursor(0, 1); lcdPrint(colum2); delay_ms(200); // Use the custom delay_ms() function instead of delay() lcdClear(); } } }