--- /dev/null
+#include <proxmark3.h>\r
+#include "apps.h"\r
+#include "LCD.h"\r
+\r
+void LCDSend(unsigned int data)\r
+{\r
+ // 9th bit set for data, clear for command\r
+ while ((SPI_STATUS & SPI_STATUS_TX_EMPTY) == 0); // wait for the transfer to complete\r
+ // For clarity's sake we pass data with 9th bit clear and commands with 9th\r
+ // bit set since they're implemented as defines, se we need to invert bit\r
+ SPI_TX_DATA = data^0x100; // Send the data/command\r
+}\r
+\r
+void LCDSetXY(unsigned char x, unsigned char y)\r
+{\r
+ LCDSend(PPASET); // page start/end ram\r
+ LCDSend(y); // Start Page to display to\r
+ LCDSend(131); // End Page to display to\r
+\r
+ LCDSend(PCASET); // column start/end ram\r
+ LCDSend(x); // Start Column to display to\r
+ LCDSend(131); // End Column to display to\r
+}\r
+\r
+void LCDSetPixel(unsigned char x, unsigned char y, unsigned char color)\r
+{\r
+ LCDSetXY(x,y); // Set position\r
+ LCDSend(PRAMWR); // Now write the pixel to the display\r
+ LCDSend(color); // Write the data in the specified Color\r
+}\r
+\r
+void LCDFill (unsigned char xs,unsigned char ys,unsigned char width,unsigned char height, unsigned char color)\r
+{\r
+ unsigned char i,j;\r
+\r
+ for (i=0;i < height;i++) // Number of horizontal lines\r
+ {\r
+ LCDSetXY(xs,ys+i); // Goto start of fill area (Top Left)\r
+ LCDSend(PRAMWR); // Write to display\r
+\r
+ for (j=0;j < width;j++) // pixels per line\r
+ LCDSend(color);\r
+ }\r
+}\r
+\r
+void LCDString (char *lcd_string, const char *font_style,unsigned char x, unsigned char y, unsigned char fcolor, unsigned char bcolor)\r
+{\r
+ unsigned int i;\r
+ unsigned char mask=0, px, py, xme, yme, offset;\r
+ const char *data;\r
+\r
+ data = font_style; // point to the start of the font table\r
+\r
+ xme = *data; // get font x width\r
+ data++;\r
+ yme = *data; // get font y length\r
+ data++;\r
+ offset = *data; // get data bytes per font\r
+\r
+ do\r
+ {\r
+ // point to data in table to be loaded\r
+ data = (font_style + offset) + (offset * (int)(*lcd_string - 32));\r
+\r
+ for (i=0;i < yme;i++) {\r
+ mask |=0x80;\r
+\r
+ for (px=x; px < (x + xme); px++) {\r
+ py= y + i;\r
+\r
+ if (*data & mask) LCDSetPixel (px,py,fcolor);\r
+ else LCDSetPixel (px,py,bcolor);\r
+\r
+ mask>>=1;\r
+ }\r
+ data++;\r
+ }\r
+ x+=xme;\r
+\r
+ lcd_string++; // next character in string\r
+\r
+ } while(*lcd_string !='\0'); // keep spitting chars out until end of string\r
+}\r
+\r
+void LCDReset(void)\r
+{\r
+ LED_A_ON();\r
+ SetupSpi(SPI_LCD_MODE);\r
+ LCD_RESET_LOW();\r
+ SpinDelay(100);\r
+\r
+ LCD_RESET_HIGH();\r
+ SpinDelay(100);\r
+ LED_A_OFF();\r
+}\r
+\r
+void LCDInit(void)\r
+{\r
+ int i;\r
+\r
+ LCDReset();\r
+\r
+ LCDSend(PSWRESET); // software reset\r
+ SpinDelay(100);\r
+ LCDSend(PSLEEPOUT); // exit sleep mode\r
+ LCDSend(PBSTRON); // booster on\r
+ LCDSend(PDISPON); // display on\r
+ LCDSend(PNORON); // normal on\r
+ LCDSend(PMADCTL); // rotate display 180 deg\r
+ LCDSend(0xC0);\r
+\r
+ LCDSend(PCOLMOD); // color mode\r
+ LCDSend(0x02); // 8bpp color mode\r
+\r
+ LCDSend(PSETCON); // set contrast\r
+ LCDSend(0xDC);\r
+ \r
+ // clear display\r
+ LCDSetXY(0,0);\r
+ LCDSend(PRAMWR); // Write to display\r
+ i=LCD_XRES*LCD_YRES;\r
+ while(i--) LCDSend(WHITE);\r
+}\r