#include <string.h>
#define D0 0
#define D1 1
#define D2 2
#define D3 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7
#define E 8
#define RS 9
#define LEFT 0
#define RIGHT 1
uint8_t cursorPosition = 0;
void setup()
{
//set all pins to output
for (int i = 0; i <= 10; i++)
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
initDisplay();
setCursor(0, 0);
writeString("Witam wszystkich zebranych");
// Experimenting with the arduino registers
// Set the data direction of the onboard LED
*((uint8_t*)0x24) = 0b00100000;
}
void initDisplay()
{
clearDataBus();
//set 8 bit mode, 2-line display, 5*8 font
digitalWrite(D7, LOW);
digitalWrite(D6, LOW);
digitalWrite(D5, HIGH);
digitalWrite(D4, HIGH); // 8-bit mode
digitalWrite(D3, HIGH); // 2 line
digitalWrite(D2, LOW); // 5*8 character font
enable();
// display ON/OFF control
digitalWrite(D7, LOW);
digitalWrite(D6, LOW);
digitalWrite(D5, LOW);
digitalWrite(D4, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D2, HIGH); // 1 - display on
digitalWrite(D1, LOW); // 1 - cursor on
digitalWrite(D0, LOW); // 0 - blink off, 1 - blink on
enable();
// Entry mode set
digitalWrite(D7, LOW);
digitalWrite(D6, LOW);
digitalWrite(D5, LOW);
digitalWrite(D4, LOW);
digitalWrite(D3, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D1, LOW); // 0 = decrement, 1 = increment
digitalWrite(D0, LOW); // 1 = accompanies display shift
enable();
clearDisplay();
digitalWrite(RS, HIGH);
clearDataBus();
}
void writeChar(char c)
{
// array to hold binary representation of the ASCII code
int bit[8];
// Convert ASCII code to binary
for (int i = 0; i < 8; i++)
{
bit[i] = c % 2;
c = c / 2;
}
// Write bits to display
digitalWrite(D7, bit[7]);
digitalWrite(D6, bit[6]);
digitalWrite(D5, bit[5]);
digitalWrite(D4, bit[4]);
digitalWrite(D3, bit[3]);
digitalWrite(D2, bit[2]);
digitalWrite(D1, bit[1]);
digitalWrite(D0, bit[0]);
// Toggle enable bit
enable();
cursorPosition++;
clearDataBus();
}
void writeString(const char* str)
{ // If the text is longer than one row, than it's divided to the second one
if (strlen(str) > 16) {
for (int i = 0; i < 16; i++)
{
writeChar(str[i]);
}
setCursor(1, 0);
for (int i = 16; i < strlen(str); i++)
{
writeChar(str[i]);
}
} else {
for (int i = 0; i < strlen(str); i++)
{
writeChar(str[i]);
}
}
}
void enable()
{
// Cycle enable bit to send
digitalWrite(E, HIGH);
digitalWrite(E, LOW);
}
void clearDisplay()
{
clearDataBus();
digitalWrite(RS, LOW);
digitalWrite(D0, HIGH);
enable();
clearDataBus();
digitalWrite(RS, HIGH);
cursorPosition = 0;
}
void shiftCursor(uint8_t shiftRight)
{
clearDataBus();
digitalWrite(RS, LOW);
digitalWrite(D7, LOW);
digitalWrite(D6, LOW);
digitalWrite(D5, LOW);
digitalWrite(D4, HIGH);
digitalWrite(D3, LOW); // 0 = cursor move, 1 = display shift
digitalWrite(D2, shiftRight); // 0 = shift left, 1 = shift right
digitalWrite(D1, LOW);
digitalWrite(D0, LOW);
enable();
if (shiftRight)
{
cursorPosition++;
}
else
{
cursorPosition--;
}
clearDataBus();
digitalWrite(RS, HIGH);
}
void setRow(uint8_t row)
{
clearDataBus();
if (row == 1)
{
for (int i = cursorPosition; i < 40; i++)
{
shiftCursor(true);
}
}
else if (row == 0)
{
for (int i = cursorPosition; i >= 0; i--)
{
shiftCursor(false);
}
}
else
{
return;
}
}
void setCursor(uint8_t row, uint8_t col)
{
uint8_t position = col;
if (row >= 1)
{
position += 40;
}
while (cursorPosition != position)
{
if (cursorPosition < position)
{
shiftCursor(RIGHT);
}
else
{
shiftCursor(LEFT);
}
}
}
void clearDataBus()
{
for (int i = 0; i < 8; i++)
{
digitalWrite(i, LOW);
}
}
void loop()
{
/* This is just a blink program except it
modifyes the registers rather than using
digitalWrite() */
// Enable LED
*((uint8_t*)0x25) = 0b00100000;
delay(500);
// Disable LED
*((uint8_t*)0x25) = 0b00000000;
delay(500);
}
// made by: pio200