From 80cd73c3d606748e33223f0ac6a83ff285cbcbe5 Mon Sep 17 00:00:00 2001 From: Qukich Date: Fri, 9 Feb 2024 12:36:55 +0300 Subject: [PATCH] final version, gg --- LiquidCrystal_I2C/LiquidCrystal_I2C.cpp | 315 +++++++++ LiquidCrystal_I2C/LiquidCrystal_I2C.h | 126 ++++ LiquidCrystal_I2C/LiquidCrystal_I2C.o | Bin 0 -> 41564 bytes LiquidCrystal_I2C/README.md | 2 + .../examples/CustomChars/CustomChars.pde | 70 ++ .../examples/HelloWorld/HelloWorld.pde | 28 + .../examples/SerialDisplay/SerialDisplay.pde | 34 + LiquidCrystal_I2C/keywords.txt | 46 ++ LiquidCrystal_I2C/library.json | 15 + LiquidCrystal_I2C/library.properties | 9 + Disp1602.cpp => Lsd_print/Lsd_print.cpp | 187 +++--- Lsd_print/lsd.h | 8 + MyLCD/MyLCD.h | 22 + MyLCD/i2cmaster.h | 42 ++ MyLCD/keywords.txt | 10 + lcdpcf8574.cpp => MyLCD/lcdpcf8574.cpp | 632 +++++++++--------- lcdpcf8574.h => MyLCD/lcdpcf8574.h | 220 +++--- pcf8574.cpp => MyLCD/pcf8574.cpp | 228 +++---- pcf8574.h => MyLCD/pcf8574.h | 42 +- MyLCD/twimaster.cpp | 117 ++++ display_functions.c | 64 -- display_functions.h | 24 - hdlc/main.c | 2 +- i2c_functions.c | 24 - i2c_functions.h | 12 - main.c | 53 -- main_sketch/main_sketch.ino | 73 ++ sketch_sep19a.ino | 83 --- пример с библиотеками ардуино.txt | 55 -- типо с.txt | 93 --- 30 files changed, 1579 insertions(+), 1057 deletions(-) create mode 100644 LiquidCrystal_I2C/LiquidCrystal_I2C.cpp create mode 100644 LiquidCrystal_I2C/LiquidCrystal_I2C.h create mode 100644 LiquidCrystal_I2C/LiquidCrystal_I2C.o create mode 100644 LiquidCrystal_I2C/README.md create mode 100644 LiquidCrystal_I2C/examples/CustomChars/CustomChars.pde create mode 100644 LiquidCrystal_I2C/examples/HelloWorld/HelloWorld.pde create mode 100644 LiquidCrystal_I2C/examples/SerialDisplay/SerialDisplay.pde create mode 100644 LiquidCrystal_I2C/keywords.txt create mode 100644 LiquidCrystal_I2C/library.json create mode 100644 LiquidCrystal_I2C/library.properties rename Disp1602.cpp => Lsd_print/Lsd_print.cpp (65%) create mode 100644 Lsd_print/lsd.h create mode 100644 MyLCD/MyLCD.h create mode 100644 MyLCD/i2cmaster.h create mode 100644 MyLCD/keywords.txt rename lcdpcf8574.cpp => MyLCD/lcdpcf8574.cpp (96%) rename lcdpcf8574.h => MyLCD/lcdpcf8574.h (97%) rename pcf8574.cpp => MyLCD/pcf8574.cpp (96%) rename pcf8574.h => MyLCD/pcf8574.h (97%) create mode 100644 MyLCD/twimaster.cpp delete mode 100644 display_functions.c delete mode 100644 display_functions.h delete mode 100644 i2c_functions.c delete mode 100644 i2c_functions.h delete mode 100644 main.c create mode 100644 main_sketch/main_sketch.ino delete mode 100644 sketch_sep19a.ino delete mode 100644 пример с библиотеками ардуино.txt delete mode 100644 типо с.txt diff --git a/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp b/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp new file mode 100644 index 0000000..08a41f7 --- /dev/null +++ b/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp @@ -0,0 +1,315 @@ +// Based on the work by DFRobot + +#include "LiquidCrystal_I2C.h" +#include +#if defined(ARDUINO) && ARDUINO >= 100 + +#include "Arduino.h" + +#define printIIC(args) Wire.write(args) +inline size_t LiquidCrystal_I2C::write(uint8_t value) { + send(value, Rs); + return 1; +} + +#else +#include "WProgram.h" + +#define printIIC(args) Wire.send(args) +inline void LiquidCrystal_I2C::write(uint8_t value) { + send(value, Rs); +} + +#endif +#include "Wire.h" + + + +// When the display powers up, it is configured as follows: +// +// 1. Display clear +// 2. Function set: +// DL = 1; 8-bit interface data +// N = 0; 1-line display +// F = 0; 5x8 dot character font +// 3. Display on/off control: +// D = 0; Display off +// C = 0; Cursor off +// B = 0; Blinking off +// 4. Entry mode set: +// I/D = 1; Increment by 1 +// S = 0; No shift +// +// Note, however, that resetting the Arduino doesn't reset the LCD, so we +// can't assume that its in that state when a sketch starts (and the +// LiquidCrystal constructor is called). + +LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows) +{ + _Addr = lcd_Addr; + _cols = lcd_cols; + _rows = lcd_rows; + _backlightval = LCD_NOBACKLIGHT; +} + +void LiquidCrystal_I2C::init(){ + init_priv(); +} + +void LiquidCrystal_I2C::init_priv() +{ + Wire.begin(); + _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; + begin(_cols, _rows); +} + +void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { + if (lines > 1) { + _displayfunction |= LCD_2LINE; + } + _numlines = lines; + + // for some 1 line displays you can select a 10 pixel high font + if ((dotsize != 0) && (lines == 1)) { + _displayfunction |= LCD_5x10DOTS; + } + + // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! + // according to datasheet, we need at least 40ms after power rises above 2.7V + // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 + delay(50); + + // Now we pull both RS and R/W low to begin commands + expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1) + delay(1000); + + //put the LCD into 4 bit mode + // this is according to the hitachi HD44780 datasheet + // figure 24, pg 46 + + // we start in 8bit mode, try to set 4 bit mode + write4bits(0x03 << 4); + delayMicroseconds(4500); // wait min 4.1ms + + // second try + write4bits(0x03 << 4); + delayMicroseconds(4500); // wait min 4.1ms + + // third go! + write4bits(0x03 << 4); + delayMicroseconds(150); + + // finally, set to 4-bit interface + write4bits(0x02 << 4); + + + // set # lines, font size, etc. + command(LCD_FUNCTIONSET | _displayfunction); + + // turn the display on with no cursor or blinking default + _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; + display(); + + // clear it off + clear(); + + // Initialize to default text direction (for roman languages) + _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; + + // set the entry mode + command(LCD_ENTRYMODESET | _displaymode); + + home(); + +} + +/********** high level commands, for the user! */ +void LiquidCrystal_I2C::clear(){ + command(LCD_CLEARDISPLAY);// clear display, set cursor position to zero + delayMicroseconds(2000); // this command takes a long time! +} + +void LiquidCrystal_I2C::home(){ + command(LCD_RETURNHOME); // set cursor position to zero + delayMicroseconds(2000); // this command takes a long time! +} + +void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){ + int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; + if ( row > _numlines ) { + row = _numlines-1; // we count rows starting w/0 + } + command(LCD_SETDDRAMADDR | (col + row_offsets[row])); +} + +// Turn the display on/off (quickly) +void LiquidCrystal_I2C::noDisplay() { + _displaycontrol &= ~LCD_DISPLAYON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal_I2C::display() { + _displaycontrol |= LCD_DISPLAYON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// Turns the underline cursor on/off +void LiquidCrystal_I2C::noCursor() { + _displaycontrol &= ~LCD_CURSORON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal_I2C::cursor() { + _displaycontrol |= LCD_CURSORON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// Turn on and off the blinking cursor +void LiquidCrystal_I2C::noBlink() { + _displaycontrol &= ~LCD_BLINKON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal_I2C::blink() { + _displaycontrol |= LCD_BLINKON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// These commands scroll the display without changing the RAM +void LiquidCrystal_I2C::scrollDisplayLeft(void) { + command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); +} +void LiquidCrystal_I2C::scrollDisplayRight(void) { + command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); +} + +// This is for text that flows Left to Right +void LiquidCrystal_I2C::leftToRight(void) { + _displaymode |= LCD_ENTRYLEFT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This is for text that flows Right to Left +void LiquidCrystal_I2C::rightToLeft(void) { + _displaymode &= ~LCD_ENTRYLEFT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This will 'right justify' text from the cursor +void LiquidCrystal_I2C::autoscroll(void) { + _displaymode |= LCD_ENTRYSHIFTINCREMENT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This will 'left justify' text from the cursor +void LiquidCrystal_I2C::noAutoscroll(void) { + _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// Allows us to fill the first 8 CGRAM locations +// with custom characters +void LiquidCrystal_I2C::createChar(uint8_t location, uint8_t charmap[]) { + location &= 0x7; // we only have 8 locations 0-7 + command(LCD_SETCGRAMADDR | (location << 3)); + for (int i=0; i<8; i++) { + write(charmap[i]); + } +} + +// Turn the (optional) backlight off/on +void LiquidCrystal_I2C::noBacklight(void) { + _backlightval=LCD_NOBACKLIGHT; + expanderWrite(0); +} + +void LiquidCrystal_I2C::backlight(void) { + _backlightval=LCD_BACKLIGHT; + expanderWrite(0); +} + + + +/*********** mid level commands, for sending data/cmds */ + +inline void LiquidCrystal_I2C::command(uint8_t value) { + send(value, 0); +} + + +/************ low level data pushing commands **********/ + +// write either command or data +void LiquidCrystal_I2C::send(uint8_t value, uint8_t mode) { + uint8_t highnib=value&0xf0; + uint8_t lownib=(value<<4)&0xf0; + write4bits((highnib)|mode); + write4bits((lownib)|mode); +} + +void LiquidCrystal_I2C::write4bits(uint8_t value) { + expanderWrite(value); + pulseEnable(value); +} + +void LiquidCrystal_I2C::expanderWrite(uint8_t _data){ + Wire.beginTransmission(_Addr); + printIIC((int)(_data) | _backlightval); + Wire.endTransmission(); +} + +void LiquidCrystal_I2C::pulseEnable(uint8_t _data){ + expanderWrite(_data | En); // En high + delayMicroseconds(1); // enable pulse must be >450ns + + expanderWrite(_data & ~En); // En low + delayMicroseconds(50); // commands need > 37us to settle +} + + +// Alias functions + +void LiquidCrystal_I2C::cursor_on(){ + cursor(); +} + +void LiquidCrystal_I2C::cursor_off(){ + noCursor(); +} + +void LiquidCrystal_I2C::blink_on(){ + blink(); +} + +void LiquidCrystal_I2C::blink_off(){ + noBlink(); +} + +void LiquidCrystal_I2C::load_custom_character(uint8_t char_num, uint8_t *rows){ + createChar(char_num, rows); +} + +void LiquidCrystal_I2C::setBacklight(uint8_t new_val){ + if(new_val){ + backlight(); // turn backlight on + }else{ + noBacklight(); // turn backlight off + } +} + +void LiquidCrystal_I2C::printstr(const char c[]){ + //This function is not identical to the function used for "real" I2C displays + //it's here so the user sketch doesn't have to be changed + print(c); +} + + +// unsupported API functions +void LiquidCrystal_I2C::off(){} +void LiquidCrystal_I2C::on(){} +void LiquidCrystal_I2C::setDelay (int cmdDelay,int charDelay) {} +uint8_t LiquidCrystal_I2C::status(){return 0;} +uint8_t LiquidCrystal_I2C::keypad (){return 0;} +uint8_t LiquidCrystal_I2C::init_bargraph(uint8_t graphtype){return 0;} +void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){} +void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){} +void LiquidCrystal_I2C::setContrast(uint8_t new_val){} + + diff --git a/LiquidCrystal_I2C/LiquidCrystal_I2C.h b/LiquidCrystal_I2C/LiquidCrystal_I2C.h new file mode 100644 index 0000000..faf19fb --- /dev/null +++ b/LiquidCrystal_I2C/LiquidCrystal_I2C.h @@ -0,0 +1,126 @@ +//YWROBOT +#ifndef LiquidCrystal_I2C_h +#define LiquidCrystal_I2C_h + +#include +#include "Print.h" +#include + +// commands +#define LCD_CLEARDISPLAY 0x01 +#define LCD_RETURNHOME 0x02 +#define LCD_ENTRYMODESET 0x04 +#define LCD_DISPLAYCONTROL 0x08 +#define LCD_CURSORSHIFT 0x10 +#define LCD_FUNCTIONSET 0x20 +#define LCD_SETCGRAMADDR 0x40 +#define LCD_SETDDRAMADDR 0x80 + +// flags for display entry mode +#define LCD_ENTRYRIGHT 0x00 +#define LCD_ENTRYLEFT 0x02 +#define LCD_ENTRYSHIFTINCREMENT 0x01 +#define LCD_ENTRYSHIFTDECREMENT 0x00 + +// flags for display on/off control +#define LCD_DISPLAYON 0x04 +#define LCD_DISPLAYOFF 0x00 +#define LCD_CURSORON 0x02 +#define LCD_CURSOROFF 0x00 +#define LCD_BLINKON 0x01 +#define LCD_BLINKOFF 0x00 + +// flags for display/cursor shift +#define LCD_DISPLAYMOVE 0x08 +#define LCD_CURSORMOVE 0x00 +#define LCD_MOVERIGHT 0x04 +#define LCD_MOVELEFT 0x00 + +// flags for function set +#define LCD_8BITMODE 0x10 +#define LCD_4BITMODE 0x00 +#define LCD_2LINE 0x08 +#define LCD_1LINE 0x00 +#define LCD_5x10DOTS 0x04 +#define LCD_5x8DOTS 0x00 + +// flags for backlight control +#define LCD_BACKLIGHT 0x08 +#define LCD_NOBACKLIGHT 0x00 + +#define En B00000100 // Enable bit +#define Rw B00000010 // Read/Write bit +#define Rs B00000001 // Register select bit + +class LiquidCrystal_I2C : public Print { +public: + LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows); + void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS ); + void clear(); + void home(); + void noDisplay(); + void display(); + void noBlink(); + void blink(); + void noCursor(); + void cursor(); + void scrollDisplayLeft(); + void scrollDisplayRight(); + void printLeft(); + void printRight(); + void leftToRight(); + void rightToLeft(); + void shiftIncrement(); + void shiftDecrement(); + void noBacklight(); + void backlight(); + void autoscroll(); + void noAutoscroll(); + void createChar(uint8_t, uint8_t[]); + void setCursor(uint8_t, uint8_t); +#if defined(ARDUINO) && ARDUINO >= 100 + virtual size_t write(uint8_t); +#else + virtual void write(uint8_t); +#endif + void command(uint8_t); + void init(); + +////compatibility API function aliases +void blink_on(); // alias for blink() +void blink_off(); // alias for noBlink() +void cursor_on(); // alias for cursor() +void cursor_off(); // alias for noCursor() +void setBacklight(uint8_t new_val); // alias for backlight() and nobacklight() +void load_custom_character(uint8_t char_num, uint8_t *rows); // alias for createChar() +void printstr(const char[]); + +////Unsupported API functions (not implemented in this library) +uint8_t status(); +void setContrast(uint8_t new_val); +uint8_t keypad(); +void setDelay(int,int); +void on(); +void off(); +uint8_t init_bargraph(uint8_t graphtype); +void draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end); +void draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end); + + +private: + void init_priv(); + void send(uint8_t, uint8_t); + void write4bits(uint8_t); + void expanderWrite(uint8_t); + void pulseEnable(uint8_t); + uint8_t _Addr; + uint8_t _displayfunction; + uint8_t _displaycontrol; + uint8_t _displaymode; + uint8_t _numlines; + uint8_t _cols; + uint8_t _rows; + uint8_t _backlightval; +}; + +#endif diff --git a/LiquidCrystal_I2C/LiquidCrystal_I2C.o b/LiquidCrystal_I2C/LiquidCrystal_I2C.o new file mode 100644 index 0000000000000000000000000000000000000000..bca78e0d24dfc30341ef0d5e91cf127ee829e126 GIT binary patch literal 41564 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 literal 0 HcmV?d00001 diff --git a/LiquidCrystal_I2C/README.md b/LiquidCrystal_I2C/README.md new file mode 100644 index 0000000..aee58d3 --- /dev/null +++ b/LiquidCrystal_I2C/README.md @@ -0,0 +1,2 @@ +# LiquidCrystal_I2C +LiquidCrystal Arduino library for the DFRobot I2C LCD displays diff --git a/LiquidCrystal_I2C/examples/CustomChars/CustomChars.pde b/LiquidCrystal_I2C/examples/CustomChars/CustomChars.pde new file mode 100644 index 0000000..492612d --- /dev/null +++ b/LiquidCrystal_I2C/examples/CustomChars/CustomChars.pde @@ -0,0 +1,70 @@ +//YWROBOT +//Compatible with the Arduino IDE 1.0 +//Library version:1.1 +#include +#include + +#if defined(ARDUINO) && ARDUINO >= 100 +#define printByte(args) write(args); +#else +#define printByte(args) print(args,BYTE); +#endif + +uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4}; +uint8_t note[8] = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0}; +uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0}; +uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; +uint8_t duck[8] = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0}; +uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0}; +uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0}; +uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4}; + +LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display + +void setup() +{ + lcd.init(); // initialize the lcd + lcd.backlight(); + + lcd.createChar(0, bell); + lcd.createChar(1, note); + lcd.createChar(2, clock); + lcd.createChar(3, heart); + lcd.createChar(4, duck); + lcd.createChar(5, check); + lcd.createChar(6, cross); + lcd.createChar(7, retarrow); + lcd.home(); + + lcd.print("Hello world..."); + lcd.setCursor(0, 1); + lcd.print(" i "); + lcd.printByte(3); + lcd.print(" arduinos!"); + delay(5000); + displayKeyCodes(); + +} + +// display all keycodes +void displayKeyCodes(void) { + uint8_t i = 0; + while (1) { + lcd.clear(); + lcd.print("Codes 0x"); lcd.print(i, HEX); + lcd.print("-0x"); lcd.print(i+16, HEX); + lcd.setCursor(0, 1); + for (int j=0; j<16; j++) { + lcd.printByte(i+j); + } + i+=16; + + delay(4000); + } +} + +void loop() +{ + +} + diff --git a/LiquidCrystal_I2C/examples/HelloWorld/HelloWorld.pde b/LiquidCrystal_I2C/examples/HelloWorld/HelloWorld.pde new file mode 100644 index 0000000..6dfdee8 --- /dev/null +++ b/LiquidCrystal_I2C/examples/HelloWorld/HelloWorld.pde @@ -0,0 +1,28 @@ +//YWROBOT +//Compatible with the Arduino IDE 1.0 +//Library version:1.1 +#include +#include + +LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display + +void setup() +{ + lcd.init(); // initialize the lcd + lcd.init(); + // Print a message to the LCD. + lcd.backlight(); + lcd.setCursor(3,0); + lcd.print("Hello, world!"); + lcd.setCursor(2,1); + lcd.print("Ywrobot Arduino!"); + lcd.setCursor(0,2); + lcd.print("Arduino LCM IIC 2004"); + lcd.setCursor(2,3); + lcd.print("Power By Ec-yuan!"); +} + + +void loop() +{ +} diff --git a/LiquidCrystal_I2C/examples/SerialDisplay/SerialDisplay.pde b/LiquidCrystal_I2C/examples/SerialDisplay/SerialDisplay.pde new file mode 100644 index 0000000..fdbbc64 --- /dev/null +++ b/LiquidCrystal_I2C/examples/SerialDisplay/SerialDisplay.pde @@ -0,0 +1,34 @@ +/* + * Displays text sent over the serial port (e.g. from the Serial Monitor) on + * an attached LCD. + * YWROBOT + *Compatible with the Arduino IDE 1.0 + *Library version:1.1 + */ +#include +#include + +LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display + +void setup() +{ + lcd.init(); // initialize the lcd + lcd.backlight(); + Serial.begin(9600); +} + +void loop() +{ + // when characters arrive over the serial port... + if (Serial.available()) { + // wait a bit for the entire message to arrive + delay(100); + // clear the screen + lcd.clear(); + // read all the available characters + while (Serial.available() > 0) { + // display each character to the LCD + lcd.write(Serial.read()); + } + } +} diff --git a/LiquidCrystal_I2C/keywords.txt b/LiquidCrystal_I2C/keywords.txt new file mode 100644 index 0000000..8c450a9 --- /dev/null +++ b/LiquidCrystal_I2C/keywords.txt @@ -0,0 +1,46 @@ +########################################### +# Syntax Coloring Map For LiquidCrystal_I2C +########################################### + +########################################### +# Datatypes (KEYWORD1) +########################################### + +LiquidCrystal_I2C KEYWORD1 + +########################################### +# Methods and Functions (KEYWORD2) +########################################### +init KEYWORD2 +begin KEYWORD2 +clear KEYWORD2 +home KEYWORD2 +noDisplay KEYWORD2 +display KEYWORD2 +noBlink KEYWORD2 +blink KEYWORD2 +noCursor KEYWORD2 +cursor KEYWORD2 +scrollDisplayLeft KEYWORD2 +scrollDisplayRight KEYWORD2 +leftToRight KEYWORD2 +rightToLeft KEYWORD2 +shiftIncrement KEYWORD2 +shiftDecrement KEYWORD2 +noBacklight KEYWORD2 +backlight KEYWORD2 +autoscroll KEYWORD2 +noAutoscroll KEYWORD2 +createChar KEYWORD2 +setCursor KEYWORD2 +print KEYWORD2 +blink_on KEYWORD2 +blink_off KEYWORD2 +cursor_on KEYWORD2 +cursor_off KEYWORD2 +setBacklight KEYWORD2 +load_custom_character KEYWORD2 +printstr KEYWORD2 +########################################### +# Constants (LITERAL1) +########################################### diff --git a/LiquidCrystal_I2C/library.json b/LiquidCrystal_I2C/library.json new file mode 100644 index 0000000..5a23a39 --- /dev/null +++ b/LiquidCrystal_I2C/library.json @@ -0,0 +1,15 @@ +{ + "name": "LiquidCrystal_I2C", + "keywords": "LCD, liquidcrystal, I2C", + "description": "A library for DFRobot I2C LCD displays", + "repository": + { + "type": "git", + "url": "https://github.com/marcoschwartz/LiquidCrystal_I2C.git" + }, + "frameworks": "arduino", + "platforms": + [ + "atmelavr" + ] +} \ No newline at end of file diff --git a/LiquidCrystal_I2C/library.properties b/LiquidCrystal_I2C/library.properties new file mode 100644 index 0000000..e64a7f5 --- /dev/null +++ b/LiquidCrystal_I2C/library.properties @@ -0,0 +1,9 @@ +name=LiquidCrystal I2C +version=1.1.2 +author=Frank de Brabander +maintainer=Marco Schwartz +sentence=A library for I2C LCD displays. +paragraph= The library allows to control I2C displays with functions extremely similar to LiquidCrystal library. THIS LIBRARY MIGHT NOT BE COMPATIBLE WITH EXISTING SKETCHES. +category=Display +url=https://github.com/marcoschwartz/LiquidCrystal_I2C +architectures=avr diff --git a/Disp1602.cpp b/Lsd_print/Lsd_print.cpp similarity index 65% rename from Disp1602.cpp rename to Lsd_print/Lsd_print.cpp index e79b898..2a0afe3 100644 --- a/Disp1602.cpp +++ b/Lsd_print/Lsd_print.cpp @@ -1,87 +1,100 @@ -#include - -#include - -LiquidCrystal_I2C lcd(0x27, 16, 2); - -struct DisplayData { - char topLine[64]; - int value1; - int value2; - int value3; -}; - -struct TextCounter { - unsigned long startTime; - int incrementValue; -}; - -TextCounter textCounter; - -void setup() { - lcd.begin(16, 2); - textCounter.startTime = millis(); // Запоминаем время запуска программы -} - -void loop() { - unsigned long currentTime = millis(); // Текущее время - - // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue - if (currentTime - textCounter.startTime >= 500) { - textCounter.incrementValue++; // Увеличиваем incrementValue на 1 - textCounter.startTime = currentTime; // Обновляем время - } - - DisplayData displayData; - strncpy(displayData.topLine, "we are responsible for those who have been tame ", sizeof(displayData.topLine) - 1); - displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; - displayData.value1 = 500; - displayData.value2 = 800; - displayData.value3 = 855; - - // Буферы для заполнения данных - char buffer1[17]; - char buffer2[17]; - - // Заполнение буфера 1 - fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); - - // Заполнение буфера 2 - fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); - - // Создание массива для вывода на дисплей - char displayArray[32]; - strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray - strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 - - // Вывод данных на экран - lcd.setCursor(0, 0); - lcd.print(displayArray); - - lcd.setCursor(0, 1); - lcd.print(displayArray + 16); // Вывод второй половины displayArray -} - -void fillBuffer1(const char * source, char * buffer, size_t bufferSize, int incrementValue) { - int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue - int endIndex = startIndex + 16; - - if (endIndex > strlen(source)) { - // Если endIndex превышает длину строки source, переносим его на начало строки - endIndex = endIndex - strlen(source); - - // Копируем символы с конца строки source - strncpy(buffer, source + startIndex, strlen(source) - startIndex); - - // Копируем оставшиеся символы с начала строки source - strncat(buffer, source, endIndex); - } else { - strncpy(buffer, source + startIndex, endIndex - startIndex); - } - - buffer[endIndex - startIndex] = '\0'; // Установка нулевого символа в конце буфера -} - -void fillBuffer2(int value1, int value2, int value3, char * buffer, size_t bufferSize) { - snprintf(buffer, bufferSize, "%d.%d.%d", value1, value2, value3); -} \ No newline at end of file +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "lcdpcf8574.h" +#include "pcf8574.h" +#include "i2cmaster.h" +#include "lsd.h" +#include + +struct DisplayData { + char topLine[64]; + int value1; + int value2; + int value3; +}; + +struct TextCounter { + unsigned long startTime; + int incrementValue; +}; + +TextCounter textCounter; + +void Lsd_inciliation() { + lcd_init(LCD_DISP_ON_BLINK); // инициализация дисплея + lcd_home(); // домой курсор + lcd_led(0); // вкл подсветки + textCounter.startTime = millis(); // Запоминаем время запуска программы +} + +void fillBuffer1(const char * source, char * buffer, size_t bufferSize, int incrementValue) { + int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue + int endIndex = startIndex + 16; + + if (endIndex > strlen(source)) { + // Если endIndex превышает длину строки source, переносим его на начало строки + endIndex = endIndex - strlen(source); + + // Копируем символы с конца строки source + strncpy(buffer, source + startIndex, strlen(source) - startIndex); + + // Копируем оставшиеся символы с начала строки source + strncat(buffer, source, endIndex); + } else { + strncpy(buffer, source + startIndex, endIndex - startIndex); + } + buffer[endIndex - startIndex] = '\0'; // Установка нулевого символа в конце буфера +} + +void fillBuffer2(int value1, int value2, int value3, char * buffer, size_t bufferSize) { + snprintf(buffer, bufferSize, "%d.%d.%d", value1, value2, value3); +} + + +void printLsd(const char * inputText) +{ + unsigned long currentTime = millis(); // Текущее время + // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue + if (currentTime - textCounter.startTime >= 500) { + textCounter.incrementValue++; // Увеличиваем incrementValue на 1 + textCounter.startTime = currentTime; // Обновляем время + } + + DisplayData displayData; + strncpy(displayData.topLine, inputText, sizeof(displayData.topLine) - 1); + displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; + displayData.value1 = 500; + displayData.value2 = 800; + displayData.value3 = 855; + + // Буферы для заполнения данных + char buffer1[17]; + char buffer2[17]; + + // Заполнение буфера 1 + fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); + + // Заполнение буфера 2 + fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); + + // Создание массива для вывода на дисплей + char displayArray[32]; + strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray + strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 + + // Вывод данных на экран + lcd_gotoxy(0, 0); + lcd_puts(displayArray); + + lcd_gotoxy(0, 1); + lcd_puts(displayArray + 16); // Вывод второй половины displayArray +} + diff --git a/Lsd_print/lsd.h b/Lsd_print/lsd.h new file mode 100644 index 0000000..2b495ce --- /dev/null +++ b/Lsd_print/lsd.h @@ -0,0 +1,8 @@ +#ifndef Lsd_print_h +#define Lsd_print_h +#include + +void Lsd_inciliation(); +void printLsd(const char* inputText); + +#endif \ No newline at end of file diff --git a/MyLCD/MyLCD.h b/MyLCD/MyLCD.h new file mode 100644 index 0000000..2a167ba --- /dev/null +++ b/MyLCD/MyLCD.h @@ -0,0 +1,22 @@ + +#ifndef MYLCD_H_ +#define MYLCD_H_ + + +// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "lcdpcf8574.h" +#include "pcf8574.h" +#include "i2cmaster.h" + + +#endif \ No newline at end of file diff --git a/MyLCD/i2cmaster.h b/MyLCD/i2cmaster.h new file mode 100644 index 0000000..e1f01af --- /dev/null +++ b/MyLCD/i2cmaster.h @@ -0,0 +1,42 @@ +#ifndef _I2CMASTER_H +#define _I2CMASTER_H + +// , i2c +#define I2C_READ 1 + +// , i2c +#define I2C_WRITE 0 + +// +#define SCL_CLOCK 100000L + +// +void i2c_init(void); + +// +void i2c_stop(void); + +// +unsigned char i2c_start(unsigned char addr); + +// () +unsigned char i2c_rep_start(unsigned char addr); + +// , - , +void i2c_start_wait(unsigned char addr); + + // +unsigned char i2c_write(unsigned char data); + +// +unsigned char i2c_readAck(void); + +// +unsigned char i2c_readNak(void); + +// +unsigned char i2c_read(unsigned char ack); + +// +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); +#endif diff --git a/MyLCD/keywords.txt b/MyLCD/keywords.txt new file mode 100644 index 0000000..26f60da --- /dev/null +++ b/MyLCD/keywords.txt @@ -0,0 +1,10 @@ +lcd_init KEYWORD2 +lcd_clrscr KEYWORD2 +lcd_home KEYWORD2 +lcd_gotoxy KEYWORD2 +lcd_led KEYWORD2 +lcd_putc KEYWORD2 +lcd_puts KEYWORD2 +lcd_puts_p KEYWORD2 +lcd_command KEYWORD2 +lcd_data KEYWORD2 \ No newline at end of file diff --git a/lcdpcf8574.cpp b/MyLCD/lcdpcf8574.cpp similarity index 96% rename from lcdpcf8574.cpp rename to MyLCD/lcdpcf8574.cpp index e0829c3..c5808d5 100644 --- a/lcdpcf8574.cpp +++ b/MyLCD/lcdpcf8574.cpp @@ -1,316 +1,316 @@ -#include "MyLCD.h" - -// задержеки через асемблер -#define lcd_e_delay() __asm__ __volatile__( "rjmp 1f\n 1:" ); -#define lcd_e_toggle() toggle_e() - - -volatile uint8_t dataport = 0; - -static void toggle_e(void); - -// сама реализация задержек -static inline void _delayFourCycles(unsigned int __count) -{ - if ( __count == 0 ) - __asm__ __volatile__( "rjmp 1f\n 1:" ); - else - __asm__ __volatile__ ( - "1: sbiw %0,1" "\n\t" - "brne 1b" - : "=w" (__count) - : "0" (__count) - ); -} - -// тупа оборачиваем функцию в макрос -#define delay(us) _delayFourCycles( ( ( 1*(F_CPU/4000) )*us)/1000 ) - -// переключение пина для начала записи команды -static void toggle_e(void) -{ - pcf8574_setoutputpinhigh(LCD_PCF8574_DEVICEID, LCD_E_PIN); - lcd_e_delay(); - pcf8574_setoutputpinlow(LCD_PCF8574_DEVICEID, LCD_E_PIN); -} - - -// отправка байта для контроллера LCD -static void lcd_write(uint8_t data,uint8_t rs) -{ - if (rs) //отправка данных (RS=1, RW=0) - dataport |= _BV(LCD_RS_PIN); - else // отпрака инструкций(RS=0, RW=0) - dataport &= ~_BV(LCD_RS_PIN); - dataport &= ~_BV(LCD_RW_PIN); - pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); - - // отправка старшего полубайта - dataport &= ~_BV(LCD_DATA3_PIN); - dataport &= ~_BV(LCD_DATA2_PIN); - dataport &= ~_BV(LCD_DATA1_PIN); - dataport &= ~_BV(LCD_DATA0_PIN); - if(data & 0x80) dataport |= _BV(LCD_DATA3_PIN); - if(data & 0x40) dataport |= _BV(LCD_DATA2_PIN); - if(data & 0x20) dataport |= _BV(LCD_DATA1_PIN); - if(data & 0x10) dataport |= _BV(LCD_DATA0_PIN); - pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); - lcd_e_toggle(); - - // отправка младшего полубайта - dataport &= ~_BV(LCD_DATA3_PIN); - dataport &= ~_BV(LCD_DATA2_PIN); - dataport &= ~_BV(LCD_DATA1_PIN); - dataport &= ~_BV(LCD_DATA0_PIN); - if(data & 0x08) dataport |= _BV(LCD_DATA3_PIN); - if(data & 0x04) dataport |= _BV(LCD_DATA2_PIN); - if(data & 0x02) dataport |= _BV(LCD_DATA1_PIN); - if(data & 0x01) dataport |= _BV(LCD_DATA0_PIN); - pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); - lcd_e_toggle(); - - // завершаем передачу - dataport |= _BV(LCD_DATA0_PIN); - dataport |= _BV(LCD_DATA1_PIN); - dataport |= _BV(LCD_DATA2_PIN); - dataport |= _BV(LCD_DATA3_PIN); - pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); -} - -// чтение байта -static uint8_t lcd_read(uint8_t rs) -{ - uint8_t data; - - if (rs) // запись данных (RS=1, RW=0) - dataport |= _BV(LCD_RS_PIN); - else // запись инструкций (RS=0, RW=0) - dataport &= ~_BV(LCD_RS_PIN); - dataport |= _BV(LCD_RW_PIN); - pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); - - pcf8574_setoutputpinhigh(LCD_PCF8574_DEVICEID, LCD_E_PIN); - lcd_e_delay(); - // чтение страшего полубайта - data = pcf8574_getoutputpin(LCD_PCF8574_DEVICEID, LCD_DATA0_PIN) << 4; - pcf8574_setoutputpinlow(LCD_PCF8574_DEVICEID, LCD_E_PIN); - - lcd_e_delay(); - - pcf8574_setoutputpinhigh(LCD_PCF8574_DEVICEID, LCD_E_PIN); - lcd_e_delay(); - // чтение младшего полубайта - data |= pcf8574_getoutputpin(LCD_PCF8574_DEVICEID, LCD_DATA0_PIN) &0x0F; - pcf8574_setoutputpinlow(LCD_PCF8574_DEVICEID, LCD_E_PIN); - - return data; -} - -// ждем пока ЖК освободится -static uint8_t lcd_waitbusy(void) - -{ - register uint8_t c; - - // ждем - while ( (c=lcd_read(0)) & (1<= LCD_START_LINE2) && (pos < LCD_START_LINE4) ) - addressCounter = LCD_START_LINE3; - else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2) ) - addressCounter = LCD_START_LINE4; - else - addressCounter = LCD_START_LINE1; -#endif - lcd_command((1<>4; - dataport |= _BV(LCD_DATA0_PIN); // _BV(LCD_FUNCTION_8BIT)>>4; - pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); - - // дрючим дисплей чтобы он начал работать - lcd_e_toggle(); - delay(4992); - lcd_e_toggle(); - delay(64); - lcd_e_toggle(); - delay(64); - - // переходим в 4 битный режим - dataport &= ~_BV(LCD_DATA0_PIN); - pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); - lcd_e_toggle(); - delay(64); - - - lcd_command(LCD_FUNCTION_DEFAULT); // настраиваем кол-во строк - lcd_command(LCD_DISP_OFF); // вырубаем дисплей - lcd_clrscr(); // чистим экран - lcd_command(LCD_MODE_DEFAULT); // запускаемся в стандартном режиме - lcd_command(dispAttr); // отправляем настройки -} +#include "MyLCD.h" + +// задержеки через асемблер +#define lcd_e_delay() __asm__ __volatile__( "rjmp 1f\n 1:" ); +#define lcd_e_toggle() toggle_e() + + +volatile uint8_t dataport = 0; + +static void toggle_e(void); + +// сама реализация задержек +static inline void _delayFourCycles(unsigned int __count) +{ + if ( __count == 0 ) + __asm__ __volatile__( "rjmp 1f\n 1:" ); + else + __asm__ __volatile__ ( + "1: sbiw %0,1" "\n\t" + "brne 1b" + : "=w" (__count) + : "0" (__count) + ); +} + +// тупа оборачиваем функцию в макрос +#define delay(us) _delayFourCycles( ( ( 1*(F_CPU/4000) )*us)/1000 ) + +// переключение пина для начала записи команды +static void toggle_e(void) +{ + pcf8574_setoutputpinhigh(LCD_PCF8574_DEVICEID, LCD_E_PIN); + lcd_e_delay(); + pcf8574_setoutputpinlow(LCD_PCF8574_DEVICEID, LCD_E_PIN); +} + + +// отправка байта для контроллера LCD +static void lcd_write(uint8_t data,uint8_t rs) +{ + if (rs) //отправка данных (RS=1, RW=0) + dataport |= _BV(LCD_RS_PIN); + else // отпрака инструкций(RS=0, RW=0) + dataport &= ~_BV(LCD_RS_PIN); + dataport &= ~_BV(LCD_RW_PIN); + pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); + + // отправка старшего полубайта + dataport &= ~_BV(LCD_DATA3_PIN); + dataport &= ~_BV(LCD_DATA2_PIN); + dataport &= ~_BV(LCD_DATA1_PIN); + dataport &= ~_BV(LCD_DATA0_PIN); + if(data & 0x80) dataport |= _BV(LCD_DATA3_PIN); + if(data & 0x40) dataport |= _BV(LCD_DATA2_PIN); + if(data & 0x20) dataport |= _BV(LCD_DATA1_PIN); + if(data & 0x10) dataport |= _BV(LCD_DATA0_PIN); + pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); + lcd_e_toggle(); + + // отправка младшего полубайта + dataport &= ~_BV(LCD_DATA3_PIN); + dataport &= ~_BV(LCD_DATA2_PIN); + dataport &= ~_BV(LCD_DATA1_PIN); + dataport &= ~_BV(LCD_DATA0_PIN); + if(data & 0x08) dataport |= _BV(LCD_DATA3_PIN); + if(data & 0x04) dataport |= _BV(LCD_DATA2_PIN); + if(data & 0x02) dataport |= _BV(LCD_DATA1_PIN); + if(data & 0x01) dataport |= _BV(LCD_DATA0_PIN); + pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); + lcd_e_toggle(); + + // завершаем передачу + dataport |= _BV(LCD_DATA0_PIN); + dataport |= _BV(LCD_DATA1_PIN); + dataport |= _BV(LCD_DATA2_PIN); + dataport |= _BV(LCD_DATA3_PIN); + pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); +} + +// чтение байта +static uint8_t lcd_read(uint8_t rs) +{ + uint8_t data; + + if (rs) // запись данных (RS=1, RW=0) + dataport |= _BV(LCD_RS_PIN); + else // запись инструкций (RS=0, RW=0) + dataport &= ~_BV(LCD_RS_PIN); + dataport |= _BV(LCD_RW_PIN); + pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); + + pcf8574_setoutputpinhigh(LCD_PCF8574_DEVICEID, LCD_E_PIN); + lcd_e_delay(); + // чтение страшего полубайта + data = pcf8574_getoutputpin(LCD_PCF8574_DEVICEID, LCD_DATA0_PIN) << 4; + pcf8574_setoutputpinlow(LCD_PCF8574_DEVICEID, LCD_E_PIN); + + lcd_e_delay(); + + pcf8574_setoutputpinhigh(LCD_PCF8574_DEVICEID, LCD_E_PIN); + lcd_e_delay(); + // чтение младшего полубайта + data |= pcf8574_getoutputpin(LCD_PCF8574_DEVICEID, LCD_DATA0_PIN) &0x0F; + pcf8574_setoutputpinlow(LCD_PCF8574_DEVICEID, LCD_E_PIN); + + return data; +} + +// ждем пока ЖК освободится +static uint8_t lcd_waitbusy(void) + +{ + register uint8_t c; + + // ждем + while ( (c=lcd_read(0)) & (1<= LCD_START_LINE2) && (pos < LCD_START_LINE4) ) + addressCounter = LCD_START_LINE3; + else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2) ) + addressCounter = LCD_START_LINE4; + else + addressCounter = LCD_START_LINE1; +#endif + lcd_command((1<>4; + dataport |= _BV(LCD_DATA0_PIN); // _BV(LCD_FUNCTION_8BIT)>>4; + pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); + + // дрючим дисплей чтобы он начал работать + lcd_e_toggle(); + delay(4992); + lcd_e_toggle(); + delay(64); + lcd_e_toggle(); + delay(64); + + // переходим в 4 битный режим + dataport &= ~_BV(LCD_DATA0_PIN); + pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport); + lcd_e_toggle(); + delay(64); + + + lcd_command(LCD_FUNCTION_DEFAULT); // настраиваем кол-во строк + lcd_command(LCD_DISP_OFF); // вырубаем дисплей + lcd_clrscr(); // чистим экран + lcd_command(LCD_MODE_DEFAULT); // запускаемся в стандартном режиме + lcd_command(dispAttr); // отправляем настройки +} diff --git a/lcdpcf8574.h b/MyLCD/lcdpcf8574.h similarity index 97% rename from lcdpcf8574.h rename to MyLCD/lcdpcf8574.h index b9059de..d5c35b0 100644 --- a/lcdpcf8574.h +++ b/MyLCD/lcdpcf8574.h @@ -1,110 +1,110 @@ -#ifndef LCD_H -#define LCD_H - -#define LCD_PCF8574_INIT 1 // pcf - -#define LCD_PCF8574_DEVICEID 0 //id - -#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES - -// : / , / -#define LCD_ENTRY_DEC 0x04 // , -#define LCD_ENTRY_DEC_SHIFT 0x05 // , -#define LCD_ENTRY_INC_ 0x06 // , . -#define LCD_ENTRY_INC_SHIFT 0x07 // , - -// / , / , -#define LCD_DISP_OFF 0x08 // -#define LCD_DISP_ON 0x0C // , -#define LCD_DISP_ON_BLINK 0x0D // , , -#define LCD_DISP_ON_CURSOR 0x0E // , -#define LCD_DISP_ON_CURSOR_BLINK 0x0F // , , - -// / -#define LCD_MOVE_CURSOR_LEFT 0x10 // -#define LCD_MOVE_CURSOR_RIGHT 0x14 // -#define LCD_MOVE_DISP_LEFT 0x18 // -#define LCD_MOVE_DISP_RIGHT 0x1C // - -// : -#define LCD_FUNCTION_4BIT_1LINE 0x20 // 4- , , 5x7 -#define LCD_FUNCTION_4BIT_2LINES 0x28 // 4- , , 5x7 -#define LCD_FUNCTION_8BIT_1LINE 0x30 // 8- , , 5x7 -#define LCD_FUNCTION_8BIT_2LINES 0x38 // 8- , , 5x7 - -#define LCD_LINES 2 // - -#define LCD_DISP_LENGTH 16 // - -#define LCD_LINE_LENGTH 0x40 // -#define LCD_START_LINE1 0x00 // DDRM 1 -#define LCD_START_LINE2 0x40 // DDRM 2 -#define LCD_WRAP_LINES 1 // - - - -#define LCD_DATA0_PIN 4 // -#define LCD_DATA1_PIN 5 // -#define LCD_DATA2_PIN 6 // -#define LCD_DATA3_PIN 7 // -#define LCD_RS_PIN 0 // RS -#define LCD_RW_PIN 1 // RW -#define LCD_E_PIN 2 // -#define LCD_LED_PIN 3 // - - -// HD44780U. -#define LCD_CLR 0 // -#define LCD_HOME 1 // -#define LCD_ENTRY_MODE 2 // -#define LCD_ENTRY_INC 1 // -#define LCD_ENTRY_SHIFT 0 // -#define LCD_ON 3 // -#define LCD_ON_DISPLAY 2 // -#define LCD_ON_CURSOR 1 // -#define LCD_ON_BLINK 0 // -#define LCD_MOVE 4 // -#define LCD_MOVE_DISP 3 // -#define LCD_MOVE_RIGHT 2 // -#define LCD_FUNCTION 5 // -#define LCD_FUNCTION_8BIT 4 // 8 -#define LCD_FUNCTION_2LINES 3 // -#define LCD_FUNCTION_10DOTS 2 // -#define LCD_CGRAM 6 // CG RAM -#define LCD_DDRAM 7 // DD RAM -#define LCD_BUSY 7 // - -// -#define LCD_MODE_DEFAULT ((1<= 0 && deviceid < PCF8574_MAXDEVICES)) { - data = pcf8574_pinstatus[deviceid]; - } - return data; -} - -// получаем статус пинов вывода -int8_t pcf8574_getoutputpin(uint8_t deviceid, uint8_t pin) { - int8_t data = -1; - if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pin >= 0 && pin < PCF8574_MAXPINS)) { - data = pcf8574_pinstatus[deviceid]; - data = (data >> pin) & 0b00000001; - } - return data; -} - -// настройка вывода -int8_t pcf8574_setoutput(uint8_t deviceid, uint8_t data) { - if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES)) { - pcf8574_pinstatus[deviceid] = data; - i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_WRITE); - i2c_write(data); - i2c_stop(); - return 0; - } - return -1; -} - -// установить выходные контакты, заменить фактический статус устройства из pinstart для i2c -int8_t pcf8574_setoutputpins(uint8_t deviceid, uint8_t pinstart, uint8_t pinlength, int8_t data) { - if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pinstart - pinlength + 1 >= 0 && pinstart - pinlength + 1 >= 0 && pinstart < PCF8574_MAXPINS && pinstart > 0 && pinlength > 0)) { - uint8_t b = 0; - b = pcf8574_pinstatus[deviceid]; - uint8_t mask = ((1 << pinlength) - 1) << (pinstart - pinlength + 1); - data <<= (pinstart - pinlength + 1); - data &= mask; - b &= ~(mask); - b |= data; - pcf8574_pinstatus[deviceid] = b; - //рестартим - i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_WRITE); - i2c_write(b); - i2c_stop(); - return 0; - } - return -1; -} - -// настройка пинов вывода -int8_t pcf8574_setoutputpin(uint8_t deviceid, uint8_t pin, uint8_t data) { - if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pin >= 0 && pin < PCF8574_MAXPINS)) { - uint8_t b = 0; - b = pcf8574_pinstatus[deviceid]; - b = (data != 0) ? (b | (1 << pin)) : (b & ~(1 << pin)); - pcf8574_pinstatus[deviceid] = b; - //рестартим - i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_WRITE); - i2c_write(b); - i2c_stop(); - return 0; - } - return -1; -} - -// установка высокого уровня на выходных пинах -int8_t pcf8574_setoutputpinhigh(uint8_t deviceid, uint8_t pin) { - return pcf8574_setoutputpin(deviceid, pin, 1); -} - -// установка низкого уровня на выходных пинах -int8_t pcf8574_setoutputpinlow(uint8_t deviceid, uint8_t pin) { - return pcf8574_setoutputpin(deviceid, pin, 0); -} - -// получение входных данных -int8_t pcf8574_getinput(uint8_t deviceid) { - int8_t data = -1; - if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES)) { - i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_READ); - data = ~i2c_readNak(); - i2c_stop(); - } - return data; -} - -// получение входного контакта (высокий или низкий) -int8_t pcf8574_getinputpin(uint8_t deviceid, uint8_t pin) { - int8_t data = -1; - if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pin >= 0 && pin < PCF8574_MAXPINS)) { - data = pcf8574_getinput(deviceid); - if(data != -1) { - data = (data >> pin) & 0b00000001; - } - } - return data; +#include "MyLCD.h" +uint8_t pcf8574_pinstatus[PCF8574_MAXDEVICES]; + +// инициализация pcf +void pcf8574_init() { + #if PCF8574_I2CINIT == 1 + // инитим i2c + i2c_init(); + _delay_us(10); + #endif + uint8_t i = 0; + for(i=0; i= 0 && deviceid < PCF8574_MAXDEVICES)) { + data = pcf8574_pinstatus[deviceid]; + } + return data; +} + +// получаем статус пинов вывода +int8_t pcf8574_getoutputpin(uint8_t deviceid, uint8_t pin) { + int8_t data = -1; + if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pin >= 0 && pin < PCF8574_MAXPINS)) { + data = pcf8574_pinstatus[deviceid]; + data = (data >> pin) & 0b00000001; + } + return data; +} + +// настройка вывода +int8_t pcf8574_setoutput(uint8_t deviceid, uint8_t data) { + if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES)) { + pcf8574_pinstatus[deviceid] = data; + i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_WRITE); + i2c_write(data); + i2c_stop(); + return 0; + } + return -1; +} + +// установить выходные контакты, заменить фактический статус устройства из pinstart для i2c +int8_t pcf8574_setoutputpins(uint8_t deviceid, uint8_t pinstart, uint8_t pinlength, int8_t data) { + if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pinstart - pinlength + 1 >= 0 && pinstart - pinlength + 1 >= 0 && pinstart < PCF8574_MAXPINS && pinstart > 0 && pinlength > 0)) { + uint8_t b = 0; + b = pcf8574_pinstatus[deviceid]; + uint8_t mask = ((1 << pinlength) - 1) << (pinstart - pinlength + 1); + data <<= (pinstart - pinlength + 1); + data &= mask; + b &= ~(mask); + b |= data; + pcf8574_pinstatus[deviceid] = b; + //рестартим + i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_WRITE); + i2c_write(b); + i2c_stop(); + return 0; + } + return -1; +} + +// настройка пинов вывода +int8_t pcf8574_setoutputpin(uint8_t deviceid, uint8_t pin, uint8_t data) { + if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pin >= 0 && pin < PCF8574_MAXPINS)) { + uint8_t b = 0; + b = pcf8574_pinstatus[deviceid]; + b = (data != 0) ? (b | (1 << pin)) : (b & ~(1 << pin)); + pcf8574_pinstatus[deviceid] = b; + //рестартим + i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_WRITE); + i2c_write(b); + i2c_stop(); + return 0; + } + return -1; +} + +// установка высокого уровня на выходных пинах +int8_t pcf8574_setoutputpinhigh(uint8_t deviceid, uint8_t pin) { + return pcf8574_setoutputpin(deviceid, pin, 1); +} + +// установка низкого уровня на выходных пинах +int8_t pcf8574_setoutputpinlow(uint8_t deviceid, uint8_t pin) { + return pcf8574_setoutputpin(deviceid, pin, 0); +} + +// получение входных данных +int8_t pcf8574_getinput(uint8_t deviceid) { + int8_t data = -1; + if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES)) { + i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_READ); + data = ~i2c_readNak(); + i2c_stop(); + } + return data; +} + +// получение входного контакта (высокий или низкий) +int8_t pcf8574_getinputpin(uint8_t deviceid, uint8_t pin) { + int8_t data = -1; + if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pin >= 0 && pin < PCF8574_MAXPINS)) { + data = pcf8574_getinput(deviceid); + if(data != -1) { + data = (data >> pin) & 0b00000001; + } + } + return data; } \ No newline at end of file diff --git a/pcf8574.h b/MyLCD/pcf8574.h similarity index 97% rename from pcf8574.h rename to MyLCD/pcf8574.h index 34a9439..420cc49 100644 --- a/pcf8574.h +++ b/MyLCD/pcf8574.h @@ -1,21 +1,21 @@ -#ifndef PCF8574_H_ -#define PCF8574_H_ - -#define PCF8574_ADDRBASE (0x27) // - - -#define PCF8574_I2CINIT 1 // i2c - -#define PCF8574_MAXDEVICES 1 // - -#define PCF8574_MAXPINS 8 // - - -void pcf8574_init(); -int8_t pcf8574_getoutput(uint8_t deviceid); -int8_t pcf8574_getoutputpin(uint8_t deviceid, uint8_t pin); -int8_t pcf8574_setoutput(uint8_t deviceid, uint8_t data); -int8_t pcf8574_setoutputpins(uint8_t deviceid, uint8_t pinstart, uint8_t pinlength, int8_t data); -int8_t pcf8574_setoutputpin(uint8_t deviceid, uint8_t pin, uint8_t data); -int8_t pcf8574_setoutputpinhigh(uint8_t deviceid, uint8_t pin); -int8_t pcf8574_setoutputpinlow(uint8_t deviceid, uint8_t pin); -int8_t pcf8574_getinput(uint8_t deviceid); -int8_t pcf8574_getinputpin(uint8_t deviceid, uint8_t pin); -#endif +#ifndef PCF8574_H_ +#define PCF8574_H_ + +#define PCF8574_ADDRBASE (0x27) // - + +#define PCF8574_I2CINIT 1 // i2c + +#define PCF8574_MAXDEVICES 1 // - +#define PCF8574_MAXPINS 8 // - + +void pcf8574_init(); +int8_t pcf8574_getoutput(uint8_t deviceid); +int8_t pcf8574_getoutputpin(uint8_t deviceid, uint8_t pin); +int8_t pcf8574_setoutput(uint8_t deviceid, uint8_t data); +int8_t pcf8574_setoutputpins(uint8_t deviceid, uint8_t pinstart, uint8_t pinlength, int8_t data); +int8_t pcf8574_setoutputpin(uint8_t deviceid, uint8_t pin, uint8_t data); +int8_t pcf8574_setoutputpinhigh(uint8_t deviceid, uint8_t pin); +int8_t pcf8574_setoutputpinlow(uint8_t deviceid, uint8_t pin); +int8_t pcf8574_getinput(uint8_t deviceid); +int8_t pcf8574_getinputpin(uint8_t deviceid, uint8_t pin); +#endif diff --git a/MyLCD/twimaster.cpp b/MyLCD/twimaster.cpp new file mode 100644 index 0000000..2fad0d7 --- /dev/null +++ b/MyLCD/twimaster.cpp @@ -0,0 +1,117 @@ +#include "MyLCD.h" + +// инициализация интерфейса i2c +void i2c_init(void) +{ + // предделитель тактовой частоты равен 1 + TWSR = 0; + // рассчет скорости передачи данных + TWBR = ((F_CPU/SCL_CLOCK)-16)/2; +} + +// передача условия СТАРТ на шину +unsigned char i2c_start(unsigned char address) +{ + uint8_t twst; + + // отправка условия СТАРТ + TWCR = (1< - -#define LCD_ADDRESS 0x27 // Адрес дисплея на шине I2C -#define LCD_WIDTH 16 // Ширина дисплея в символах -#define LCD_HEIGHT 2 // Высота дисплея в строках - -void lcd_send_command(uint8_t command) { - Wire.beginTransmission(LCD_ADDRESS); - i2c_send_byte(0x80); // Co = 0, Rs = 0 (управляющий байт) - i2c_send_byte(command); - Wire.endTransmission(); -} - -void lcd_send_data(uint8_t data) { - Wire.beginTransmission(LCD_ADDRESS); - i2c_send_byte(0xC0); // Co = 0, Rs = 1 (байт данных) - i2c_send_byte(data); - Wire.endTransmission(); -} - -void lcd_send_string(const char *str) { - while (*str) { - lcd_send_data(*str); - str++; - } -} - -void lcd_clear() { - lcd_send_command(0x01); // Очистка дисплея - _delay_ms(2); // Небольшая пауза для завершения очистки -} - -void lcd_init() { - Wire.begin(); - lcd_send_command(0x38); // Установка интерфейса: 8 бит данных, 2 строки, 5x8 точек - lcd_send_command(0x08); // Отключение дисплея, курсора и мигания курсора - lcd_send_command(0x01); // Очистка дисплея - _delay_ms(2); // Небольшая пауза для завершения очистки - lcd_send_command(0x06); // Установка направления текста: курсор увеличивается, сдвиг дисплея - lcd_send_command(0x0C); // Включение дисплея без курсора и мигания курсора -} - -void lcd_print_char(char c) { - lcd_send_data(c); -} - -void lcd_print_string(const char *str) { - lcd_send_string(str); -} - -void lcd_update(const DisplayData *displayData, const TextCounter *textCounter) { - lcd_clear(); // Очистка дисплея перед выводом новой информации - - // Вывод данных на первую строку - lcd_send_command(0x80); // Установка курсора на начало первой строки - lcd_send_string(displayData->topLine); - - // Вывод данных на вторую строку - lcd_send_command(0xC0); // Установка курсора на начало второй строки - char buffer[17]; - snprintf(buffer, sizeof(buffer), "%d.%d.%d", displayData->value1, displayData->value2, displayData->value3); - lcd_send_string(buffer); -} diff --git a/display_functions.h b/display_functions.h deleted file mode 100644 index 0d25b61..0000000 --- a/display_functions.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef DISPLAY_FUNCTIONS_H -#define DISPLAY_FUNCTIONS_H - -#include "i2c_functions.h" -#include - -struct DisplayData { - char topLine[64]; - int value1; - int value2; - int value3; -}; - -struct TextCounter { - unsigned long startTime; - int incrementValue; -}; - -void lcd_init(); -void lcd_print_char(char c); -void lcd_print_string(const char *str); -void lcd_update(const DisplayData *displayData, const TextCounter *textCounter); - -#endif diff --git a/hdlc/main.c b/hdlc/main.c index db27ab5..e336703 100644 --- a/hdlc/main.c +++ b/hdlc/main.c @@ -1,5 +1,5 @@ //#include "hdlc.h" -#include "stdio.h" + #include "client.h" int main(){ diff --git a/i2c_functions.c b/i2c_functions.c deleted file mode 100644 index 5ccac3f..0000000 --- a/i2c_functions.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "i2c_functions.h" -#include - -// Здесь можно вставить код инициализации I2C, если требуется - -void i2c_delay() { - _delay_us(2); -} - -void i2c_start() { - // Реализация отправки стартового условия I2C -} - -void i2c_stop() { - // Реализация отправки стопового условия I2C -} - -void i2c_send_byte(uint8_t data) { - // Реализация отправки одного байта данных по I2C -} - -void i2c_send_bytes(const uint8_t *data, uint8_t length) { - // Реализация отправки массива данных (длиной length) по I2C -} diff --git a/i2c_functions.h b/i2c_functions.h deleted file mode 100644 index 555e732..0000000 --- a/i2c_functions.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef I2C_FUNCTIONS_H -#define I2C_FUNCTIONS_H - -#include - -void i2c_delay(); -void i2c_start(); -void i2c_stop(); -void i2c_send_byte(uint8_t data); -void i2c_send_bytes(const uint8_t *data, uint8_t length); - -#endif diff --git a/main.c b/main.c deleted file mode 100644 index 1fa31e8..0000000 --- a/main.c +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include -#include "display_functions.h" - -// Основной код вашего проекта - -int main() { - // Настройка портов и другие инициализации - - lcd_init(); // Инициализация дисплея - - // Ваш код в функции setup() - - while (1) { - unsigned long currentTime = millis(); // Текущее время - // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue - if (currentTime - textCounter.startTime >= 500) { - textCounter.incrementValue++; // Увеличиваем incrementValue на 1 - textCounter.startTime = currentTime; // Обновляем время - } - - DisplayData displayData; - strncpy(displayData.topLine, "we are responsible for those who have been tame ", sizeof(displayData.topLine) - 1); - displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; - displayData.value1 = 500; - displayData.value2 = 800; - displayData.value3 = 855; - // Буферы для заполнения данных - char buffer1[17]; - char buffer2[17]; - // Заполнение буфера 1 - fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); - // Заполнение буфера 2 - fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); - // Создание массива для вывода на дисплей - char displayArray[32]; - strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray - strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 - - // Вывод данных на экран - lcd.setCursor(0, 0); - lcd.print(displayArray); - lcd.setCursor(0, 1); - lcd.print(displayArray + 16); // Вывод второй половины displayArray - - // Ваш код в функции loop() может быть здесь или в другом месте - - // Обновление данных на дисплее - lcd_update(&displayData, &textCounter); - } - - return 0; -} diff --git a/main_sketch/main_sketch.ino b/main_sketch/main_sketch.ino new file mode 100644 index 0000000..e8eac90 --- /dev/null +++ b/main_sketch/main_sketch.ino @@ -0,0 +1,73 @@ +#include "lcd.h" +#include "client.h" +#include "uart.h" +#include "stdbool.h" +#include "stdio.h" + +struct Client hdlc; +bool flag_connection = false; + +void setup() { + Lsd_inciliation(); + UART_init(); + init_hdlc_client(&hdlc, 200); +} + +void loop() { + if (!flag_connection){ + hdlc_control_t frame; + hdlc_connect(&hdlc, &frame); + uint8_t buffer; + hdlc_get_raw_frame(&hdlc, &frame, &buffer, sizeof(buffer)); + + UART_send(&buffer, sizeof(buffer)); + + bool flag_recive = true; + while(flag_recive){ + uint8_t buffer; + UART_receive(&buffer, sizeof(buffer)); + + int err = hdlc_timeout_handler(&hdlc, 1); + if (err != 0){ + return err; + } + + int ret = hdlc_decode_recived_raw_data(&hdlc, &fake_buffer, sizeof(fake_buffer), 0, 0); + + if (ret == -6){ + uint8_t buffer; + hdlc_get_raw_frame(&hdlc, &hdlc->frame_rej, &buffer, sizeof(buffer)); + UART_send(&buffer, sizeof(buffer)); + } + + if (ret == 0 && client->state == READY_STATE){ + flag_connection = true; + } + } + } else { + bool flag_recive = true; + while(flag_recive){ + uint8_t buffer; + UART_receive(&buffer, sizeof(buffer)); + + int err = hdlc_timeout_handler(&hdlc, 1); + if (err != 0){ + return err; + } + + uint8_t recived_data; + size_t len_recived_data; + + int ret = hdlc_decode_recived_raw_data(&hdlc, &fake_buffer, sizeof(fake_buffer), &recived_data, &len_recived_data); + + if (ret == -6){ + uint8_t buffer; + hdlc_get_raw_frame(&hdlc, &hdlc->frame_rej, &buffer, sizeof(buffer)); + UART_send(&buffer, sizeof(buffer)); + } + + printLsd(recived_data); + } + } + +} \ No newline at end of file diff --git a/sketch_sep19a.ino b/sketch_sep19a.ino deleted file mode 100644 index 2816b91..0000000 --- a/sketch_sep19a.ino +++ /dev/null @@ -1,83 +0,0 @@ -#include "MyLCD.h" - -struct DisplayData { - char topLine[64]; - int value1; - int value2; - int value3; -}; - -struct TextCounter { - unsigned long startTime; - int incrementValue; -}; - -TextCounter textCounter; - -void setup() { - lcd_init(LCD_DISP_ON_BLINK); // инициализация дисплея - lcd_home(); // домой курсор - lcd_led(0); // вкл подсветки - textCounter.startTime = millis(); // Запоминаем время запуска программы -} - -void loop() { - unsigned long currentTime = millis(); // Текущее время - // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue - if (currentTime - textCounter.startTime >= 500) { - textCounter.incrementValue++; // Увеличиваем incrementValue на 1 - textCounter.startTime = currentTime; // Обновляем время - } - - DisplayData displayData; - strncpy(displayData.topLine, "we are responsible for those who have been tame ", sizeof(displayData.topLine) - 1); - displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; - displayData.value1 = 500; - displayData.value2 = 800; - displayData.value3 = 855; - - // Буферы для заполнения данных - char buffer1[17]; - char buffer2[17]; - - // Заполнение буфера 1 - fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); - - // Заполнение буфера 2 - fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); - - // Создание массива для вывода на дисплей - char displayArray[32]; - strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray - strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 - - // Вывод данных на экран - lcd_gotoxy(0, 0); - lcd_puts(displayArray); - - lcd_gotoxy(0, 1); - lcd_puts(displayArray + 16); // Вывод второй половины displayArray -} - -void fillBuffer1(const char* source, char* buffer, size_t bufferSize, int incrementValue) { - int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue - int endIndex = startIndex + 16; - - if (endIndex > strlen(source)) { - // Если endIndex превышает длину строки source, переносим его на начало строки - endIndex = endIndex - strlen(source); - - // Копируем символы с конца строки source - strncpy(buffer, source + startIndex, strlen(source) - startIndex); - - // Копируем оставшиеся символы с начала строки source - strncat(buffer, source, endIndex); - } else { - strncpy(buffer, source + startIndex, endIndex - startIndex); - } - buffer[endIndex - startIndex] = '\0'; // Установка нулевого символа в конце буфера -} - -void fillBuffer2(int value1, int value2, int value3, char* buffer, size_t bufferSize) { - snprintf(buffer, bufferSize, "%d.%d.%d", value1, value2, value3); -} diff --git a/пример с библиотеками ардуино.txt b/пример с библиотеками ардуино.txt deleted file mode 100644 index e843baa..0000000 --- a/пример с библиотеками ардуино.txt +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include - -LiquidCrystal_I2C lcd(32, 16, 2); - -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 setup() { - Serial.begin(9600); - lcd.init(); - lcd.backlight(); - - 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--) { - lcd.setCursor(i, 0); - lcd.print(colum1); - lcd.setCursor(0, 1); - lcd.print(colum2); - delay_ms(200); // Use the custom delay_ms() function instead of delay() - lcd.clear(); - } - } -} diff --git a/типо с.txt b/типо с.txt deleted file mode 100644 index 9d293cc..0000000 --- a/типо с.txt +++ /dev/null @@ -1,93 +0,0 @@ -#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(); -} -} -}