Вывод символов на LCD 16x2 по I2C шине
- Войдите на сайт для отправки комментариев
Пт, 10/04/2015 - 19:27
Привет всем!:) Понадобилось мне тут выводить символы на экран, почитал понял, но встретился с такой проблемой: Ни выводится ни один символ который я сам делаю, в любом случае реагирует неадекватно.
Пытаюсь вывести символ вот такой:
00100 01010 01010 01110 01110 11111 11111 01110
А выводится при любом раскладе вот такое:
11011 00000 00111 10100 11011 00000 00111 10010
Заглянул в пример библиотеки, там пример такой же а толку?
Пример вывода символа из Библиотеки прилагаю:
HelloWorld_4bit
#include <Wire.h> #include <LiquidCrystal.h> #define CONTRAST_PIN 9 #define BACKLIGHT_PIN 7 #define CONTRAST 110 LiquidCrystal lcd(12, 11, 5, 4, 3, 2, BACKLIGH_PIN, POSITIVE ); // Creat a set of new characters byte smiley[8] = { 0b00000, 0b00000, 0b01010, 0b00000, 0b00000, 0b10001, 0b01110, 0b00000 }; byte armsUp[8] = { 0b00100, 0b01010, 0b00100, 0b10101, 0b01110, 0b00100, 0b00100, 0b01010 }; byte frownie[8] = { 0b00000, 0b00000, 0b01010, 0b00000, 0b00000, 0b00000, 0b01110, 0b10001 }; void setup() { Serial.begin ( 57600 ); // Switch on the backlight and LCD contrast levels pinMode(CONTRAST_PIN, OUTPUT); analogWrite ( CONTRAST_PIN, CONTRAST ); //lcd.setBacklightPin ( BACKLIGHT_PIN, POSITIVE ); //lcd.setBacklight ( HIGH ); lcd.backlight(); lcd.begin(16,2); // initialize the lcd lcd.createChar (0, smiley); // load character to the LCD lcd.createChar (1, armsUp); // load character to the LCD lcd.createChar (2, frownie); // load character to the LCD lcd.home (); // go home lcd.print("Hello, ARDUINO "); lcd.setCursor ( 0, 1 ); // go to the next line lcd.print (" FORUM - fm "); } void loop() { // Do a little animation by writing to the same location lcd.setCursor ( 14, 1 ); lcd.print (char(2)); delay (200); lcd.setCursor ( 14, 1 ); lcd.print ( char(0)); delay (200); }
LiquidCrystal.h
LiquidCrystal.cpp
// --------------------------------------------------------------------------- // Created by Francisco Malpartida on 20/08/11. // Copyright 2011 - Under creative commons license 3.0: // Attribution-ShareAlike CC BY-SA // // This software is furnished "as is", without technical support, and with no // warranty, express or implied, as to its usefulness for any purpose. // // Thread Safe: No // Extendable: Yes // // @file LiquidCrystal.h // This file implements a basic liquid crystal library that comes as standard // in the Arduino SDK. // // @brief // This is a basic implementation of the LiquidCrystal library of the // Arduino SDK. The original library has been reworked in such a way that // this class implements the all methods to command an LCD based // on the Hitachi HD44780 and compatible chipsets using the parallel port of // the LCD (4 bit and 8 bit). // // // // @author F. Malpartida - fmalpartida@gmail.com // --------------------------------------------------------------------------- #ifndef LiquidCrystal_4bit_h #define LiquidCrystal_4bit_h #include <inttypes.h> #include "LCD.h" #include "FastIO.h" /*! @defined @abstract Command execution time on the LCD. @discussion This defines how long a command takes to execute by the LCD. The time is expressed in micro-seconds. */ #define EXEC_TIME 37 class LiquidCrystal : public LCD { public: /*! @method @abstract 8 bit LCD constructors. @discussion Defines the pin assignment that the LCD will have. The constructor does not initialize the LCD. */ LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); // Constructors with backlight control LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7, uint8_t backlightPin, t_backlighPol pol); LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7, uint8_t backlightPin, t_backlighPol pol); /*! @method @abstract 4 bit LCD constructors. @discussion Defines the pin assignment that the LCD will have. The constructor does not initialize the LCD. */ LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3); // Constructors with backlight control LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t backlightPin, t_backlighPol pol); LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t backlightPin, t_backlighPol pol); /*! @function @abstract Send a particular value to the LCD. @discussion Sends a particular value to the LCD for writing to the LCD or as an LCD command. Users should never call this method. @param value Value to send to the LCD. @result mode LOW - write to the LCD CGRAM, HIGH - write a command to the LCD. */ virtual void send(uint8_t value, uint8_t mode); /*! @function @abstract Sets the pin to control the backlight. @discussion Sets the pin in the device to control the backlight. @param pin: pin assigned to the backlight @param pol: backlight pin control polarity (POSITIVE, NEGATIVE). */ void setBacklightPin ( uint8_t pin, t_backlighPol pol ); /*! @function @abstract Switch-on/off the LCD backlight. @discussion Switch-on/off the LCD backlight. The setBacklightPin has to be called before setting the backlight for this method to work. @see setBacklightPin. For dimming control of the backlight, the configuration pin must be a PWM output pin. Dim control is achieved by passing a value from 1 to 255 as a parameter. If the pin configured when calling the setBacklightPin does not support PWM, then: (0) backlight off, (1..255) backlight on. @param value: backlight value. 0: off, 1..255: dim control of the backlight. For negative logic 255: off, 254..0: dim control. */ void setBacklight ( uint8_t value ); private: /*! @method @abstract Initializes the LCD pin allocation and associated HW @discussion Initializes the LCD pin allocation and configuration. */ void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7); /*! @method @abstract Writes numBits bits from value value to the LCD. @discussion Writes numBists bits (the least significant) to the LCD control data lines. */ void writeNbits(uint8_t value, uint8_t numBits); /*! @method @abstract Pulse the LCD enable line (En). @discussion Sends a pulse of 1 uS to the Enable pin to execute an command or write operation. */ void pulseEnable(); uint8_t _rs_pin; // LOW: command. HIGH: character. uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD. uint8_t _enable_pin; // activated by a HIGH pulse. uint8_t _data_pins[8]; // Data pins. uint8_t _backlightPin; // Pin associated to control the LCD backlight }; #endif
// --------------------------------------------------------------------------- // Created by Francisco Malpartida on 20/08/11. // Copyright 2011 - Under creative commons license 3.0: // Attribution-ShareAlike CC BY-SA // // This software is furnished "as is", without technical support, and with no // warranty, express or implied, as to its usefulness for any purpose. // // Thread Safe: No // Extendable: Yes // // @file LiquidCrystal.cpp // This file implements a basic liquid crystal library that comes as standard // in the Arduino SDK. // // @brief // This is a basic implementation of the LiquidCrystal library of the // Arduino SDK. The original library has been reworked in such a way that // this class implements the all methods to command an LCD based // on the Hitachi HD44780 and compatible chipsets using the parallel port of // the LCD (4 bit and 8 bit). // // The functionality provided by this class and its base class is identical // to the original functionality of the Arduino LiquidCrystal library. // // // @author F. Malpartida - fmalpartida@gmail.com // --------------------------------------------------------------------------- #include <stdio.h> #include <string.h> #include <inttypes.h> #if (ARDUINO < 100) #include <WProgram.h> #else #include <Arduino.h> #endif #include "LiquidCrystal.h" // CONSTANT definitions // --------------------------------------------------------------------------- #define LCD_NOBACKLIGHT 0xFF // LCD driver configuration (4bit or 8bit driver control) #define LCD_4BIT 1 #define LCD_8BIT 0 // STATIC helper functions // --------------------------------------------------------------------------- // CONSTRUCTORS // --------------------------------------------------------------------------- LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) { init(LCD_8BIT, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) { init(LCD_8BIT, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) { init(LCD_4BIT, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) { init(LCD_4BIT, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0); } // Contructors with backlight control LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7, uint8_t backlightPin, t_backlighPol pol) { init(LCD_8BIT, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7); setBacklightPin ( backlightPin, pol ); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7, uint8_t backlightPin, t_backlighPol pol) { init(LCD_8BIT, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7); setBacklightPin ( backlightPin, pol ); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t backlightPin, t_backlighPol pol) { init(LCD_4BIT, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0); setBacklightPin ( backlightPin, pol ); } LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t backlightPin, t_backlighPol pol) { init(LCD_4BIT, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0); setBacklightPin ( backlightPin, pol ); } // PUBLIC METHODS // --------------------------------------------------------------------------- /************ low level data pushing commands **********/ // // send void LiquidCrystal::send(uint8_t value, uint8_t mode) { // Only interested in COMMAND or DATA digitalWrite( _rs_pin, ( mode == DATA ) ); // if there is a RW pin indicated, set it low to Write // --------------------------------------------------- if (_rw_pin != 255) { digitalWrite(_rw_pin, LOW); } if ( mode != FOUR_BITS ) { if ( (_displayfunction & LCD_8BITMODE ) ) { writeNbits(value, 8); } else { writeNbits ( value >> 4, 4 ); writeNbits ( value, 4 ); } } else { writeNbits ( value, 4 ); } waitUsec ( EXEC_TIME ); // wait for the command to execute by the LCD } // // setBacklightPin void LiquidCrystal::setBacklightPin ( uint8_t pin, t_backlighPol pol ) { pinMode ( pin, OUTPUT ); // Difine the backlight pin as output _backlightPin = pin; _polarity = pol; setBacklight(BACKLIGHT_OFF); // Set the backlight low by default } // // setBackligh void LiquidCrystal::setBacklight ( uint8_t value ) { // Check if there is a pin assigned to the backlight // --------------------------------------------------- if ( _backlightPin != LCD_NOBACKLIGHT ) { // Check if the pin is associated to a timer, i.e. PWM // --------------------------------------------------- if(digitalPinToTimer(_backlightPin) != NOT_ON_TIMER) { // Check for control polarity inversion // --------------------------------------------------- if ( _polarity == POSITIVE ) { analogWrite ( _backlightPin, value ); } else { analogWrite ( _backlightPin, 255 - value ); } } // Not a PWM pin, set the backlight pin for POSI or NEG // polarity // -------------------------------------------------------- else if (((value > 0) && (_polarity == POSITIVE)) || ((value == 0) && (_polarity == NEGATIVE))) { digitalWrite( _backlightPin, HIGH); } else { digitalWrite( _backlightPin, LOW); } } } // PRIVATE METHODS // --------------------------------------------------------------------------- // init void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) { uint8_t i; // Initialize the IO pins // ----------------------- _rs_pin = rs; _rw_pin = rw; _enable_pin = enable; _data_pins[0] = d0; _data_pins[1] = d1; _data_pins[2] = d2; _data_pins[3] = d3; _data_pins[4] = d4; _data_pins[5] = d5; _data_pins[6] = d6; _data_pins[7] = d7; // Initialize the IO port direction to OUTPUT // ------------------------------------------ for ( i = 0; i < 4; i++ ) { pinMode ( _data_pins[i], OUTPUT ); } // Initialize the rest of the ports if it is an 8bit controlled LCD // ---------------------------------------------------------------- if ( !fourbitmode ) { for ( i = 4; i < 8; i++ ) { pinMode ( _data_pins[i], OUTPUT ); } } pinMode(_rs_pin, OUTPUT); // we can save 1 pin by not using RW. Indicate by passing 255 instead of pin# if (_rw_pin != 255) { pinMode(_rw_pin, OUTPUT); } pinMode(_enable_pin, OUTPUT); // Initialise displaymode functions to defaults: LCD_1LINE and LCD_5x8DOTS // ------------------------------------------------------------------------- if (fourbitmode) _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; else _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS; // Now we pull both RS and R/W low to begin commands digitalWrite(_rs_pin, LOW); digitalWrite(_enable_pin, LOW); if (_rw_pin != 255) { digitalWrite(_rw_pin, LOW); } // Initialise the backlight pin no nothing _backlightPin = LCD_NOBACKLIGHT; _polarity = POSITIVE; } // // pulseEnable void LiquidCrystal::pulseEnable(void) { // There is no need for the delays, since the digitalWrite operation // takes longer. digitalWrite(_enable_pin, HIGH); waitUsec(1); // enable pulse must be > 450ns digitalWrite(_enable_pin, LOW); } // // write4bits void LiquidCrystal::writeNbits(uint8_t value, uint8_t numBits) { for (uint8_t i = 0; i < numBits; i++) { digitalWrite(_data_pins[i], (value >> i) & 0x01); } pulseEnable(); }
вообще то для этого используют другую библиотеку! :)
LiquidCrystal_I2C.cpp
LiquidCrystal_I2C.h
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library