Quote:Guess what Ive got one of those byvac boards as well.
Any chance you can post your library?
Sure, no problem. I have only used it for one small project, so it's not tested very well. It does work fine for me, but consider this beta software. It's mostly compatible with LiquidCrystal, and also contains some methods for reading and writing the EEPROM on the controller. This will let you store strings on the controller and enable you to print directly from this, thus saving precious flash on the Arduino.
Btw I also got one of these:
http://www.byvac.com/bv/bv4219.htm. I'm in the process of writing a library for this as well.
ByVacLCD.cpp:
Code:#include "ByVacLCD.h"
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include "WProgram.h"
#include <Wire.h>
#define BACKLIGHT_ON 0
#define BACKLIGHT_OFF 1
#define LCD_ON 1
#define LCD_OFF 0
ByVacLCD::ByVacLCD(uint8_t adr, uint8_t columns, uint8_t rows)
{
_adr = adr;
_columns = columns;
_rows = rows;
}
void ByVacLCD::init()
{
delay(15);
command(0x0c); // Display on, cursor off, blink off
command(0x06); // Increment mode, shift on
clear();
}
void ByVacLCD::clear()
{
command(0x01); // clear display, set cursor position to zero
delayMicroseconds(2000);
}
void ByVacLCD::home()
{
command(0x02); // set cursor position to zero
delayMicroseconds(2000);
}
void ByVacLCD::setCursor(int col, int row)
{
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
command(0x80 | (col + row_offsets[row]));
}
void ByVacLCD::command(uint8_t value) {
send(value, LOW);
}
void ByVacLCD::write(uint8_t value) {
send(value, HIGH);
}
void ByVacLCD::send(uint8_t value, uint8_t mode) {
Wire.beginTransmission(_adr);
if (mode) // Write data
Wire.send(2);
else // write command
Wire.send(1);
Wire.send(value);
Wire.endTransmission();
delayMicroseconds(45);
}
void ByVacLCD::backlightOn()
{
Wire.beginTransmission(_adr);
Wire.send(3);
Wire.send(BACKLIGHT_ON);
Wire.endTransmission();
}
void ByVacLCD::backlightOff()
{
Wire.beginTransmission(_adr);
Wire.send(3);
Wire.send(BACKLIGHT_OFF);
Wire.endTransmission();
}
void ByVacLCD::displayOn()
{
Wire.beginTransmission(_adr);
Wire.send(5);
Wire.send(LCD_ON);
Wire.endTransmission();
}
void ByVacLCD::displayOff()
{
Wire.beginTransmission(_adr);
Wire.send(5);
Wire.send(LCD_OFF);
Wire.endTransmission();
}
// Upload a user-defined character (5x8)
// See http://www.quinapalus.com/hd44780udg.html for
// character generator.
void ByVacLCD::uploadUdef(uint8_t character, uint8_t *data)
{
uint8_t c = character << 3, i;
for (i = 0; i < 8; i++)
{
command(0x40 | c | i);
write((uint8_t)data[i]);
}
}
void ByVacLCD::printFromEEPROM(uint8_t addr)
{
Wire.beginTransmission(_adr);
Wire.send(4);
Wire.send(addr);
Wire.endTransmission();
delayMicroseconds(45);
}
uint8_t ByVacLCD::EEPROM_startAdr()
{
Wire.beginTransmission(_adr);
Wire.send(6);
Wire.endTransmission();
Wire.requestFrom((int)_adr, 1);
if (Wire.available() == 1)
return Wire.receive();
return 0;
}
uint8_t ByVacLCD::EEPROM_endAdr()
{
Wire.beginTransmission(_adr);
Wire.send(0x93);
Wire.endTransmission();
Wire.requestFrom((int)_adr, 1);
if (Wire.available() == 1)
return Wire.receive();
return 0;
}
uint8_t ByVacLCD::EEPROM_read(uint8_t addr)
{
Wire.beginTransmission(_adr);
Wire.send(0x90);
Wire.send(addr);
Wire.endTransmission();
Wire.requestFrom((int)_adr, 1);
if (Wire.available() == 1)
return (byte)Wire.receive();
return 0;
}
void ByVacLCD::EEPROM_write(uint8_t addr, char *data)
{
Wire.beginTransmission(_adr);
Wire.send(0x91);
Wire.send(addr);
Wire.send(data);
Wire.send('\0');
Wire.endTransmission();
}
void ByVacLCD::EEPROM_write(uint8_t addr, char data)
{
Wire.beginTransmission(_adr);
Wire.send(0x91);
Wire.send(addr);
Wire.send(data);
Wire.endTransmission();
}
Code:/*
** Library for the ByVac BV4208 I2C-driver for HD44780 LCD displays.
** See www.byvac.com for datasheet.
*/
#ifndef ByVacLCD_h
#define ByVacLCD_h
#include <inttypes.h>
#include "Print.h"
class ByVacLCD : public Print {
public:
ByVacLCD(uint8_t, uint8_t, uint8_t);
void init();
void clear();
void home();
void setCursor(int, int);
virtual void write(uint8_t);
void command(uint8_t);
void backlightOn();
void backlightOff();
void displayOn();
void displayOff();
void uploadUdef(uint8_t, uint8_t*);
void printFromEEPROM(uint8_t);
uint8_t EEPROM_startAdr();
uint8_t EEPROM_endAdr();
uint8_t EEPROM_read(uint8_t addr);
void EEPROM_write(uint8_t addr, char *data);
void EEPROM_write(uint8_t addr, char data);
private:
void send(uint8_t, uint8_t);
uint8_t _adr;
uint8_t _columns;
uint8_t _rows;
};
#endif
keywords.txt:
Code:#######################################
# Syntax Coloring Map For ByVacLCD
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
ByVacLCD KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
init KEYWORD2
clear KEYWORD2
home KEYWORD2
print KEYWORD2
setCursor KEYWORD2
backlightOn KEYWORD2
backlightOff KEYWORD2
displayOn KEYWORD2
displayOff KEYWORD2
uploadUdef KEYWORD2
printFromEEPROM KEYWORD2
write KEYWORD2
command KEYWORD2
EEPROM_startAdr KEYWORD2
EEPROM_endAdr KEYWORD2
EEPROM_read KEYWORD2
EEPROM_write KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################