iRisc / Demo / spi_lcd.h
spi_lcd.h
Raw
#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);
}