]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/LCD.c
Initial commit for the firmware. Used the 20090306_ela version as baseline.
[proxmark3-svn] / armsrc / LCD.c
diff --git a/armsrc/LCD.c b/armsrc/LCD.c
new file mode 100644 (file)
index 0000000..02c2f69
--- /dev/null
@@ -0,0 +1,123 @@
+#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
Impressum, Datenschutz