#define HIGH 1
#define LOW 0
//#include <stdio.h>
//void DEV_WRITE(volatile uint32_t addr, volatile uint32_t val) {
/*
printf("%X\n", val);
int i;
for (i = 0; i < 32; i++) {
volatile uint32_t num = val << i;
printf("%i", (num & 0x80000000) >> 31);
if (i%4 == 3 && i != 31) printf("_");
}
printf("\n\n");
*/
// *((volatile uint32_t *)(addr)) = val;
//}
volatile uint32_t SPIbuff;
volatile uint8_t displaycontrol;
void delay2(int n) {
volatile int i;
for (i = 0; i < n * 1000; i++) {}
}
void spi_write(volatile uint32_t cmd, volatile uint8_t DELAY){
/*printf("%X\n", cmd);
int i;
for (i = 0; i < 32; i++) {
volatile uint32_t num = cmd << i;
printf("%i", (num & 0x80000000) >> 31);
if (i%4 == 3 && i != 31) printf("_");
}
printf("\n\n");
*/
DEV_WRITE(REG_SPICMD, cmd); //8 bits of CMD we want to send to LCD
DEV_WRITE(REG_SPIADR, cmd); //8 bits of ADDR we want to send to LCD
DEV_WRITE(REG_TXFIFO, cmd);
DEV_WRITE(REG_STATUS, 0x00000102); //Enable the clk to peripheral (SPI clk). Bit [1] set to enable spi_wr mode, and bit [8] set to chip select LCD.
delay2(DELAY);
}
void lcd_init(volatile uint8_t DELAY) {
DEV_WRITE(REG_SPILEN, 0x00080808); //Setting length of DATA, ADDR, CMD
DEV_WRITE(REG_CLKDIV, 0x000000AA); //Setting clock divider factor = 10
spi_write(0x80000000, DELAY); //_digitalWrite(_rs_pin, LOW); Line 188, Adafruit_LiquidCrystal.cpp
spi_write(0x80000000, DELAY); //_digitalWrite(_enable_pin, LOW); Line 189, Adafruit_LiquidCrystal.cpp
//write4bits(0x03); Line 200, Adafruit_LiquidCrystal.cpp
spi_write(0xC0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE4000000, DELAY);
spi_write(0xE0000000, DELAY);
//delayMicroseconds(4500); Line 201, Adafruit_LiquidCrystal.cpp
delay2(100);
//write4bits(0x03); Line 204, Adafruit_LiquidCrystal.cpp
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE4000000, DELAY);
spi_write(0xE0000000, DELAY);
//delayMicroseconds(4500); Line 205, Adafruit_LiquidCrystal.cpp
delay2(100);
//write4bits(0x03); Line 208, Adafruit_LiquidCrystal.cpp
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE0000000, DELAY);
spi_write(0xE4000000, DELAY);
spi_write(0xE0000000, DELAY);
//delayMicroseconds(150); Line 209. Delay given below (1000) is more than required, can be changed
delay2(1000);
//write4bits(0x02); Line 212, Adafruit_LiquidCrystal.cpp
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA4000000, DELAY);
spi_write(0xA0000000, DELAY);
delay2(100); //Needed???
//command(LCD_FUNCTIONSET | _displayfunction); Line 230, Adafruit_LiquidCrystal.cpp
//LCD_FUNCTIONSET | _displayfunction evalutaes to 0x28
spi_write(0xA0000000, DELAY); //_digitalWrite(_rs_pin, mode); Line 401, Adafruit_LiquidCrystal.cpp
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA4000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x88000000, DELAY);
spi_write(0x88000000, DELAY);
spi_write(0x8C000000, DELAY);
spi_write(0x88000000, DELAY);
//display(); Line 234, Adafruit_LiquidCrystal.cpp
spi_write(0x88000000, DELAY); //_digitalWrite(_rs_pin, mode); Line 401, Adafruit_LiquidCrystal.cpp
spi_write(0x88000000, DELAY);
spi_write(0x88000000, DELAY);
spi_write(0x88000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x84000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x90000000, DELAY);
spi_write(0x98000000, DELAY);
spi_write(0x98000000, DELAY);
spi_write(0x9C000000, DELAY);
spi_write(0x98000000, DELAY);
//clear(); Line 237, Adafruit_LiquidCrystal.cpp
spi_write(0x98000000, DELAY); //_digitalWrite(_rs_pin, mode); Line 401, Adafruit_LiquidCrystal.cpp
spi_write(0x98000000, DELAY);
spi_write(0x98000000, DELAY);
spi_write(0x88000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x84000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0xC0000000, DELAY);
spi_write(0xC0000000, DELAY);
spi_write(0xC0000000, DELAY);
spi_write(0xC0000000, DELAY);
spi_write(0xC0000000, DELAY);
spi_write(0xC4000000, DELAY);
spi_write(0xC0000000, DELAY);
delay2(100); //delayMicroseconds(2000); Line 250, Adafruit_LiquidCrystal.cpp
//command(LCD_ENTRYMODESET | _displaymode); Line 242, Adafruit_LiquidCrystal.cpp
spi_write(0xC0000000, DELAY); //_digitalWrite(_rs_pin, mode); Line 401, Adafruit_LiquidCrystal.cpp
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x84000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0x80000000, DELAY);
spi_write(0xA0000000, DELAY);
spi_write(0xB0000000, DELAY);
spi_write(0xB0000000, DELAY);
spi_write(0xB0000000, DELAY);
spi_write(0xB4000000, DELAY);
spi_write(0xB0000000, DELAY);
SPIbuff = 0x000000B0;
displaycontrol = 0x04;
//uint32_t cmd = 0xB2000000;
// spi_write(cmd); //_digitalWrite(_rs_pin, mode); Line 401, Adafruit_LiquidCrystal.cpp, this command is called once per character sent
//cmd = 0xB2000000;
// spi_write(cmd); //write4bits(value >> 4); Line 411, Adafruit_LiquidCrystal.cpp
//cmd = 0x92000000;
// spi_write(cmd);
//cmd = 0x92000000;
// spi_write(cmd);
//cmd = 0x92000000;
// spi_write(cmd);
//cmd = 0x92000000;
// spi_write(cmd);
//cmd = 0x96000000;
// spi_write(cmd);
//cmd = 0x92000000;
// spi_write(cmd);
//cmd = 0x92000000;
// spi_write(cmd); //write4bits(value); Line 412, Adafruit_LiquidCrystal.cpp
//cmd = 0x92000000;
// spi_write(cmd);
//cmd = 0x82000000;
// spi_write(cmd);
//cmd = 0x8A000000;
// spi_write(cmd);
//cmd = 0x8A000000;
// spi_write(cmd);
//cmd = 0x8E000000;
// spi_write(cmd);
//cmd = 0x8A000000;
// spi_write(cmd);
//printf("Buff is: %X\n", SPIbuff);
}
void digitalWrite(volatile uint8_t p, volatile uint8_t d, volatile uint8_t DELAY) {
volatile uint32_t mask = 0xFF000000;
if (d == HIGH)
SPIbuff |= (1 << p);
else
SPIbuff &= ~(1 << p);
//printf("Buff is: %X\n", SPIbuff);
volatile uint32_t word = mask & (SPIbuff << 24);
spi_write(word, DELAY);
}
void lcd_write(volatile uint8_t character, volatile uint8_t mode, volatile uint8_t DELAY) {
// Implementing "send" function
digitalWrite((uint8_t) 1, mode, DELAY);
digitalWrite((uint8_t) 6, (uint8_t) ((character >> 4) & 0x01), DELAY);
digitalWrite((uint8_t) 5, (uint8_t) ((character >> 5) & 0x01), DELAY);
digitalWrite((uint8_t) 4, (uint8_t) ((character >> 6) & 0x01), DELAY);
digitalWrite((uint8_t) 3, (uint8_t) ((character >> 7) & 0x01), DELAY);
digitalWrite((uint8_t) 2, (uint8_t) LOW, DELAY);
digitalWrite((uint8_t) 2, (uint8_t) HIGH, DELAY);
digitalWrite((uint8_t) 2, (uint8_t) LOW, DELAY);
digitalWrite((uint8_t) 6, (uint8_t) ((character >> 0) & 0x01), DELAY);
digitalWrite((uint8_t) 5, (uint8_t) ((character >> 1) & 0x01), DELAY);
digitalWrite((uint8_t) 4, (uint8_t) ((character >> 2) & 0x01), DELAY);
digitalWrite((uint8_t) 3, (uint8_t) ((character >> 3) & 0x01), DELAY);
digitalWrite((uint8_t) 2, (uint8_t) LOW, DELAY);
digitalWrite((uint8_t) 2, (uint8_t) HIGH, DELAY);
digitalWrite((uint8_t) 2, (uint8_t) LOW, DELAY);
//printf("\n");
}
void lcd_print(volatile char *string, volatile uint8_t DELAY) {
volatile int i = 0;
while (string[i] != '\n') {
//printf("Character: %c\n", string[i]);
lcd_write((uint8_t) string[i], (uint8_t) HIGH, DELAY);
i++;
}
}
void clear() { // VERIFIED
lcd_write((uint8_t) 0x01, (uint8_t) LOW, 1);
delay2(100);
}
void home() {
lcd_write((uint8_t) 0x02, (uint8_t) LOW, 1);
delay2(100);
}
void setCursor(volatile uint8_t col, volatile uint8_t row, volatile uint8_t DELAY) {
if (row == 0)
lcd_write((uint8_t) (0x80 | (col + 0x00)), (uint8_t) LOW, DELAY);
else if (row == 1)
lcd_write((uint8_t) (0x80 | (col + 0x40)), (uint8_t) LOW, DELAY);
else if (row == 2)
lcd_write((uint8_t) (0x80 | (col + 0x14)), (uint8_t) LOW, DELAY);
else
lcd_write((uint8_t) (0x80 | (col + 0x54)), (uint8_t) LOW, DELAY);
}
void noDisplay() {
displaycontrol = 0x00;
lcd_write((uint8_t) 0x08, (uint8_t) LOW, 1);
}
void display() {
displaycontrol = 0x04;
lcd_write((uint8_t) 0x0C, (uint8_t) LOW, 1);
}
void noCursor() {
displaycontrol &= ~(0x02);
lcd_write((uint8_t) (0x08 | displaycontrol), (uint8_t) LOW, 1);
}
void cursor() {
displaycontrol |= 0x02;
lcd_write((uint8_t) (0x08 | displaycontrol), (uint8_t) LOW, 1);
}
void noBlink() {
displaycontrol &= ~(0x01);
lcd_write((uint8_t) (0x08 | displaycontrol), (uint8_t) LOW, 1);
}
void blink() {
displaycontrol |= 0x01;
lcd_write((uint8_t) (0x08 | displaycontrol), (uint8_t) LOW, 1);
}
void scrollDisplayLeft() {
lcd_write((uint8_t) 0x18, (uint8_t) LOW, 1);
}
void scrollDisplayRight() {
lcd_write((uint8_t) 0x1C, (uint8_t) LOW, 1);
}
//void leftToRight() {
// lcd_write(, (uint8_t) LOW);
//}
//void rightToLeft() {
// lcd_write(, (uint8_t) LOW);
//}
//void autoscroll() {
// lcd_write(, (uint8_t) LOW);
//}
//void noAutoscroll() {
// lcd_write(, (uint8_t) LOW);
//}
//void createChar() {
// lcd_write(, (uint8_t) LOW);
//}
void setBacklight (uint8_t value) {
digitalWrite((uint8_t) 0x07, value, 1);
}