You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

239 lines
4.3 KiB
C++

#include "ams20x4LCD.hpp"
#include "amswirelib.hpp"
const static unsigned long rwdelay = 1000;
lcd20x4::lcd20x4()
{
int I;
pin_RS = 0;
pin_RW = 0;
pin_E = 0;
for(I=0;I<8;I++) pin_DB[I] = 0;
}
lcd20x4::~lcd20x4()
{
int I;
pin_RS = 0;
pin_RW = 0;
pin_E = 0;
for(I=0;I<8;I++) pin_DB[I] = 0;
}
void lcd20x4::setup(uint8_t RSpin, uint8_t RWpin, uint8_t Epin, const uint8_t* DBpins)
{
int I;
pin_RS = RSpin;
pin_RW = RWpin;
pin_E = Epin;
set_pinmode(pin_RS,1);
set_pinmode(pin_RW,1);
set_pinmode(pin_E,1);
for(I=0;I<8;I++)
{
pin_DB[I] = DBpins[I];
set_pinmode(pin_DB[I],1);
}
cursx = 0;
cursy = 0;
return;
}
void lcd20x4::loop()
{
//nothing really
}
uint8_t lcd20x4::read_op(uint8_t b, uint8_t RS)
{
uint8_t ret = 0;
uint8_t bt = 0;
int I;
for(I=0;I<8;I++)
{
set_pinmode(pin_DB[I],0);
}
write_pin(pin_E,1);
write_pin(pin_RW,1);
write_pin(pin_RS,RS);
delayMicroseconds(rwdelay);
for(I=0;I<8;I++)
{
bt = read_pin(pin_DB[I]);
ret = ret + bt<<I;
}
delayMicroseconds(rwdelay);
write_pin(pin_E,0);
for(I=0;I<8;I++)
{
set_pinmode(pin_DB[I],1);
}
delayMicroseconds(rwdelay);
return ret;
}
void lcd20x4::write_op(uint8_t b, uint8_t RS)
{
int I;
write_pin(pin_E,1);
write_pin(pin_RW,0);
write_pin(pin_RS,RS);
delayMicroseconds(rwdelay);
for(I=0;I<8;I++)
{
write_pin(pin_DB[I],(b & (1<<I))>>I);
}
delayMicroseconds(rwdelay);
write_pin(pin_E,0);
delayMicroseconds(rwdelay);
}
void lcd20x4::display_clear()
{
write_op(0b00000001,0);
}
void lcd20x4::cursor_home()
{
write_op(0b00000010,0);
cursx = 0; cursy = 0;
}
void lcd20x4::entrymode(bool ID, bool S)
{
write_op((1<<2) | (ID<<1) | S,0);
}
void lcd20x4::display_toggle(bool display, bool cursor, bool charblink)
{
write_op((1<<3) | (display<<2) | (cursor<<1) | charblink, 0);
}
void lcd20x4::cursor_shift(bool screen_cursor, bool left_right)
{
write_op((1<<4) | (screen_cursor<<3) | (left_right<<2),0);
}
//void lcd20x4::function_set(uint8_t q)
//{
// write_op((1<<5) | (q & 0b00001111) , 0);
//}
//DL: data length: 0 - 4-bit, 1 - 8-bit
//N: display lines: 0 - 1-line-mode 1 - 2-line-mode
//F: font: 0 - 5x8 1 - 5x10
void lcd20x4::function_set(bool DL,bool N,bool F)
{
write_op((1<<5)|(DL<<4)|(N<<3)|(F<<2),0);
return;
}
void lcd20x4::CGRAM_set(uint8_t Acg_6bits)
{
write_op((1<<6)|(Acg_6bits & 0b00111111),0);
}
void lcd20x4::DDRAM_set(uint8_t Add_7bits)
{
write_op((1<<7)|(Add_7bits & 0b01111111),0);
}
void lcd20x4::setmydefs()
{
write_pin(pin_E,1);
delay(50);
write_op(0x30,0); //wake up 0x30 0b00110000
delay(50);
write_op(0x30,0); //wake up
delay(50);
write_op(0x30,0); //wake up
delay(50);
//write_op(0x38,0); //function set 8-bit, 2 lines 0b00111000
function_set(1,1,1);
delay(50);
//write_op(0x10,0); //set cursor? (looks like a function set to me?)
entrymode(1,0);
delay(50);
//write_op(0x0c,0); //0x0c 0b00001100
display_toggle(1,0,0);
//write_op(0x0c,0); //0x06 0b00000110
entrymode(1,0);
// display_clear();
// cursor_home();
// entrymode(1,0);
// display_toggle(1,0,0);
// DDRAM_set(0);
}
void lcd20x4::set_pos(uint8_t x, uint8_t y)
{
uint8_t b;
switch(y)
{
case 0: b = 0x00; break;
case 1: b = 0x40; break;
case 2: b = 0x14; break;
case 3: b = 0x54; break;
default: b = 0x00;
}
b += (x%20);
DDRAM_set(b);
}
void lcd20x4::write_char(char b, uint8_t x, uint8_t y)
{
set_pos(x,y);
write_op((uint8_t) b, 1);
}
void lcd20x4::write_char(char b)
{
//may have to do translation of ASCII code
//01000001: A on the chart, 41h on ASCII chart - should be good
//write_op((uint8_t) b,1);
write_char(b,cursx,cursy);
cursx = cursx+1;
if(cursx>=20) {cursy = (cursy+1)%4; cursx = 0;}
}
void lcd20x4::newline()
{
cursx = 0;
cursy = (cursy+1)%4;
}
void lcd20x4::write_chars(const char *bytes)
{
int I;
for(I=0;I<80;I++)
{
if(bytes[I]=='\0')
{
break;
}
else if(bytes[I] == '\n')
{
newline();
}
else
{
write_char(bytes[I]);
}
}
return;
}