| 1 | #include <proxmark3.h>\r |
| 2 | #include "apps.h"\r |
| 3 | #include "LCD.h"\r |
| 4 | \r |
| 5 | void LCDSend(unsigned int data)\r |
| 6 | {\r |
| 7 | // 9th bit set for data, clear for command\r |
| 8 | while ((SPI_STATUS & SPI_STATUS_TX_EMPTY) == 0); // wait for the transfer to complete\r |
| 9 | // For clarity's sake we pass data with 9th bit clear and commands with 9th\r |
| 10 | // bit set since they're implemented as defines, se we need to invert bit\r |
| 11 | SPI_TX_DATA = data^0x100; // Send the data/command\r |
| 12 | }\r |
| 13 | \r |
| 14 | void LCDSetXY(unsigned char x, unsigned char y)\r |
| 15 | {\r |
| 16 | LCDSend(PPASET); // page start/end ram\r |
| 17 | LCDSend(y); // Start Page to display to\r |
| 18 | LCDSend(131); // End Page to display to\r |
| 19 | \r |
| 20 | LCDSend(PCASET); // column start/end ram\r |
| 21 | LCDSend(x); // Start Column to display to\r |
| 22 | LCDSend(131); // End Column to display to\r |
| 23 | }\r |
| 24 | \r |
| 25 | void LCDSetPixel(unsigned char x, unsigned char y, unsigned char color)\r |
| 26 | {\r |
| 27 | LCDSetXY(x,y); // Set position\r |
| 28 | LCDSend(PRAMWR); // Now write the pixel to the display\r |
| 29 | LCDSend(color); // Write the data in the specified Color\r |
| 30 | }\r |
| 31 | \r |
| 32 | void LCDFill (unsigned char xs,unsigned char ys,unsigned char width,unsigned char height, unsigned char color)\r |
| 33 | {\r |
| 34 | unsigned char i,j;\r |
| 35 | \r |
| 36 | for (i=0;i < height;i++) // Number of horizontal lines\r |
| 37 | {\r |
| 38 | LCDSetXY(xs,ys+i); // Goto start of fill area (Top Left)\r |
| 39 | LCDSend(PRAMWR); // Write to display\r |
| 40 | \r |
| 41 | for (j=0;j < width;j++) // pixels per line\r |
| 42 | LCDSend(color);\r |
| 43 | }\r |
| 44 | }\r |
| 45 | \r |
| 46 | void LCDString (char *lcd_string, const char *font_style,unsigned char x, unsigned char y, unsigned char fcolor, unsigned char bcolor)\r |
| 47 | {\r |
| 48 | unsigned int i;\r |
| 49 | unsigned char mask=0, px, py, xme, yme, offset;\r |
| 50 | const char *data;\r |
| 51 | \r |
| 52 | data = font_style; // point to the start of the font table\r |
| 53 | \r |
| 54 | xme = *data; // get font x width\r |
| 55 | data++;\r |
| 56 | yme = *data; // get font y length\r |
| 57 | data++;\r |
| 58 | offset = *data; // get data bytes per font\r |
| 59 | \r |
| 60 | do\r |
| 61 | {\r |
| 62 | // point to data in table to be loaded\r |
| 63 | data = (font_style + offset) + (offset * (int)(*lcd_string - 32));\r |
| 64 | \r |
| 65 | for (i=0;i < yme;i++) {\r |
| 66 | mask |=0x80;\r |
| 67 | \r |
| 68 | for (px=x; px < (x + xme); px++) {\r |
| 69 | py= y + i;\r |
| 70 | \r |
| 71 | if (*data & mask) LCDSetPixel (px,py,fcolor);\r |
| 72 | else LCDSetPixel (px,py,bcolor);\r |
| 73 | \r |
| 74 | mask>>=1;\r |
| 75 | }\r |
| 76 | data++;\r |
| 77 | }\r |
| 78 | x+=xme;\r |
| 79 | \r |
| 80 | lcd_string++; // next character in string\r |
| 81 | \r |
| 82 | } while(*lcd_string !='\0'); // keep spitting chars out until end of string\r |
| 83 | }\r |
| 84 | \r |
| 85 | void LCDReset(void)\r |
| 86 | {\r |
| 87 | LED_A_ON();\r |
| 88 | SetupSpi(SPI_LCD_MODE);\r |
| 89 | LCD_RESET_LOW();\r |
| 90 | SpinDelay(100);\r |
| 91 | \r |
| 92 | LCD_RESET_HIGH();\r |
| 93 | SpinDelay(100);\r |
| 94 | LED_A_OFF();\r |
| 95 | }\r |
| 96 | \r |
| 97 | void LCDInit(void)\r |
| 98 | {\r |
| 99 | int i;\r |
| 100 | \r |
| 101 | LCDReset();\r |
| 102 | \r |
| 103 | LCDSend(PSWRESET); // software reset\r |
| 104 | SpinDelay(100);\r |
| 105 | LCDSend(PSLEEPOUT); // exit sleep mode\r |
| 106 | LCDSend(PBSTRON); // booster on\r |
| 107 | LCDSend(PDISPON); // display on\r |
| 108 | LCDSend(PNORON); // normal on\r |
| 109 | LCDSend(PMADCTL); // rotate display 180 deg\r |
| 110 | LCDSend(0xC0);\r |
| 111 | \r |
| 112 | LCDSend(PCOLMOD); // color mode\r |
| 113 | LCDSend(0x02); // 8bpp color mode\r |
| 114 | \r |
| 115 | LCDSend(PSETCON); // set contrast\r |
| 116 | LCDSend(0xDC);\r |
| 117 | \r |
| 118 | // clear display\r |
| 119 | LCDSetXY(0,0);\r |
| 120 | LCDSend(PRAMWR); // Write to display\r |
| 121 | i=LCD_XRES*LCD_YRES;\r |
| 122 | while(i--) LCDSend(WHITE);\r |
| 123 | }\r |