大理水控初始版本
diff --git a/lcd/Bebas_Neue18x36_Numbers.h b/lcd/Bebas_Neue18x36_Numbers.h
new file mode 100644
index 0000000..5a975b2
--- /dev/null
+++ b/lcd/Bebas_Neue18x36_Numbers.h
@@ -0,0 +1,42 @@
+/*
+ * Bebas_Neue18x36_Numberes.h
+ *
+ * Created: 30/03/2012 1:54:32 AM
+ * Author: andy
+ */
+
+
+#ifndef BEBAS_NEUE18X36_NUMBERS_H_
+#define BEBAS_NEUE18X36_NUMBERS_H_
+
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Bebas_Neue18x36
+//GLCD FontSize : 18 x 36
+
+static const char Bebas_Neue18x36_Numbers[] PROGMEM = {
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char .
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, // Code for char /
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x3F, 0x00, 0x00, 0xC0, 0x0F, 0x1F, 0x00, 0x00, 0x80, 0x0F, 0x1F, 0x00, 0x00, 0x80, 0x0F, 0x1F, 0x00, 0x00, 0x80, 0x0F, 0x3F, 0x00, 0x00, 0xC0, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 0
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 1
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x07, 0xF8, 0x0F, 0x00, 0xFE, 0x07, 0xFC, 0x0F, 0x00, 0xFF, 0x07, 0xFE, 0x0F, 0xC0, 0xFF, 0x07, 0xFE, 0x0F, 0xE0, 0xFF, 0x07, 0x3E, 0x00, 0xF0, 0xCF, 0x07, 0x1F, 0x00, 0xF8, 0xC3, 0x07, 0x1F, 0x00, 0xFE, 0xC1, 0x07, 0x1F, 0x00, 0x7F, 0xC0, 0x07, 0x1F, 0x80, 0x3F, 0xC0, 0x07, 0x3F, 0xF0, 0x1F, 0xC0, 0x07, 0xFE, 0xFF, 0x0F, 0xC0, 0x07, 0xFE, 0xFF, 0x03, 0xC0, 0x07, 0xFC, 0xFF, 0x01, 0xC0, 0x07, 0xF8, 0x7F, 0x00, 0xC0, 0x07, 0xE0, 0x0F, 0x00, 0x00, 0x00, // Code for char 2
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x7F, 0x00, 0xF8, 0x07, 0x00, 0xFF, 0x01, 0xFC, 0x07, 0x00, 0xFF, 0x03, 0xFE, 0x07, 0x00, 0xFF, 0x07, 0xFE, 0x07, 0x00, 0xFF, 0x07, 0x3F, 0x80, 0x0F, 0xC0, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x3F, 0xC0, 0x1F, 0xC0, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFD, 0xFF, 0x03, 0xF8, 0xFF, 0xF8, 0xFF, 0x01, 0xE0, 0x1F, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 3
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x3F, 0x1F, 0x00, 0x00, 0xFF, 0x0F, 0x1F, 0x00, 0xC0, 0xFF, 0x03, 0x1F, 0x00, 0xF0, 0x7F, 0x00, 0x1F, 0x00, 0xFE, 0x1F, 0x00, 0x1F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, // Code for char 4
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x7E, 0x00, 0xFE, 0xFF, 0x1F, 0xFE, 0x01, 0xFE, 0xFF, 0x1F, 0xFE, 0x03, 0xFE, 0xFF, 0x1F, 0xFE, 0x07, 0xFE, 0xFF, 0x1F, 0xFE, 0x07, 0xFE, 0xC7, 0x03, 0xC0, 0x0F, 0x3E, 0xE0, 0x01, 0x80, 0x0F, 0x3E, 0xE0, 0x01, 0x80, 0x0F, 0x3E, 0xF0, 0x01, 0x80, 0x0F, 0x3E, 0xF0, 0x03, 0xC0, 0x0F, 0x3E, 0xF0, 0xFF, 0xFF, 0x07, 0x3E, 0xE0, 0xFF, 0xFF, 0x07, 0x3E, 0xE0, 0xFF, 0xFF, 0x03, 0x3E, 0xC0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 5
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x3E, 0x80, 0x07, 0xC0, 0x0F, 0x1F, 0xC0, 0x03, 0x80, 0x0F, 0x1F, 0xC0, 0x03, 0x80, 0x0F, 0x1F, 0xE0, 0x03, 0x80, 0x0F, 0x3F, 0xE0, 0x07, 0xC0, 0x0F, 0x3E, 0xE0, 0xFF, 0xFF, 0x07, 0xFE, 0xC3, 0xFF, 0xFF, 0x07, 0xFE, 0xC3, 0xFF, 0xFF, 0x03, 0xFC, 0x83, 0xFF, 0xFF, 0x01, 0xF8, 0x03, 0xFE, 0x7F, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, // Code for char 6
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x3E, 0x00, 0x00, 0xE0, 0x07, 0x3E, 0x00, 0x00, 0xFE, 0x07, 0x3E, 0x00, 0xE0, 0xFF, 0x07, 0x3E, 0x00, 0xFC, 0xFF, 0x07, 0x3E, 0xC0, 0xFF, 0xFF, 0x03, 0x3E, 0xFC, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, // Code for char 7
+ 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0xC0, 0x3F, 0x00, 0xF8, 0x7F, 0xF8, 0xFF, 0x01, 0xFC, 0xFF, 0xFD, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x7E, 0xC0, 0x3F, 0xC0, 0x07, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x7E, 0xC0, 0x3F, 0xE0, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFD, 0xFF, 0x03, 0xF8, 0x7F, 0xF8, 0xFF, 0x01, 0xC0, 0x1F, 0xC0, 0x3F, 0x00, // Code for char 8
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0x07, 0xFC, 0x01, 0xF8, 0xFF, 0x1F, 0xFC, 0x03, 0xFC, 0xFF, 0x3F, 0xFC, 0x07, 0xFE, 0xFF, 0x3F, 0xFC, 0x07, 0xFE, 0xFF, 0x7F, 0xC0, 0x07, 0x3F, 0x00, 0x7E, 0xC0, 0x0F, 0x1F, 0x00, 0x7C, 0x80, 0x0F, 0x1F, 0x00, 0x3C, 0x80, 0x0F, 0x1F, 0x00, 0x3C, 0x80, 0x0F, 0x3F, 0x00, 0x1E, 0xC0, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Code for char 9
+ };
+
+
+
+
+
+#endif /* BEBAS_NEUE18X36_NUMBERES_H_ */
diff --git a/lcd/Bebas_Neue20x36_Bold_Numbers.h b/lcd/Bebas_Neue20x36_Bold_Numbers.h
new file mode 100644
index 0000000..63916c5
--- /dev/null
+++ b/lcd/Bebas_Neue20x36_Bold_Numbers.h
@@ -0,0 +1,42 @@
+/*
+ * Bebas_Neue20x36_Numbers.h
+ *
+ * Created: 30/03/2012 1:51:48 AM
+ * Author: andy
+ */
+
+
+#ifndef BEBAS_NEUE20X36_BOLD_NUMBERS_H_
+#define BEBAS_NEUE20X36_BOLD_NUMBERS_H_
+
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Bebas_Neue20x36
+//GLCD FontSize : 20 x 36
+
+static const char Bebas_Neue20x36_Bold_Numbers[] PROGMEM = {
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char .
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, // Code for char /
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x3F, 0x00, 0x00, 0xC0, 0x0F, 0x1F, 0x00, 0x00, 0x80, 0x0F, 0x3F, 0x00, 0x00, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 0
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 1
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x07, 0xF8, 0x0F, 0x00, 0xFE, 0x07, 0xFC, 0x0F, 0x00, 0xFF, 0x07, 0xFE, 0x0F, 0xC0, 0xFF, 0x07, 0xFE, 0x0F, 0xE0, 0xFF, 0x07, 0xFE, 0x0F, 0xF0, 0xFF, 0x07, 0xFF, 0x0F, 0xF8, 0xFF, 0x07, 0x3F, 0x00, 0xFE, 0xCF, 0x07, 0x1F, 0x00, 0xFF, 0xC3, 0x07, 0x1F, 0x80, 0xFF, 0xC1, 0x07, 0x3F, 0xF0, 0x7F, 0xC0, 0x07, 0xFF, 0xFF, 0x3F, 0xC0, 0x07, 0xFF, 0xFF, 0x1F, 0xC0, 0x07, 0xFE, 0xFF, 0x0F, 0xC0, 0x07, 0xFE, 0xFF, 0x03, 0xC0, 0x07, 0xFC, 0xFF, 0x01, 0xC0, 0x07, 0xF8, 0x7F, 0x00, 0xC0, 0x07, 0xE0, 0x0F, 0x00, 0x00, 0x00, // Code for char 2
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x7F, 0x00, 0xF8, 0x07, 0x00, 0xFF, 0x01, 0xFC, 0x07, 0x00, 0xFF, 0x03, 0xFE, 0x07, 0x00, 0xFF, 0x07, 0xFE, 0x07, 0x00, 0xFF, 0x07, 0xFF, 0x87, 0x0F, 0xFF, 0x0F, 0xFF, 0x87, 0x0F, 0xFF, 0x0F, 0x3F, 0x80, 0x0F, 0xC0, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x3F, 0xC0, 0x1F, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFD, 0xFF, 0x03, 0xF8, 0xFF, 0xF8, 0xFF, 0x01, 0xE0, 0x1F, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 3
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0xC0, 0xFF, 0x3F, 0x1F, 0x00, 0xF0, 0xFF, 0x0F, 0x1F, 0x00, 0xFE, 0xFF, 0x03, 0x1F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, // Code for char 4
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x7E, 0x00, 0xFE, 0xFF, 0x1F, 0xFE, 0x01, 0xFE, 0xFF, 0x1F, 0xFE, 0x03, 0xFE, 0xFF, 0x1F, 0xFE, 0x07, 0xFE, 0xFF, 0x1F, 0xFE, 0x07, 0xFE, 0xFF, 0x1F, 0xFE, 0x0F, 0xFE, 0xFF, 0x1F, 0xFE, 0x0F, 0xFE, 0xE7, 0x03, 0xC0, 0x0F, 0x3E, 0xF0, 0x01, 0x80, 0x0F, 0x3E, 0xF0, 0x03, 0xC0, 0x0F, 0x3E, 0xF0, 0xFF, 0xFF, 0x0F, 0x3E, 0xF0, 0xFF, 0xFF, 0x0F, 0x3E, 0xF0, 0xFF, 0xFF, 0x07, 0x3E, 0xE0, 0xFF, 0xFF, 0x07, 0x3E, 0xE0, 0xFF, 0xFF, 0x03, 0x3E, 0xC0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 5
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x3F, 0xC0, 0x07, 0xC0, 0x0F, 0x1F, 0xE0, 0x03, 0x80, 0x0F, 0x3F, 0xE0, 0x07, 0xC0, 0x0F, 0x3F, 0xE0, 0xFF, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xFE, 0xE3, 0xFF, 0xFF, 0x07, 0xFE, 0xC3, 0xFF, 0xFF, 0x07, 0xFE, 0xC3, 0xFF, 0xFF, 0x03, 0xFC, 0x83, 0xFF, 0xFF, 0x01, 0xF8, 0x03, 0xFE, 0x7F, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, // Code for char 6
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x3E, 0x00, 0x00, 0xE0, 0x07, 0x3E, 0x00, 0x00, 0xFE, 0x07, 0x3E, 0x00, 0xE0, 0xFF, 0x07, 0x3E, 0x00, 0xFC, 0xFF, 0x07, 0x3E, 0xC0, 0xFF, 0xFF, 0x07, 0x3E, 0xFC, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0xFE, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, // Code for char 7
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0xC0, 0x3F, 0x00, 0xF8, 0x7F, 0xF8, 0xFF, 0x01, 0xFC, 0xFF, 0xFD, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x7F, 0xC0, 0x3F, 0xC0, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0x7F, 0xC0, 0x3F, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFD, 0xFF, 0x03, 0xF8, 0x7F, 0xF8, 0xFF, 0x01, 0xC0, 0x1F, 0xC0, 0x3F, 0x00, // Code for char 8
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xE0, 0xFF, 0x07, 0xFC, 0x01, 0xF8, 0xFF, 0x1F, 0xFC, 0x03, 0xFC, 0xFF, 0x3F, 0xFC, 0x07, 0xFE, 0xFF, 0x3F, 0xFC, 0x07, 0xFE, 0xFF, 0x7F, 0xFC, 0x07, 0xFF, 0xFF, 0x7F, 0xFC, 0x0F, 0xFF, 0xFF, 0x7F, 0xC0, 0x0F, 0x3F, 0x00, 0x7E, 0xC0, 0x0F, 0x1F, 0x00, 0x7C, 0x80, 0x0F, 0x3F, 0x00, 0x3E, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Code for char 9
+ };
+
+
+
+
+
+#endif /* BEBAS_NEUE20X36_NUMBERS_H_ */
diff --git a/lcd/Earthbound_12x19_48to57.h b/lcd/Earthbound_12x19_48to57.h
new file mode 100644
index 0000000..37d1744
--- /dev/null
+++ b/lcd/Earthbound_12x19_48to57.h
@@ -0,0 +1,19 @@
+#ifndef Earthbound_12x19_48to57_H
+#define Earthbound_12x19_48to57_H
+
+// Size: 12x19
+// Chars: 48 to 57
+static const char font_Earthbound_12x19_48to57[] PROGMEM = {
+0x00, 0xe0, 0xf0, 0x38, 0x0c, 0x0c, 0x0c, 0x0c, 0x38, 0xf8, 0xc0, 0x00, 0x00, 0x1f, 0x7f, 0xe0, 0x80, 0x80, 0x80, 0x80, 0xe0, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, // Char '0'
+0x00, 0x10, 0x18, 0x18, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Char '1'
+0x00, 0x08, 0x1c, 0x0c, 0x0c, 0x0c, 0x0c, 0x8c, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf8, 0x9c, 0x8c, 0x86, 0x86, 0x83, 0x83, 0x80, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, // Char '2'
+0x00, 0x08, 0x1c, 0x0c, 0x0c, 0x0c, 0x0c, 0x8c, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x80, 0x81, 0x83, 0x83, 0xc7, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, // Char '3'
+0x00, 0x00, 0x00, 0x80, 0xc0, 0x70, 0x38, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1e, 0x1b, 0x11, 0x18, 0x10, 0xff, 0xff, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, // Char '4'
+0x00, 0x00, 0xf4, 0xfc, 0x1c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0x83, 0x83, 0x83, 0x83, 0xc7, 0xfe, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, // Char '5'
+0x00, 0xc0, 0xf0, 0x78, 0x1c, 0x0c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc3, 0x83, 0x83, 0x83, 0xc3, 0xfe, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, // Char '6'
+0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x8c, 0xcc, 0x7c, 0x3c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0x7c, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Char '7'
+0x00, 0xf0, 0xf8, 0x1c, 0x0c, 0x0c, 0x0c, 0x0c, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x8f, 0x07, 0x06, 0x06, 0x8f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, // Char '8'
+0x00, 0xf0, 0xf8, 0x1c, 0x0c, 0x0c, 0x0c, 0x1c, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x87, 0x8e, 0x8c, 0x8c, 0x8c, 0xee, 0x7f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 // Char '9'
+};
+
+#endif
diff --git a/lcd/Liberation_Sans11x14_Numbers.h b/lcd/Liberation_Sans11x14_Numbers.h
new file mode 100644
index 0000000..d2de386
--- /dev/null
+++ b/lcd/Liberation_Sans11x14_Numbers.h
@@ -0,0 +1,42 @@
+/*
+ * Liberation_Sans11x14_Numbers.h
+ *
+ * Created: 30/03/2012 1:31:10 AM
+ * Author: andy
+ */
+
+
+#ifndef LIBERATION_SANS11X14_NUMBERS_H_
+#define LIBERATION_SANS11X14_NUMBERS_H_
+
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Liberation_Sans11x14 46 to 57
+//GLCD FontSize : 11 x 14
+
+static const char Liberation_Sans11x14_Numbers[] PROGMEM = {
+ 0x04, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char .
+ 0x05, 0x00, 0x38, 0x80, 0x3F, 0xFC, 0x0F, 0xFF, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char /
+ 0x0A, 0x00, 0x00, 0xF0, 0x07, 0xFC, 0x1F, 0xFE, 0x3F, 0x0E, 0x38, 0x06, 0x30, 0x0E, 0x38, 0xFE, 0x3F, 0xFC, 0x1F, 0xF0, 0x07, 0x00, 0x00, // Code for char 0
+ 0x0B, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x0C, 0x30, 0x0E, 0x30, 0xFE, 0x3F, 0xFE, 0x3F, 0xFE, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, // Code for char 1
+ 0x0A, 0x00, 0x00, 0x18, 0x38, 0x1C, 0x3C, 0x1E, 0x3E, 0x06, 0x37, 0x86, 0x33, 0xC6, 0x31, 0xFE, 0x31, 0xFC, 0x30, 0x78, 0x30, 0x00, 0x00, // Code for char 2
+ 0x0A, 0x00, 0x00, 0x18, 0x0C, 0x1C, 0x1C, 0x1E, 0x3C, 0xC6, 0x30, 0xC6, 0x30, 0xC6, 0x31, 0xFE, 0x3F, 0xBC, 0x1F, 0x3C, 0x0F, 0x00, 0x00, // Code for char 3
+ 0x0B, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x07, 0xE0, 0x06, 0x38, 0x06, 0x1E, 0x06, 0xFE, 0x3F, 0xFE, 0x3F, 0xFE, 0x3F, 0x00, 0x06, 0x00, 0x06, // Code for char 4
+ 0x0A, 0x00, 0x00, 0xFE, 0x0C, 0xFE, 0x1C, 0xC6, 0x3C, 0x66, 0x38, 0x66, 0x30, 0xE6, 0x38, 0xE6, 0x3F, 0xC6, 0x1F, 0x80, 0x0F, 0x00, 0x00, // Code for char 5
+ 0x0A, 0x00, 0x00, 0xF0, 0x07, 0xFC, 0x1F, 0xFC, 0x3F, 0x8E, 0x38, 0xC6, 0x30, 0xC6, 0x30, 0xCE, 0x3F, 0x8C, 0x1F, 0x08, 0x0F, 0x00, 0x00, // Code for char 6
+ 0x0A, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x38, 0x06, 0x3F, 0xC6, 0x3F, 0xE6, 0x03, 0xFE, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x00, 0x00, // Code for char 7
+ 0x0A, 0x00, 0x00, 0x38, 0x0F, 0xFC, 0x1F, 0xFE, 0x3F, 0xC6, 0x30, 0xC6, 0x30, 0xC6, 0x30, 0xFE, 0x3F, 0xFC, 0x1F, 0x38, 0x0F, 0x00, 0x00, // Code for char 8
+ 0x0A, 0x00, 0x00, 0x78, 0x08, 0xFC, 0x18, 0xFE, 0x39, 0x86, 0x31, 0x86, 0x31, 0x86, 0x38, 0xFE, 0x1F, 0xFC, 0x1F, 0xF0, 0x07, 0x00, 0x00 // Code for char 9
+ };
+
+
+
+
+
+#endif /* LIBERATION_SANS11X14_NUMBERS_H_ */
diff --git a/lcd/Liberation_Sans15x21_Numbers.h b/lcd/Liberation_Sans15x21_Numbers.h
new file mode 100644
index 0000000..21a36f7
--- /dev/null
+++ b/lcd/Liberation_Sans15x21_Numbers.h
@@ -0,0 +1,42 @@
+/*
+ * Liberation_Sans15x21_Numbers.h
+ *
+ * Created: 30/03/2012 1:34:30 AM
+ * Author: andy
+ */
+
+
+#ifndef LIBERATION_SANS15X21_NUMBERS_H_
+#define LIBERATION_SANS15X21_NUMBERS_H_
+
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Liberation_Sans15x21 46 to 57
+//GLCD FontSize : 15 x 21
+
+static const char Liberation_Sans15x21_Numbers[] PROGMEM = {
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char .
+ 0x07, 0x00, 0x00, 0x1E, 0x00, 0xE0, 0x1F, 0x00, 0xFF, 0x1F, 0xF8, 0xFF, 0x03, 0xFF, 0x1F, 0x00, 0xFF, 0x01, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char /
+ 0x0E, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0xF8, 0xFF, 0x01, 0xFC, 0xFF, 0x07, 0xFC, 0xFF, 0x07, 0x3E, 0x80, 0x0F, 0x0E, 0x00, 0x0E, 0x0E, 0x00, 0x0E, 0x0E, 0x00, 0x0E, 0x1E, 0x80, 0x0F, 0xFC, 0xFF, 0x07, 0xFC, 0xFF, 0x07, 0xF8, 0xFF, 0x01, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, // Code for char 0
+ 0x0E, 0x00, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x38, 0x00, 0x0E, 0x38, 0x00, 0x0E, 0x1C, 0x00, 0x0E, 0x0E, 0x00, 0x0E, 0xFE, 0xFF, 0x0F, 0xFE, 0xFF, 0x0F, 0xFE, 0xFF, 0x0F, 0xFE, 0xFF, 0x0F, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, // Code for char 1
+ 0x0E, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0F, 0x78, 0x80, 0x0F, 0x7C, 0xC0, 0x0F, 0x7C, 0xE0, 0x0F, 0x1E, 0xF0, 0x0F, 0x0E, 0xF8, 0x0E, 0x0E, 0x7C, 0x0E, 0x0E, 0x3E, 0x0E, 0x1E, 0x1F, 0x0E, 0xFE, 0x0F, 0x0E, 0xFC, 0x07, 0x0E, 0xF8, 0x03, 0x0E, 0xF0, 0x01, 0x0E, 0x00, 0x00, 0x00, // Code for char 2
+ 0x0E, 0x00, 0x00, 0x00, 0x30, 0x80, 0x01, 0x38, 0x80, 0x03, 0x3C, 0x80, 0x07, 0x3C, 0x80, 0x0F, 0x1E, 0x00, 0x0F, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x1E, 0x1F, 0x0F, 0xFE, 0xFF, 0x0F, 0xFC, 0xFB, 0x07, 0xFC, 0xF9, 0x03, 0xF0, 0xE0, 0x01, 0x00, 0x00, 0x00, // Code for char 3
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x80, 0xEF, 0x00, 0xC0, 0xE7, 0x00, 0xF0, 0xE1, 0x00, 0x7C, 0xE0, 0x00, 0x3E, 0xE0, 0x00, 0xFE, 0xFF, 0x0F, 0xFE, 0xFF, 0x0F, 0xFE, 0xFF, 0x0F, 0xFE, 0xFF, 0x0F, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, // Code for char 4
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xF8, 0x87, 0x03, 0xFE, 0x87, 0x07, 0xFE, 0x87, 0x0F, 0xFE, 0x07, 0x0F, 0x0E, 0x03, 0x0E, 0x8E, 0x03, 0x0E, 0x8E, 0x03, 0x0E, 0x8E, 0x07, 0x0F, 0x8E, 0xFF, 0x07, 0x0E, 0xFF, 0x07, 0x0E, 0xFE, 0x03, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, // Code for char 5
+ 0x0E, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0xF0, 0xFF, 0x01, 0xF8, 0xFF, 0x07, 0xFC, 0xFF, 0x07, 0x3E, 0x0E, 0x0F, 0x0E, 0x07, 0x0E, 0x0E, 0x07, 0x0E, 0x0E, 0x07, 0x0E, 0x1E, 0x0F, 0x0F, 0x3E, 0xFF, 0x0F, 0x3C, 0xFE, 0x07, 0x38, 0xFE, 0x03, 0x30, 0xF8, 0x01, 0x00, 0x00, 0x00, // Code for char 6
+ 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x00, 0x0F, 0x0E, 0xE0, 0x0F, 0x0E, 0xF8, 0x0F, 0x0E, 0xFE, 0x0F, 0x8E, 0xFF, 0x00, 0xCE, 0x0F, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 7
+ 0x0E, 0x00, 0x00, 0x00, 0xF0, 0xE0, 0x01, 0xF8, 0xFB, 0x03, 0xFC, 0xFB, 0x07, 0xFE, 0xFF, 0x0F, 0x1E, 0x1F, 0x0F, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x1E, 0x1F, 0x0F, 0xFE, 0xFF, 0x0F, 0xFC, 0xFB, 0x07, 0xFC, 0xFB, 0x03, 0xF0, 0xE0, 0x01, 0x00, 0x00, 0x00, // Code for char 8
+ 0x0E, 0x00, 0x00, 0x00, 0xF0, 0x83, 0x01, 0xF8, 0x87, 0x03, 0xFC, 0x8F, 0x07, 0xFE, 0x9F, 0x0F, 0x1E, 0x1E, 0x0F, 0x0E, 0x1C, 0x0E, 0x0E, 0x1C, 0x0E, 0x0E, 0x1C, 0x0E, 0x1E, 0x8E, 0x0F, 0xFC, 0xFF, 0x07, 0xFC, 0xFF, 0x03, 0xF8, 0xFF, 0x01, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00 // Code for char 9
+ };
+
+
+
+
+
+#endif /* LIBERATION_SANS15X21_NUMBERS_H_ */
diff --git a/lcd/Liberation_Sans17x17_Alpha.h b/lcd/Liberation_Sans17x17_Alpha.h
new file mode 100644
index 0000000..83c7264
--- /dev/null
+++ b/lcd/Liberation_Sans17x17_Alpha.h
@@ -0,0 +1,54 @@
+/*
+ * Liberation_Sans17x17_Alpha.h
+ *
+ * Created: 30/03/2012 1:29:55 AM
+ * Author: andy
+ */
+
+
+#ifndef LIBERATION_SANS17X17_ALPHA_H_
+#define LIBERATION_SANS17X17_ALPHA_H_
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Liberation_Sans17x17 46 to 90
+//GLCD FontSize : 17 x 17
+
+static const char Liberation_Sans17x17_Alpha[] PROGMEM = {
+ 0x0D, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x1F, 0x00, 0xF8, 0x0F, 0x00, 0xFF, 0x03, 0x00, 0x1F, 0x03, 0x00, 0x03, 0x03, 0x00, 0x1F, 0x03, 0x00, 0xFF, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char A
+ 0x0D, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0xFF, 0x1C, 0x00, 0xFE, 0x1F, 0x00, 0xDE, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char B
+ 0x0D, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0xFC, 0x07, 0x00, 0xFE, 0x0F, 0x00, 0x0F, 0x0E, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x0E, 0x00, 0x0E, 0x0E, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char C
+ 0x0D, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x0E, 0x00, 0xFE, 0x0F, 0x00, 0xFC, 0x07, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char D
+ 0x0C, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x63, 0x18, 0x00, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char E
+ 0x0B, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char F
+ 0x0E, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xFC, 0x07, 0x00, 0xFE, 0x0F, 0x00, 0x0E, 0x0E, 0x00, 0x07, 0x1C, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0xC3, 0x18, 0x00, 0xC3, 0x18, 0x00, 0xC7, 0x1C, 0x00, 0xCE, 0x0F, 0x00, 0xCE, 0x0F, 0x00, 0xC4, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char G
+ 0x0C, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char H
+ 0x04, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char I
+ 0x0A, 0x00, 0x06, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x03, 0x1C, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x0F, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char J
+ 0x0E, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0xF8, 0x01, 0x00, 0xDC, 0x03, 0x00, 0x8E, 0x07, 0x00, 0x07, 0x0E, 0x00, 0x03, 0x1C, 0x00, 0x01, 0x18, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char K
+ 0x0B, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char L
+ 0x10, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x0F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x1C, 0x00, 0x80, 0x1F, 0x00, 0xF0, 0x03, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, // Code for char M
+ 0x0C, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x1E, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char N
+ 0x0E, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xFC, 0x07, 0x00, 0xFE, 0x0F, 0x00, 0x0E, 0x0E, 0x00, 0x07, 0x1C, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x0E, 0x00, 0xFE, 0x0F, 0x00, 0xFC, 0x07, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char O
+ 0x0C, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char P
+ 0x0E, 0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0xFC, 0x07, 0x00, 0xFE, 0x0F, 0x00, 0x0E, 0x1E, 0x00, 0x07, 0x1C, 0x00, 0x03, 0x38, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x01, 0x07, 0xDC, 0x01, 0x0E, 0x9E, 0x01, 0xFE, 0x8F, 0x01, 0xFC, 0x87, 0x01, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Q
+ 0x0D, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0x63, 0x00, 0x00, 0xE3, 0x00, 0x00, 0xE3, 0x03, 0x00, 0xBF, 0x0F, 0x00, 0x3E, 0x1F, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char R
+ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x1C, 0x0E, 0x00, 0x3E, 0x0E, 0x00, 0x7F, 0x1C, 0x00, 0x73, 0x18, 0x00, 0x63, 0x18, 0x00, 0xE3, 0x18, 0x00, 0xE7, 0x18, 0x00, 0xCF, 0x1F, 0x00, 0xCE, 0x0F, 0x00, 0x8C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char S
+ 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0xFF, 0x1F, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char T
+ 0x0C, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0xFF, 0x0F, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1C, 0x00, 0xFF, 0x0F, 0x00, 0xFF, 0x0F, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char U
+ 0x0D, 0x03, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x01, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1F, 0x00, 0xE0, 0x0F, 0x00, 0xF8, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char V
+ 0x11, 0x07, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x07, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x1F, 0x00, 0xFC, 0x0F, 0x00, 0xFF, 0x00, 0x00, 0x07, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0xF0, 0x1F, 0x00, 0xFF, 0x07, 0x00, 0x7F, 0x00, 0x00, 0x07, 0x00, 0x00, // Code for char W
+ 0x0D, 0x01, 0x10, 0x00, 0x03, 0x18, 0x00, 0x07, 0x1C, 0x00, 0x1E, 0x0F, 0x00, 0xBC, 0x07, 0x00, 0xF0, 0x01, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xBC, 0x07, 0x00, 0x1E, 0x0F, 0x00, 0x0F, 0x1E, 0x00, 0x03, 0x18, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char X
+ 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0xC0, 0x1F, 0x00, 0xF0, 0x1F, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Y
+ 0x0A, 0x00, 0x00, 0x00, 0x03, 0x1C, 0x00, 0x03, 0x1E, 0x00, 0x83, 0x1F, 0x00, 0xC3, 0x1B, 0x00, 0xF3, 0x19, 0x00, 0x7B, 0x18, 0x00, 0x3F, 0x18, 0x00, 0x0F, 0x18, 0x00, 0x07, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Code for char Z
+ };
+
+
+
+
+#endif /* LIBERATION_SANS17X17_ALPHA_H_ */
diff --git a/lcd/Liberation_Sans20x28_Numbers.h b/lcd/Liberation_Sans20x28_Numbers.h
new file mode 100644
index 0000000..1f204b8
--- /dev/null
+++ b/lcd/Liberation_Sans20x28_Numbers.h
@@ -0,0 +1,37 @@
+/*
+ * Liberation_Sans20x28_Numbers.h
+ *
+ * Created: 30/03/2012 1:41:05 AM
+ * Author: andy
+ */
+
+
+#ifndef LIBERATION_SANS20X28_NUMBERS_H_
+#define LIBERATION_SANS20X28_NUMBERS_H_
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Liberation_Sans20x28_Numbers
+//GLCD FontSize : 20 x 28
+
+static const char Liberation_Sans20x28_Numbers[] PROGMEM = {
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char .
+ 0x0A, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0xF8, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0x03, 0xFC, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char /
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0x03, 0xF8, 0x01, 0xF0, 0x03, 0x7C, 0x00, 0xC0, 0x07, 0x3C, 0x00, 0x80, 0x07, 0x3C, 0x00, 0x80, 0x07, 0x3C, 0x00, 0x80, 0x07, 0x3C, 0x00, 0x80, 0x07, 0x3C, 0x00, 0x80, 0x07, 0x7C, 0x00, 0xC0, 0x07, 0xF8, 0x01, 0xF0, 0x03, 0xF8, 0xFF, 0xFF, 0x03, 0xF0, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0x0F, 0x00, // Code for char 0
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x80, 0x07, 0xE0, 0x01, 0x80, 0x07, 0xF0, 0x01, 0x80, 0x07, 0xF0, 0x00, 0x80, 0x07, 0x78, 0x00, 0x80, 0x07, 0x78, 0x00, 0x80, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, // Code for char 1
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x07, 0xE0, 0x03, 0xE0, 0x07, 0xF0, 0x03, 0xF0, 0x07, 0xF0, 0x03, 0xF8, 0x07, 0xF8, 0x03, 0xFC, 0x07, 0xF8, 0x00, 0xFE, 0x07, 0x7C, 0x00, 0xBE, 0x07, 0x3C, 0x00, 0x9F, 0x07, 0x3C, 0x80, 0x8F, 0x07, 0x3C, 0x80, 0x87, 0x07, 0x3C, 0xC0, 0x87, 0x07, 0x3C, 0xE0, 0x83, 0x07, 0x7C, 0xF0, 0x81, 0x07, 0x7C, 0xF8, 0x81, 0x07, 0xF8, 0xFF, 0x80, 0x07, 0xF8, 0x7F, 0x80, 0x07, 0xF0, 0x3F, 0x80, 0x07, 0xE0, 0x1F, 0x80, 0x07, 0xC0, 0x07, 0x80, 0x07, // Code for char 2
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x01, 0xF0, 0x01, 0xF8, 0x01, 0xF0, 0x03, 0xF8, 0x01, 0xF0, 0x03, 0xFC, 0x00, 0xE0, 0x03, 0x7C, 0x00, 0xC0, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x3C, 0xF8, 0x80, 0x07, 0x7C, 0xF8, 0xC1, 0x07, 0xF8, 0xFF, 0xE3, 0x07, 0xF8, 0xDF, 0xFF, 0x03, 0xF0, 0x9F, 0xFF, 0x03, 0xF0, 0x8F, 0xFF, 0x01, 0xC0, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x7E, 0x00, // Code for char 3
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xF8, 0x3D, 0x00, 0x00, 0xFE, 0x3C, 0x00, 0x00, 0x3F, 0x3C, 0x00, 0xC0, 0x1F, 0x3C, 0x00, 0xE0, 0x07, 0x3C, 0x00, 0xF8, 0x03, 0x3C, 0x00, 0xFC, 0x00, 0x3C, 0x00, 0xFC, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x00, // Code for char 4
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0xFC, 0xFF, 0xF0, 0x01, 0xFC, 0xFF, 0xF0, 0x03, 0xFC, 0xFF, 0xF0, 0x03, 0xFC, 0xFF, 0xE0, 0x07, 0x3C, 0x78, 0xC0, 0x07, 0x3C, 0x78, 0x80, 0x07, 0x3C, 0x3C, 0x80, 0x07, 0x3C, 0x3C, 0x80, 0x07, 0x3C, 0x3C, 0x80, 0x07, 0x3C, 0x3C, 0x80, 0x07, 0x3C, 0x7C, 0xC0, 0x07, 0x3C, 0xFC, 0xE0, 0x03, 0x3C, 0xF8, 0xFF, 0x03, 0x3C, 0xF8, 0xFF, 0x01, 0x3C, 0xF0, 0xFF, 0x01, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x80, 0x1F, 0x00, // Code for char 5
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0x03, 0xF8, 0xE1, 0xE1, 0x03, 0x78, 0xF0, 0xC0, 0x07, 0x3C, 0x70, 0x80, 0x07, 0x3C, 0x78, 0x80, 0x07, 0x3C, 0x78, 0x80, 0x07, 0x3C, 0x78, 0x80, 0x07, 0x7C, 0x78, 0x80, 0x07, 0xFC, 0xF8, 0xC0, 0x07, 0xF8, 0xF9, 0xE1, 0x07, 0xF8, 0xF1, 0xFF, 0x03, 0xF0, 0xF1, 0xFF, 0x03, 0xE0, 0xE0, 0xFF, 0x01, 0x80, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x3F, 0x00, // Code for char 6
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xC0, 0x07, 0x3C, 0x00, 0xF8, 0x07, 0x3C, 0x00, 0xFF, 0x07, 0x3C, 0xC0, 0xFF, 0x07, 0x3C, 0xF0, 0xFF, 0x07, 0x3C, 0xFC, 0x3F, 0x00, 0x3C, 0xFE, 0x03, 0x00, 0xBC, 0xFF, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 7
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC0, 0x07, 0xFF, 0x00, 0xF0, 0x8F, 0xFF, 0x01, 0xF0, 0x9F, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xE3, 0x07, 0x7C, 0xF8, 0xC1, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x3C, 0xF0, 0x80, 0x07, 0x7C, 0xF8, 0xC1, 0x07, 0xF8, 0xFF, 0xC1, 0x07, 0xF8, 0xFF, 0xFF, 0x03, 0xF8, 0x9F, 0xFF, 0x03, 0xF0, 0x8F, 0xFF, 0x01, 0xC0, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x7E, 0x00, // Code for char 8
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x20, 0x00, 0xE0, 0x7F, 0xF0, 0x00, 0xF0, 0xFF, 0xF0, 0x01, 0xF8, 0xFF, 0xF1, 0x03, 0xF8, 0xFF, 0xF1, 0x03, 0xF8, 0xF0, 0xE3, 0x07, 0x7C, 0xE0, 0xC3, 0x07, 0x3C, 0xC0, 0x83, 0x07, 0x3C, 0xC0, 0x83, 0x07, 0x3C, 0xC0, 0x83, 0x07, 0x3C, 0xC0, 0x83, 0x07, 0x3C, 0xC0, 0xC1, 0x07, 0x7C, 0xE0, 0xC1, 0x03, 0xF8, 0xF0, 0xF0, 0x03, 0xF8, 0xFF, 0xFF, 0x01, 0xF0, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0x07, 0x00 // Code for char 9
+ };
+
+#endif /* LIBERATION_SANS20X28_NUMBERS_H_ */
diff --git a/lcd/Liberation_Sans27x36_Numbers.h b/lcd/Liberation_Sans27x36_Numbers.h
new file mode 100644
index 0000000..06cb3d8
--- /dev/null
+++ b/lcd/Liberation_Sans27x36_Numbers.h
@@ -0,0 +1,37 @@
+/*
+ * Liberation_Sans27x36_Numbers.h
+ *
+ * Created: 30/03/2012 1:43:14 AM
+ * Author: andy
+ */
+
+
+#ifndef LIBERATION_SANS27X36_NUMBERS_H_
+#define LIBERATION_SANS27X36_NUMBERS_H_
+
+//WARNING: This Font Require X-GLCD Lib.
+// You can not use it with MikroE GLCD Lib.
+
+//Font Generated by MikroElektronika GLCD Font Creator 1.2.0.0
+//MikroElektronika 2011
+//http://www.mikroe.com
+
+//GLCD FontName : Liberation_Sans27x36_Numbers
+//GLCD FontSize : 27 x 36
+
+static const char Liberation_Sans27x36_Numbers[] PROGMEM = {
+ 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char .
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0xFC, 0xFF, 0xFF, 0x0F, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char /
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0x00, 0xFC, 0x03, 0xFC, 0x00, 0x00, 0xE0, 0x07, 0x7C, 0x00, 0x00, 0xC0, 0x07, 0x7C, 0x00, 0x00, 0xC0, 0x07, 0x7C, 0x00, 0x00, 0xC0, 0x07, 0x7C, 0x00, 0x00, 0xC0, 0x07, 0x7C, 0x00, 0x00, 0xE0, 0x07, 0xFC, 0x00, 0x00, 0xF0, 0x07, 0xF8, 0x07, 0x00, 0xFC, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0x01, 0xF0, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 0
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0xC0, 0x07, 0xC0, 0x07, 0x00, 0xC0, 0x07, 0xE0, 0x07, 0x00, 0xC0, 0x07, 0xE0, 0x03, 0x00, 0xC0, 0x07, 0xF0, 0x01, 0x00, 0xC0, 0x07, 0xF8, 0x01, 0x00, 0xC0, 0x07, 0xF8, 0x00, 0x00, 0xC0, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 1
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0xF0, 0x07, 0xE0, 0x0F, 0x00, 0xFC, 0x07, 0xF0, 0x0F, 0x00, 0xFE, 0x07, 0xF0, 0x0F, 0x00, 0xFF, 0x07, 0xF8, 0x0F, 0x80, 0xFF, 0x07, 0xF8, 0x0F, 0xC0, 0xFF, 0x07, 0xFC, 0x03, 0xE0, 0xFF, 0x07, 0xFC, 0x00, 0xF0, 0xDF, 0x07, 0x7C, 0x00, 0xF8, 0xCF, 0x07, 0x7C, 0x00, 0xFC, 0xC7, 0x07, 0x7C, 0x00, 0xFE, 0xC3, 0x07, 0x7C, 0x00, 0xFF, 0xC1, 0x07, 0xFC, 0x80, 0xFF, 0xC0, 0x07, 0xFC, 0xC1, 0x7F, 0xC0, 0x07, 0xF8, 0xFF, 0x3F, 0xC0, 0x07, 0xF8, 0xFF, 0x1F, 0xC0, 0x07, 0xF8, 0xFF, 0x0F, 0xC0, 0x07, 0xF0, 0xFF, 0x07, 0xC0, 0x07, 0xE0, 0xFF, 0x03, 0xC0, 0x07, 0xC0, 0xFF, 0x01, 0xC0, 0x07, 0x00, 0x7F, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 2
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x00, 0x3E, 0x00, 0x80, 0x0F, 0x00, 0x7E, 0x00, 0xE0, 0x0F, 0x00, 0xFE, 0x00, 0xE0, 0x0F, 0x00, 0xFE, 0x01, 0xF0, 0x0F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0x00, 0xF8, 0x03, 0xFC, 0x03, 0x00, 0xE0, 0x07, 0xFC, 0x00, 0x1F, 0xE0, 0x07, 0x7C, 0x00, 0x1F, 0xC0, 0x07, 0x7C, 0x00, 0x1F, 0xC0, 0x07, 0x7C, 0x00, 0x1F, 0xC0, 0x07, 0x7C, 0x00, 0x1F, 0xC0, 0x07, 0xFC, 0x80, 0x3F, 0xC0, 0x07, 0xFC, 0xC1, 0x3F, 0xE0, 0x07, 0xF8, 0xFF, 0x7F, 0xF0, 0x07, 0xF8, 0xFF, 0xFB, 0xFF, 0x03, 0xF8, 0xFF, 0xFB, 0xFF, 0x03, 0xF0, 0xFF, 0xF9, 0xFF, 0x03, 0xE0, 0xFF, 0xF0, 0xFF, 0x01, 0xC0, 0x7F, 0xF0, 0xFF, 0x00, 0x00, 0x3F, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 3
+ 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0xE0, 0x9F, 0x0F, 0x00, 0x00, 0xF0, 0x8F, 0x0F, 0x00, 0x00, 0xFC, 0x83, 0x0F, 0x00, 0x00, 0xFE, 0x81, 0x0F, 0x00, 0x80, 0x7F, 0x80, 0x0F, 0x00, 0xC0, 0x3F, 0x80, 0x0F, 0x00, 0xF0, 0x0F, 0x80, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x0F, 0x00, 0xFC, 0x01, 0x80, 0x0F, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, // Code for char 4
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x0F, 0x3C, 0x00, 0xFC, 0xFF, 0x0F, 0xFC, 0x00, 0xFC, 0xFF, 0x0F, 0xFC, 0x01, 0xFC, 0xFF, 0x0F, 0xFC, 0x01, 0xFC, 0xFF, 0x0F, 0xFC, 0x03, 0xFC, 0xFF, 0x0F, 0xFC, 0x03, 0xFC, 0xFF, 0x0F, 0xF8, 0x07, 0x7C, 0xC0, 0x07, 0xE0, 0x07, 0x7C, 0xC0, 0x03, 0xC0, 0x07, 0x7C, 0xE0, 0x03, 0xC0, 0x07, 0x7C, 0xE0, 0x03, 0xC0, 0x07, 0x7C, 0xE0, 0x03, 0xC0, 0x07, 0x7C, 0xE0, 0x03, 0xC0, 0x07, 0x7C, 0xE0, 0x07, 0xE0, 0x07, 0x7C, 0xE0, 0x07, 0xE0, 0x07, 0x7C, 0xE0, 0x1F, 0xF8, 0x03, 0x7C, 0xC0, 0xFF, 0xFF, 0x03, 0x7C, 0xC0, 0xFF, 0xFF, 0x03, 0x7C, 0x80, 0xFF, 0xFF, 0x01, 0x7C, 0x80, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 5
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x03, 0x1F, 0xF8, 0x03, 0xFC, 0x81, 0x0F, 0xE0, 0x07, 0xFC, 0x80, 0x07, 0xE0, 0x07, 0x7C, 0xC0, 0x07, 0xC0, 0x07, 0x7C, 0xC0, 0x07, 0xC0, 0x07, 0x7C, 0xC0, 0x07, 0xC0, 0x07, 0xFC, 0xC0, 0x07, 0xC0, 0x07, 0xFC, 0xC1, 0x0F, 0xE0, 0x07, 0xFC, 0xC3, 0x3F, 0xF8, 0x07, 0xF8, 0xC3, 0xFF, 0xFF, 0x03, 0xF8, 0x83, 0xFF, 0xFF, 0x03, 0xF0, 0x83, 0xFF, 0xFF, 0x01, 0xF0, 0x01, 0xFF, 0xFF, 0x01, 0xC0, 0x01, 0xFE, 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 6
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xE0, 0x07, 0x7C, 0x00, 0x00, 0xFC, 0x07, 0x7C, 0x00, 0x80, 0xFF, 0x07, 0x7C, 0x00, 0xE0, 0xFF, 0x07, 0x7C, 0x00, 0xF8, 0xFF, 0x07, 0x7C, 0x00, 0xFE, 0xFF, 0x07, 0x7C, 0x80, 0xFF, 0xFF, 0x07, 0x7C, 0xE0, 0xFF, 0x1F, 0x00, 0x7C, 0xF0, 0xFF, 0x01, 0x00, 0x7C, 0xFC, 0x3F, 0x00, 0x00, 0x7C, 0xFE, 0x0F, 0x00, 0x00, 0x7C, 0xFF, 0x03, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 7
+ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x80, 0x1F, 0xE0, 0x7F, 0x00, 0xC0, 0x7F, 0xF0, 0xFF, 0x00, 0xE0, 0xFF, 0xF8, 0xFF, 0x01, 0xF0, 0xFF, 0xFD, 0xFF, 0x01, 0xF8, 0xFF, 0xFD, 0xFF, 0x03, 0xF8, 0xFF, 0xFD, 0xFF, 0x03, 0xF8, 0xFF, 0x3F, 0xF0, 0x07, 0xFC, 0xE1, 0x1F, 0xE0, 0x07, 0xFC, 0xC0, 0x0F, 0xC0, 0x07, 0x7C, 0x80, 0x0F, 0xC0, 0x07, 0x7C, 0x80, 0x0F, 0xC0, 0x07, 0x7C, 0x80, 0x0F, 0xC0, 0x07, 0x7C, 0x80, 0x0F, 0xC0, 0x07, 0xFC, 0xC0, 0x0F, 0xC0, 0x07, 0xFC, 0xE1, 0x1F, 0xE0, 0x07, 0xFC, 0xFF, 0x3F, 0xF0, 0x07, 0xF8, 0xFF, 0xFD, 0xFF, 0x03, 0xF8, 0xFF, 0xFD, 0xFF, 0x03, 0xF0, 0xFF, 0xFD, 0xFF, 0x01, 0xF0, 0xFF, 0xF8, 0xFF, 0x01, 0xC0, 0x7F, 0xF8, 0xFF, 0x00, 0x80, 0x1F, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char 8
+ 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x18, 0x00, 0xE0, 0xFF, 0x0F, 0x78, 0x00, 0xF0, 0xFF, 0x1F, 0xF8, 0x00, 0xF0, 0xFF, 0x3F, 0xFC, 0x01, 0xF8, 0xFF, 0x3F, 0xFC, 0x03, 0xF8, 0xFF, 0x7F, 0xFC, 0x03, 0xFC, 0x83, 0x7F, 0xFC, 0x07, 0xFC, 0x00, 0x7E, 0xF0, 0x07, 0x7C, 0x00, 0x7C, 0xE0, 0x07, 0x7C, 0x00, 0x7C, 0xC0, 0x07, 0x7C, 0x00, 0x7C, 0xC0, 0x07, 0x7C, 0x00, 0x3C, 0xC0, 0x07, 0xFC, 0x00, 0x3C, 0xE0, 0x07, 0xFC, 0x00, 0x1E, 0xF0, 0x07, 0xF8, 0x03, 0x1F, 0xF8, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0x01, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0x7F, 0x00, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Code for char 9
+ };
+
+#endif /* LIBERATION_SANS27X36_NUMBERS_H_ */
diff --git a/lcd/ST7565R.c b/lcd/ST7565R.c
new file mode 100644
index 0000000..9b91610
--- /dev/null
+++ b/lcd/ST7565R.c
@@ -0,0 +1,213 @@
+/**
+ * \file ST7565R.c
+ * \brief Functions relating to ST7565R.
+ * \author Andy Gock
+ * \see glcd.h
+ */
+
+#include "ST7565R.h"
+#include "glcd_spi.h"
+
+void glcd_command(uint8_t c)
+{
+ GLCD_A0_LOW();
+ glcd_spi_write(c);
+}
+
+void glcd_data(uint8_t c)
+{
+ GLCD_A0_HIGH();
+ glcd_spi_write(c);
+}
+
+void glcd_set_contrast(uint8_t val) {
+ /* Can set a 6-bit value (0 to 63) */
+
+ /* Must send this command byte before setting the contrast */
+ glcd_command(0x81);
+
+ /* Set the contrat value ("electronic volumne register") */
+ if (val > 63) {
+ glcd_command(63);
+ } else {
+ glcd_command(val);
+ }
+ return;
+}
+
+void glcd_power_down(void)
+{
+ /* Command sequence as in ST7565 datasheet */
+ glcd_command(0xac); // Static indicator off
+ glcd_command(0x00); // Static indicator register, not blinking
+ glcd_command(0xae); // Display OFF
+ glcd_command(0xa5); // Display all points ON
+
+ /* Display is now in sleep mode */
+}
+
+void glcd_power_up(void)
+{
+ glcd_command(0xa4); // Display all points OFF
+ glcd_command(0xad); // Static indicator ON
+ glcd_command(0x00); // Static indicator register, not Blinking
+ glcd_command(0xaf);
+
+ return;
+}
+
+void glcd_set_y_address(uint8_t y)
+{
+ glcd_command(ST7565R_PAGE_ADDRESS_SET | (0x0F & y)); /* 0x0F = 0b00001111 */
+}
+
+void glcd_set_x_address(uint8_t x)
+{
+ glcd_set_column_upper(x);
+ glcd_set_column_lower(x);
+}
+
+void glcd_all_on(void)
+{
+ glcd_command(ST7565R_DISPLAY_ALL_ON);
+}
+
+void glcd_normal(void)
+{
+ glcd_command(ST7565R_DISPLAY_NORMAL);
+}
+
+void glcd_set_column_upper(uint8_t addr)
+{
+ glcd_command(ST7565R_COLUMN_ADDRESS_SET_UPPER | (addr >> 4));
+}
+
+void glcd_set_column_lower(uint8_t addr)
+{
+ glcd_command(ST7565R_COLUMN_ADDRESS_SET_LOWER | (0x0f & addr));
+}
+
+void glcd_set_start_line(uint8_t addr)
+{
+ glcd_command( ST7565R_SET_START_LINE | (0x3F & addr)); /* 0x3F == 0b00111111 */
+}
+
+/** Clear the display immediately, does not buffer */
+void glcd_clear_now(void)
+{
+ uint8_t page;
+ for (page = 0; page < GLCD_NUMBER_OF_BANKS1; page++) {
+ uint8_t col;
+ glcd_set_y_address(page);
+ glcd_set_x_address(0);
+ for (col = 0; col < GLCD_NUMBER_OF_COLS1; col++) {
+ glcd_data(0);
+ }
+ }
+}
+
+void glcd_pattern(void)
+{
+ uint8_t page;
+ for (page = 0; page < GLCD_NUMBER_OF_BANKS1; page++) {
+ uint8_t col;
+ glcd_set_y_address(page);
+ glcd_set_x_address(0);
+ for (col = 0; col < GLCD_NUMBER_OF_COLS1; col++) {
+ glcd_data( (col / 8 + 2) % 2 == 1 ? 0xff : 0x00 );
+ }
+ }
+}
+
+
+#define GLCD_INIT_NHD_C12864WC_FSW_FBW_3V3_M
+uint8_t contrast = 37;
+void glcd_ST7565R_init(void) {
+
+#if defined(GLCD_INIT_NHD_C12832A1Z_FSW_FBW_3V3)
+
+ /* Init sequence based on datasheet example code for NHD-C12832A1Z-FSW-FBW-3V3 */
+ /* Datasheet says max SCK frequency 20MHz for this LCD */
+ /* We use "reverse direction" for common output mode, as opposed to datasheet specifying "normal direction" */
+
+ glcd_command(0xa0); /* ADC select in normal mode */
+ glcd_command(0xae); /* Display OFF */
+ glcd_command(0xc8); /* Common output mode select: reverse direction (last 3 bits are ignored) */
+ glcd_command(0xa2); /* LCD bias set at 1/9 */
+ glcd_command(0x2f); /* Power control set to operating mode: 7 */
+ glcd_command(0x21); /* Internal resistor ratio, set to: 1 */
+ glcd_set_contrast(40); /* Set contrast, value experimentally determined, can set to 6-bit value, 0 to 63 */
+ glcd_command(0xaf); /* Display on */
+
+#elif defined(GLCD_INIT_NHD_C12864A1Z_FSW_FBW_HTT)
+
+ /* Init sequence based on datasheet example code for NHD-C12864A1Z-FSW-FBW-HTT */
+ /* Datasheet says max SCK frequency 2.5MHz for this LCD */
+ /* We use "reverse direction" for common output mode, as opposed to datasheet specifying "normal direction" */
+
+ glcd_command(0xa0); /* ADC select in normal mode */
+ glcd_command(0xae); /* Display OFF */
+ glcd_command(0xc8); /* Common output mode select: reverse direction (last 3 bits are ignored) */
+ glcd_command(0xa2); /* LCD bias set at 1/9 */
+ glcd_command(0x2f); /* Power control set to operating mode: 7 */
+ glcd_command(0x26); /* Internal resistor ratio, set to: 6 */
+ glcd_set_contrast(30); /* Set contrast, value experimentally determined */
+ glcd_command(0xaf); /* Display on */
+
+#elif defined(GLCD_INIT_NHD_C12864WC_FSW_FBW_3V3_M)
+
+ /* Init sequence for NHD-C12864WC-FSW-FBW-3V3-M */
+
+ glcd_command(ST7565R_RESET); /* Internal reset */
+ glcd_command(0xa2); /* 1/9 bias */
+ glcd_command(0xa0); /* ADC select, normal */
+ glcd_command(0xc8); /* Com output reverse */
+ glcd_command(0xa4); /* Display all points normal */
+ glcd_command(0x40); /* Display start line set */
+ glcd_command(0x25); /* Internal resistor ratio */
+ glcd_set_contrast(contrast); /* Set contrast value, experimentally determined, value 0 to 63 */
+ glcd_command(0x2f); /* Power controller set */
+ glcd_command(0xaf); /* Display on */
+
+#elif defined(GLCD_INIT_ZOLEN_12864_FFSSWE_NAA)
+ /* Init sequence for Zolen 128x64 module with
+ * size 40x35mm. Chip ST7567 */
+
+ glcd_command(0xa0); /* ADC select in normal mode */
+ glcd_command(0xae); /* Display OFF */
+ glcd_command(0xc8); /* Common output mode select: reverse direction (last 3 bits are ignored) */
+ glcd_command(0xa3); /* LCD bias set at 1/9 */
+ glcd_command(0x2f); /* Power control set to operating mode: 7 */
+ glcd_command(0x24); /* Internal resistor ratio, set to: 6 */
+ glcd_set_contrast(45); /* Set contrast, value experimentally determined, value 0 to 63 */
+ glcd_command(0xaf); /* Display on */
+
+#elif defined(GLCD_MY)
+
+ glcd_command(0xa2); /* 1/9 bias */
+ glcd_command(0xa0); /* Select SEG Normal Direction */
+ glcd_command(0xc0); /* Select COM Normal Direction */
+ glcd_command(0x24); /* Select Regulation Ration=5.0 */
+ glcd_command(0x81); /* Set EV Command */
+ glcd_command(0x20); /* Set EV Command */
+ glcd_command(0x2c); /* Power controller set */
+ glcd_command(0x2e); /* Power controller set */
+ glcd_command(0x2f); /* Power controller set */
+ glcd_command(0xaf); /* Display on */
+#else
+
+ /* Default init sequence */
+ /* Currently just set the same as GLCD_INIT_NHD_C12864A1Z_FSW_FBW_HTT */
+
+ glcd_command(0xa0); /* ADC select in normal mode */
+ glcd_command(0xae); /* Display OFF */
+ glcd_command(0xc8); /* Common output mode select: reverse direction (last 3 bits are ignored) */
+ glcd_command(0xa2); /* LCD bias set at 1/9 */
+ glcd_command(0x2f); /* Power control set to operating mode: 7 */
+ glcd_command(0x26); /* Internal resistor ratio, set to: 6 */
+ glcd_set_contrast(20); /* Set contrast, value experimentally determined, value 0 to 63 */
+ glcd_command(0xaf); /* Display on */
+
+#endif
+
+}
diff --git a/lcd/ST7565R.h b/lcd/ST7565R.h
new file mode 100644
index 0000000..1c2b06a
--- /dev/null
+++ b/lcd/ST7565R.h
@@ -0,0 +1,108 @@
+/**
+ * \file ST7565R.h
+ * \brief Constants relating to ST7565R LCD controller.
+ * \author Andy Gock
+ *
+ * Constants and functions specific to ST7565R.
+ * Tested with Newhaven Display model NHD-C12864WC-FSW-FBW-3V3-M
+ *
+ * \todo Need to move functions to be controller independent
+ *
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef ST7565R_H_
+#define ST7565R_H_
+
+#include "stdint.h"
+
+/* Commands */
+#define ST7565R_DISPLAY_ON 0xAF /* 0b10101111 */
+#define ST7565R_DISPLAY_OFF 0xAE /* 0b10101110 */
+#define ST7565R_PAGE_ADDRESS_SET 0xB0 /* 0b10110000 */
+#define ST7565R_COLUMN_ADDRESS_SET_LOWER 0x00
+#define ST7565R_COLUMN_ADDRESS_SET_UPPER 0x10
+#define ST7565R_DISPLAY_NORMAL 0xA4 /* 0b10100100 */
+#define ST7565R_DISPLAY_ALL_ON 0xA5 /* 0b10100101 */
+#define ST7565R_NORMAL 0xA0 /* 0b10100000 */
+#define ST7565R_REVERSE 0xA1 /* 0b10100001 */
+#define ST7565R_RESET 0xE2 /* 0b11100010 */
+#define ST7565R_SET_START_LINE (1<<6)
+
+ /**
+ * User specified GLCD width in pixels
+ * Set to 0 for automatic assignment based on controller.
+ */
+#define GLCD_LCD_WIDTH1 128
+
+ /**
+ * User specified GLCD height in pixels
+ * Set to 0 for automatic assignment based on controller.
+ */
+
+#define GLCD_LCD_HEIGHT1 64
+
+
+#define GLCD_NUMBER_OF_BANKS1 (GLCD_LCD_WIDTH1 / 8)
+#define GLCD_NUMBER_OF_COLS1 GLCD_LCD_WIDTH1
+
+/* These functions only available on ST7565 implementation (for now) */
+
+/* Private functions */
+void glcd_set_column_upper(uint8_t addr);
+void glcd_set_column_lower(uint8_t addr);
+
+/** All display points on (native) */
+void glcd_all_on(void);
+
+/** Set to normal mode */
+void glcd_normal(void);
+
+/** Set start line/page */
+void glcd_set_start_line(uint8_t addr);
+
+/** Clear the display immediately, does not buffer */
+void glcd_clear_now(void);
+
+/** Show a black and white line pattern on the display */
+void glcd_pattern(void);
+
+/** Init ST7565R controller / display */
+void glcd_ST7565R_init(void);
+
+void glcd_write(void);
+
+void glcd_set_y_address(uint8_t y);
+
+void glcd_set_x_address(uint8_t x);
+
+void glcd_data(uint8_t c);
+
+#endif /* ST7565R_H_ */
diff --git a/lcd/font5x7.h b/lcd/font5x7.h
new file mode 100644
index 0000000..b800fbf
--- /dev/null
+++ b/lcd/font5x7.h
@@ -0,0 +1,118 @@
+/*
+ * font5x7.h
+ *
+ * Created: 28/03/2012 1:52:20 AM
+ * Author: andy
+ */
+
+// Title : Graphic LCD Font (Ascii Charaters)
+// Author : Pascal Stang
+
+#ifndef FONT5X7_H_
+#define FONT5X7_H_
+
+// standard ascii 5x7 font
+// defines ascii characters 0x20-0x7F (32-127)
+static const char Font5x7[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00,// (space)
+ 0x00, 0x00, 0x5F, 0x00, 0x00,// !
+ 0x00, 0x07, 0x00, 0x07, 0x00,// "
+ 0x14, 0x7F, 0x14, 0x7F, 0x14,// #
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
+ 0x23, 0x13, 0x08, 0x64, 0x62,// %
+ 0x36, 0x49, 0x55, 0x22, 0x50,// &
+ 0x00, 0x05, 0x03, 0x00, 0x00,// '
+ 0x00, 0x1C, 0x22, 0x41, 0x00,// (
+ 0x00, 0x41, 0x22, 0x1C, 0x00,// )
+ 0x08, 0x2A, 0x1C, 0x2A, 0x08,// *
+ 0x08, 0x08, 0x3E, 0x08, 0x08,// +
+ 0x00, 0x50, 0x30, 0x00, 0x00,// ,
+ 0x08, 0x08, 0x08, 0x08, 0x08,// -
+ 0x00, 0x60, 0x60, 0x00, 0x00,// .
+ 0x20, 0x10, 0x08, 0x04, 0x02,// /
+ 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
+ 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
+ 0x42, 0x61, 0x51, 0x49, 0x46,// 2
+ 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
+ 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
+ 0x27, 0x45, 0x45, 0x45, 0x39,// 5
+ 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
+ 0x01, 0x71, 0x09, 0x05, 0x03,// 7
+ 0x36, 0x49, 0x49, 0x49, 0x36,// 8
+ 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
+ 0x00, 0x36, 0x36, 0x00, 0x00,// :
+ 0x00, 0x56, 0x36, 0x00, 0x00,// ;
+ 0x00, 0x08, 0x14, 0x22, 0x41,// <
+ 0x14, 0x14, 0x14, 0x14, 0x14,// =
+ 0x41, 0x22, 0x14, 0x08, 0x00,// >
+ 0x02, 0x01, 0x51, 0x09, 0x06,// ?
+ 0x32, 0x49, 0x79, 0x41, 0x3E,// @
+ 0x7E, 0x11, 0x11, 0x11, 0x7E,// A
+ 0x7F, 0x49, 0x49, 0x49, 0x36,// B
+ 0x3E, 0x41, 0x41, 0x41, 0x22,// C
+ 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
+ 0x7F, 0x49, 0x49, 0x49, 0x41,// E
+ 0x7F, 0x09, 0x09, 0x01, 0x01,// F
+ 0x3E, 0x41, 0x41, 0x51, 0x32,// G
+ 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
+ 0x00, 0x41, 0x7F, 0x41, 0x00,// I
+ 0x20, 0x40, 0x41, 0x3F, 0x01,// J
+ 0x7F, 0x08, 0x14, 0x22, 0x41,// K
+ 0x7F, 0x40, 0x40, 0x40, 0x40,// L
+ 0x7F, 0x02, 0x04, 0x02, 0x7F,// M
+ 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
+ 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
+ 0x7F, 0x09, 0x09, 0x09, 0x06,// P
+ 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
+ 0x7F, 0x09, 0x19, 0x29, 0x46,// R
+ 0x46, 0x49, 0x49, 0x49, 0x31,// S
+ 0x01, 0x01, 0x7F, 0x01, 0x01,// T
+ 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
+ 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
+ 0x7F, 0x20, 0x18, 0x20, 0x7F,// W
+ 0x63, 0x14, 0x08, 0x14, 0x63,// X
+ 0x03, 0x04, 0x78, 0x04, 0x03,// Y
+ 0x61, 0x51, 0x49, 0x45, 0x43,// Z
+ 0x00, 0x00, 0x7F, 0x41, 0x41,// [
+ 0x02, 0x04, 0x08, 0x10, 0x20,// "\"
+ 0x41, 0x41, 0x7F, 0x00, 0x00,// ]
+ 0x04, 0x02, 0x01, 0x02, 0x04,// ^
+ 0x40, 0x40, 0x40, 0x40, 0x40,// _
+ 0x00, 0x01, 0x02, 0x04, 0x00,// `
+ 0x20, 0x54, 0x54, 0x54, 0x78,// a
+ 0x7F, 0x48, 0x44, 0x44, 0x38,// b
+ 0x38, 0x44, 0x44, 0x44, 0x20,// c
+ 0x38, 0x44, 0x44, 0x48, 0x7F,// d
+ 0x38, 0x54, 0x54, 0x54, 0x18,// e
+ 0x08, 0x7E, 0x09, 0x01, 0x02,// f
+ 0x08, 0x14, 0x54, 0x54, 0x3C,// g
+ 0x7F, 0x08, 0x04, 0x04, 0x78,// h
+ 0x00, 0x44, 0x7D, 0x40, 0x00,// i
+ 0x20, 0x40, 0x44, 0x3D, 0x00,// j
+ 0x00, 0x7F, 0x10, 0x28, 0x44,// k
+ 0x00, 0x41, 0x7F, 0x40, 0x00,// l
+ 0x7C, 0x04, 0x18, 0x04, 0x78,// m
+ 0x7C, 0x08, 0x04, 0x04, 0x78,// n
+ 0x38, 0x44, 0x44, 0x44, 0x38,// o
+ 0x7C, 0x14, 0x14, 0x14, 0x08,// p
+ 0x08, 0x14, 0x14, 0x18, 0x7C,// q
+ 0x7C, 0x08, 0x04, 0x04, 0x08,// r
+ 0x48, 0x54, 0x54, 0x54, 0x20,// s
+ 0x04, 0x3F, 0x44, 0x40, 0x20,// t
+ 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
+ 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
+ 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
+ 0x44, 0x28, 0x10, 0x28, 0x44,// x
+ 0x0C, 0x50, 0x50, 0x50, 0x3C,// y
+ 0x44, 0x64, 0x54, 0x4C, 0x44,// z
+ 0x00, 0x08, 0x36, 0x41, 0x00,// {
+ 0x00, 0x00, 0x7F, 0x00, 0x00,// |
+ 0x00, 0x41, 0x36, 0x08, 0x00,// }
+ 0x08, 0x08, 0x2A, 0x1C, 0x08,// ->
+ 0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
+};
+
+
+
+
+#endif /* FONT5X7_H_ */
diff --git a/lcd/glcd.c b/lcd/glcd.c
new file mode 100644
index 0000000..a0f1461
--- /dev/null
+++ b/lcd/glcd.c
@@ -0,0 +1,242 @@
+/**
+ \file glcd.c
+ \author Andy Gock
+ \brief Basic GLCD functions affecting bounding box manipulation,
+ clearing of screen and buffers, and basic scroll functions.
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <string.h>
+#include <stdio.h>
+#include "glcd.h"
+
+/** \addtogroup GlobalVars Global Variables
+ * @{
+ */
+
+/**
+ * Screen buffer
+ *
+ * Requires at least one bit for every pixel (e.g 504 bytes for 48x84 LCD)
+ */
+uint8_t glcd_buffer[GLCD_LCD_WIDTH * GLCD_LCD_HEIGHT / 8];
+
+/**
+ * Keeps track of bounding box of area on LCD which need to be
+ * updated next reresh cycle
+ */
+glcd_BoundingBox_t glcd_bbox;
+
+/**
+ * Pointer to screen buffer currently in use.
+ */
+uint8_t* glcd_buffer_selected;
+
+uint8_t glcd_disp_reverse_en = 0;
+
+/**
+ * Pointer to bounding box currently in use.
+ */
+glcd_BoundingBox_t* glcd_bbox_selected;
+
+/** @} */
+
+void glcd_set_reverse_sta(uint8_t sta)
+{
+ if(!sta)
+ glcd_disp_reverse_en = 0;
+ else
+ glcd_disp_reverse_en = 1;
+}
+
+uint8_t glcd_get_reverse_sta(void)
+{
+ return glcd_disp_reverse_en;
+}
+
+void glcd_update_bbox(uint8_t xmin, uint8_t ymin, uint8_t xmax, uint8_t ymax)
+{
+ /* Keep and check bounding box within limits of LCD screen dimensions */
+ if(xmin > (GLCD_LCD_WIDTH-1))
+ {
+ xmin = GLCD_LCD_WIDTH-1;
+ }
+ if(xmax > (GLCD_LCD_WIDTH-1))
+ {
+ xmax = GLCD_LCD_WIDTH-1;
+ }
+
+ if(ymin > (GLCD_LCD_HEIGHT-1))
+ {
+ ymin = GLCD_LCD_HEIGHT-1;
+ }
+ if(ymax > (GLCD_LCD_HEIGHT-1))
+ {
+ ymax = GLCD_LCD_HEIGHT-1;
+ }
+
+ /* Update the bounding box size */
+ if(xmin < glcd_bbox_selected->x_min)
+ {
+ glcd_bbox_selected->x_min = xmin;
+ }
+ if(xmax > glcd_bbox_selected->x_max)
+ {
+ glcd_bbox_selected->x_max = xmax;
+ }
+ if(ymin < glcd_bbox_selected->y_min)
+ {
+ glcd_bbox_selected->y_min = ymin;
+ }
+ if(ymax > glcd_bbox_selected->y_max)
+ {
+ glcd_bbox_selected->y_max = ymax;
+ }
+}
+
+void glcd_reset_bbox()
+{
+ /* Used after physically writing to the LCD */
+ glcd_bbox_selected->x_min = GLCD_LCD_WIDTH - 1;
+ glcd_bbox_selected->x_max = 0;
+ glcd_bbox_selected->y_min = GLCD_LCD_HEIGHT -1;
+ glcd_bbox_selected->y_max = 0;
+}
+
+void glcd_bbox_reset()
+{
+ glcd_reset_bbox();
+}
+
+void glcd_bbox_refresh()
+{
+ /* Marks bounding box as entire screen, so on next glcd_write(), it writes the entire buffer to the LCD */
+ glcd_bbox_selected->x_min = 0;
+ glcd_bbox_selected->x_max = GLCD_LCD_WIDTH - 1;
+ glcd_bbox_selected->y_min = 0;
+ glcd_bbox_selected->y_max = GLCD_LCD_HEIGHT -1;
+}
+
+void glcd_clear(void)
+{
+ memset(glcd_buffer_selected, 0x00, GLCD_LCD_WIDTH * GLCD_LCD_HEIGHT / 8);
+ glcd_update_bbox(0,0,GLCD_LCD_WIDTH - 1,GLCD_LCD_HEIGHT - 1);
+ glcd_write();
+}
+
+void glcd_clear_buffer(void)
+{
+ memset(glcd_buffer_selected, 0x00, GLCD_LCD_WIDTH * GLCD_LCD_HEIGHT / 8);
+ glcd_update_bbox(0,0,GLCD_LCD_WIDTH - 1,GLCD_LCD_HEIGHT - 1);
+}
+
+void glcd_select_screen(uint8_t* buffer, glcd_BoundingBox_t* bbox)
+{
+ glcd_buffer_selected = buffer;
+ glcd_bbox_selected = bbox;
+}
+
+void glcd_scroll(int8_t x, int8_t y)
+{
+ /** \todo Skeleton */
+
+ uint8_t row;
+
+ for(row=0; row<(GLCD_LCD_HEIGHT / 8); row++)
+ {
+ uint8_t x;
+ for(x=0; x<GLCD_LCD_WIDTH; x++)
+ {
+
+ }
+ }
+}
+
+void glcd_scroll_line(void)
+{
+ uint8_t y;
+ uint8_t number_of_rows = GLCD_LCD_HEIGHT / 8;
+ for(y=0; y<number_of_rows; y++)
+ {
+ if(y < (number_of_rows - 1))
+ {
+ /* All lines except the last */
+ memcpy(glcd_buffer_selected + y*GLCD_LCD_WIDTH,
+ glcd_buffer_selected + y*GLCD_LCD_WIDTH + GLCD_LCD_WIDTH, GLCD_LCD_WIDTH);
+ }
+ else
+ {
+ /* Last line, clear it */
+ memset(glcd_buffer_selected + (number_of_rows - 1)*GLCD_LCD_WIDTH, 0x00, GLCD_LCD_WIDTH);
+ }
+ }
+ glcd_update_bbox(0,0,GLCD_LCD_WIDTH - 1,GLCD_LCD_HEIGHT - 1);
+}
+
+void glcd_init(void)
+{
+ glcd_HW_init();
+
+ glcd_select_screen(glcd_buffer,&glcd_bbox);
+ glcd_clear();
+}
+void glcd_write()
+{
+
+ uint8_t bank;
+
+ for(bank = 0; bank < GLCD_NUMBER_OF_BANKS; bank++)
+ {
+ /* Each bank is a single row 8 bits tall */
+ uint8_t column;
+
+ if(glcd_bbox_selected->y_min >= (bank+1)*8)
+ {
+ continue; /* Skip the entire bank */
+ }
+
+ if(glcd_bbox_selected->y_max < bank*8)
+ {
+ break; /* No more banks need updating */
+ }
+
+ glcd_set_y_address(bank);
+ glcd_set_x_address(glcd_bbox_selected->x_min);
+
+ for(column = glcd_bbox_selected->x_min; column <= glcd_bbox_selected->x_max; column++)
+ {
+ glcd_data(glcd_buffer_selected[GLCD_NUMBER_OF_COLS * bank + column]);
+ }
+ }
+
+ glcd_reset_bbox();
+
+}
+
diff --git a/lcd/glcd.h b/lcd/glcd.h
new file mode 100644
index 0000000..1577878
--- /dev/null
+++ b/lcd/glcd.h
@@ -0,0 +1,251 @@
+/**
+ \file glcd.h
+ \brief GLCD Library main header file. This file must be included into project.
+ \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _GLCD_H
+#define _GLCD_H
+
+#include "stm32f10x.h"
+#include "glcd_spi.h"
+#include "ST7565R.h"
+
+
+extern void delay_ms(uint32_t ms);
+#define PROGMEM
+
+
+/* Macros */
+
+#define swap(a, b) { uint8_t t = a; a = b; b = t; }
+
+/* Defining new types */
+
+/**
+ * Font table type
+ */
+typedef enum {
+ STANG,
+ MIKRO,
+ GLCD_UTILS
+} font_table_type_t;
+
+/**
+ * Bounding box for pixels that need to be updated
+ */
+typedef struct {
+ uint8_t x_min;
+ uint8_t y_min;
+ uint8_t x_max;
+ uint8_t y_max;
+} glcd_BoundingBox_t;
+
+#include <stdint.h>
+#include "glcd_graphics.h"
+#include "glcd_graphs.h"
+#include "glcd_text_tiny.h"
+#include "glcd_text.h"
+#include "unit_tests.h"
+#include "font5x7.h"
+#include "Earthbound_12x19_48to57.h"
+#include "Liberation_Sans15x21_Numbers.h"
+
+/**
+ * \name Colour Constants
+ * @{
+ */
+#define BLACK 1
+#define WHITE 0
+/**@}*/
+
+/**
+ * \name LCD Dimensions
+ * @{
+ */
+#if !defined(GLCD_LCD_WIDTH) || !defined(GLCD_LCD_HEIGHT)
+
+ /**
+ * User specified GLCD width in pixels
+ * Set to 0 for automatic assignment based on controller.
+ */
+ #define GLCD_LCD_WIDTH 128
+
+ /**
+ * User specified GLCD height in pixels
+ * Set to 0 for automatic assignment based on controller.
+ */
+
+ #define GLCD_LCD_HEIGHT 64
+
+ /* Automatic assignment of width and height, if required. */
+ #if !GLCD_LCD_WIDTH && !GLCD_LCD_HEIGHT
+ #undef GLCD_LCD_WIDTH
+ #undef GLCD_LCD_HEIGHT
+ #if defined(GLCD_CONTROLLER_PCD8544)
+ /* 84x48 is standard for the popular Nokia LCD */
+ #define GLCD_LCD_WIDTH 84
+ #define GLCD_LCD_HEIGHT 48
+ #elif defined(GLCD_CONTROLLER_ST7565R) || defined(GLCD_CONTROLLER_NT75451)
+ /* 128x64 is the most popular for this, so we'll use that as default */
+ #define GLCD_LCD_WIDTH 128
+ #define GLCD_LCD_HEIGHT 64
+ #else
+ #define GLCD_LCD_WIDTH 128
+ #define GLCD_LCD_HEIGHT 64
+ #endif
+ #endif
+
+#endif /* !defined(GLCD_LCD_WIDTH) || !defined(GLCD_LCD_HEIGHT) */
+
+/*
+ * GLCD_NUMBER_OF_BANKS is typically GLCD_LCD_HEIGHT/8
+ * Don't adjust these below unless required.
+ */
+#define GLCD_NUMBER_OF_BANKS (GLCD_LCD_WIDTH / 8)
+#define GLCD_NUMBER_OF_COLS GLCD_LCD_WIDTH
+
+/**@}*/
+
+#if !defined(GLCD_RESET_TIME)
+ /** Reset duration by glcd_reset(), in milliseconds */
+ #define GLCD_RESET_TIME 2
+#endif
+/*
+ * Set to custom value, or leave at 0 for automatic assignment.
+ * For custom dimensions, users can define this in their compiler options.
+ */
+
+/* Global variables used for GLCD library */
+extern uint8_t glcd_buffer[GLCD_LCD_WIDTH * GLCD_LCD_HEIGHT / 8];
+extern glcd_BoundingBox_t glcd_bbox;
+extern uint8_t *glcd_buffer_selected;
+extern glcd_BoundingBox_t *glcd_bbox_selected;
+
+/** \name Base Functions
+ * @{
+ */
+
+/**
+ * Update bounding box.
+ *
+ * The bounding box defines a rectangle in which needs to be refreshed next time
+ * glcd_write() is called. glcd_write() only writes to those pixels inside the bounding box plus any
+ * surrounding pixels which are required according to the bank/column write method of the controller.
+ *
+ * Define a rectangle here, and it will be <em>added</em> to the existing bounding box.
+ *
+ * \param xmin Minimum x value of rectangle
+ * \param ymin Minimum y value of rectangle
+ * \param xmax Maximum x value of rectangle
+ * \param ymax Maximum y value of rectangle
+ * \see glcd_bbox
+ * \see glcd_bbox_selected
+ */
+void glcd_update_bbox(uint8_t xmin, uint8_t ymin, uint8_t xmax, uint8_t ymax);
+
+/**
+ * Reset the bounding box.
+ * After resetting the bounding box, no pixels are marked as needing refreshing.
+ */
+void glcd_reset_bbox(void);
+
+/**
+ * Same as glcd_reset_bbox()
+ */
+void glcd_bbox_reset(void);
+
+/**
+ * Marks the entire display for re-writing.
+ */
+void glcd_bbox_refresh(void);
+
+/**
+ * Clear the display. This will clear the buffer and physically write and commit it to the LCD
+ */
+void glcd_clear(void);
+
+/**
+ * Clear the display buffer only. This does not physically write the changes to the LCD
+ */
+void glcd_clear_buffer(void);
+
+/**
+ * Select screen buffer and bounding box structure.
+ * This should be selected at initialisation. There are future plans to support multiple screen buffers
+ * but this not yet available.
+ * \param buffer Pointer to screen buffer
+ * \param bbox Pointer to bounding box object.
+ * \see glcd_BoundingBox_t
+ */
+void glcd_select_screen(uint8_t *buffer, glcd_BoundingBox_t *bbox);
+
+/**
+ * Scroll entire screne buffer by x and y pixels. (not implemented yet)
+ * \note Items scrolled off the extents of the display dimensions will be lost.
+ *
+ * \param x X distance to scroll
+ * \param y Y distance to scroll
+ */
+void glcd_scroll(int8_t x, int8_t y);
+
+/**
+ * Scroll screen buffer up by 8 pixels.
+ * This is designed to be used in conjunciton with tiny text functions which are 8 bits high.
+ * \see Tiny Text
+ */
+void glcd_scroll_line(void);
+
+void glcd_set_reverse_sta(uint8_t sta);
+uint8_t glcd_get_reverse_sta(void);
+
+void glcd_HW_init(void);
+
+void glcd_write(void);
+
+/** @}*/
+
+typedef struct {
+ const char *font_table;
+ uint8_t width;
+ uint8_t height;
+ char start_char;
+ char end_char;
+ font_table_type_t table_type;
+} glcd_FontConfig_t;
+
+
+
+extern uint8_t *glcd_buffer_selected;
+extern glcd_BoundingBox_t *glcd_bbox_selected;
+extern glcd_FontConfig_t font_current;
+
+#endif
diff --git a/lcd/glcd_graphics.h b/lcd/glcd_graphics.h
new file mode 100644
index 0000000..376565f
--- /dev/null
+++ b/lcd/glcd_graphics.h
@@ -0,0 +1,169 @@
+/**
+ \file glcd_graphics.h
+ \brief Graphics routines
+ \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef GLCD_GRAPHICS_H_
+#define GLCD_GRAPHICS_H_
+
+/** \addtogroup Graphics Graphics
+ * Graphics specific functions such as drawing lines, circles, rectangles etc.
+ * @{
+ */
+
+/**
+ * Set pixel to specified colour
+ * \param x X-coordinate
+ * \param y Y-coordinate
+ * \param color Colour to set pixel
+ * \see ColourConstants
+ */
+void glcd_set_pixel(uint8_t x, uint8_t y, uint8_t color);
+
+/**
+ * Get state of pixel from specified location
+ * \param x X-coordinate
+ * \param y Y-coordinate
+ * \return Colour
+ */
+uint8_t glcd_get_pixel(uint8_t x, uint8_t y);
+
+/**
+ * Invert state of pixel of specified location
+ * \param x X-coordinate
+ * \param y Y-coordinate
+ */
+void glcd_invert_pixel(uint8_t x, uint8_t y);
+
+/**
+ * Draw line
+ * \param x0 Start x-coordinate
+ * \param y0 Start y-coordinate
+ * \param x1 End x-coordinate
+ * \param y1 End y-coordinate
+ * \param color Colour to set pixels
+ * \see ColourConstants
+ */
+void glcd_draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color);
+
+/**
+ * Draw rectangle and fill with colour.
+ * The border of the rectangle is the same as fill colour
+ * \param x Start x-coordinate (left-most)
+ * \param y Start y-coordinate (top-most)
+ * \param w Width
+ * \param h Height
+ * \param color Colour to fill with
+ * \see ColourConstants
+ */
+void glcd_fill_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color);
+
+/**
+ * Draw rectangle but do not fill.
+ * The border of the rectangle is the same as fill colour
+ * \param x Start x-coordinate (left-most)
+ * \param y Start y-coordinate (top-most)
+ * \param w Width
+ * \param h Height
+ * \param color Colour of border
+ * \see ColourConstants
+ */
+void glcd_draw_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color);
+
+/**
+ * Draw rectangle but do not fill. User specified thickness.
+ * The border of the rectangle is the same as fill colour
+ * \param x Start x-coordinate (left-most)
+ * \param y Start y-coordinate (top-most)
+ * \param w Width (outermost pixels)
+ * \param h Height
+ * \param tx Thickness of horizontal border along X axis
+ * \param ty Thickness of vertical border along Y axis
+ * \param color Colour of border
+ * \see ColourConstants
+ */
+void glcd_draw_rect_thick(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t tx, uint8_t ty, uint8_t color);
+
+/**
+ * Draw rectangle but do not fill. Place a shadow line on the bottom-right of the window.
+ * The border of the rectangle is the same as fill colour
+ * \param x Start x-coordinate (left-most)
+ * \param y Start y-coordinate (top-most)
+ * \param w Width
+ * \param h Height
+ * \param color Colour of border
+ * \see ColourConstants
+ */
+void glcd_draw_rect_shadow(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color);
+
+/**
+ * Draw circle but do not fill.
+ * The border of the rectangle is the same as fill colour
+ * \param x0 Centre x-coordinate (left-most)
+ * \param y0 Centre y-coordinate (top-most)
+ * \param r Radius
+ * \param color Colour of border
+ * \see ColourConstants
+ */
+void glcd_draw_circle(uint8_t x0, uint8_t y0, uint8_t r, uint8_t color);
+
+/**
+ * Draw circle and fill.
+ * The border of the rectangle is the same as fill colour
+ * \param x0 Centre x-coordinate (left-most)
+ * \param y0 Centre y-coordinate (top-most)
+ * \param r Radius
+ * \param color Colour of border
+ * \see ColourConstants
+ */
+void glcd_fill_circle(uint8_t x0, uint8_t y0, uint8_t r, uint8_t color);
+
+/**
+ * Invert pixels in a retangular area.
+ * \param x Start x-coordinate (left-most)
+ * \param y Start y-coordinate (top-most)
+ * \param w Width
+ * \param h Height
+ */
+void glcd_invert_area(uint8_t x, uint8_t y, uint8_t w, uint8_t h);
+
+/**
+ * Draw bitmap to screen buffer.
+ * Note this will draw to the entire buffer, its not yet possible to draw partially to the LCD.
+ * Not yet supported with AVR pgmspace.
+ * \param data Pointer to bitmap data.
+ */
+void glcd_draw_bitmap(const unsigned char *data);
+
+/** @}*/
+
+#endif /* GLCD_GRAPHICS_H_ */
diff --git a/lcd/glcd_graphs.h b/lcd/glcd_graphs.h
new file mode 100644
index 0000000..a1aa987
--- /dev/null
+++ b/lcd/glcd_graphs.h
@@ -0,0 +1,88 @@
+/**
+ \file glcd_graphs.h
+ \brief GLCD Library - Graph drawing functions.
+ \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef GLCD_GRAPHS_H
+#define GLCD_GRAPHS_H
+
+/** \addtogroup Graphing
+ * Functions for graphing, e.g drawing bar graphs etc.
+ * @{
+ */
+
+/** Draw horizontal bar graph with 1 px wide border.
+ * The bar graph draws from left to right as val increases.
+ * \param x x location for top-left of border
+ * \param y y location for top-left of border
+ * \param width width of the border
+ * \param height height of the border (must be over 2)
+ * \param val value to display in graph (0-255 8 bit value).
+ */
+void glcd_bar_graph_horizontal(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val);
+
+/** Draw horizontal bar graph with no border.
+ * The bar graph draws from left to right as val increases.
+ * \param x x location for top-left of bar
+ * \param y y location for top-left of bar
+ * \param width width of the bar at full val
+ * \param height height of the bar
+ * \param val value to display in graph (0-255 8 bit value).
+ */
+void glcd_bar_graph_horizontal_no_border(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val);
+
+/** Draw vertical bar graph with 1px wide border.
+ * The bar graph draws from bottom to top as val increases.
+ * \param x x location for top-left of border
+ * \param y y location for top-left of border
+ * \param width width of the border
+ * \param height height of the border
+ * \param val value to display in graph (0-255 8 bit value).
+ */
+void glcd_bar_graph_vertical(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val);
+
+/** Draw vertical bar graph with no border.
+ * The bar graph draws from bottom to top as val increases.
+ * \param x x location for top-left of bar
+ * \param y y location for top-left of bar
+ * \param width width of the bar
+ * \param height height of the bar
+ * \param val value to display in graph (0-255 8 bit value).
+ */
+void glcd_bar_graph_vertical_no_border(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val);
+
+/** \todo write doc */
+void glcd_scrolling_bar_graph(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val);
+
+/** @}*/
+
+#endif
diff --git a/lcd/glcd_spi.c b/lcd/glcd_spi.c
new file mode 100644
index 0000000..1e65708
--- /dev/null
+++ b/lcd/glcd_spi.c
@@ -0,0 +1,115 @@
+/**
+ * \file STM32F10x.c
+ * \brief Device implementation for ST STM32F10x ARM Cortex-M3 MCUs
+ * Requires the use of ST's Standard Peripheral Library
+ * \author Andy Gock
+ * \todo Code is untested!
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* Includes from CMSIS and Peripheral Library */
+#include "stm32f10x.h"
+#include "../sys_hw/timer.h"
+#include "glcd_spi.h"
+#include "ST7565R.h"
+
+void glcd_HW_init(void)
+{
+ /* Initialisation of GPIO and SPI */
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Set up GPIO pins */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+
+ /* DC pin */
+ GPIO_InitStructure.GPIO_Pin = CONTROLLER_SPI_DC_PIN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_Init(CONTROLLER_SPI_DC_PORT, &GPIO_InitStructure);
+
+ /* RESET pin */
+ GPIO_InitStructure.GPIO_Pin = CONTROLLER_SPI_RST_PIN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_Init(CONTROLLER_SPI_RST_PORT, &GPIO_InitStructure);
+
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
+ GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+ GLCD_BKL_ON();
+
+ /* Make sure chip is de-selected by default */
+ GLCD_DESELECT();
+
+ /* Initialise SPI */
+ spi_init();
+
+ /* Send reset pulse to LCD */
+ glcd_reset();
+ delay_ms(1);
+
+ glcd_ST7565R_init();
+
+ /* Set all dots black and hold for 0.5s, then clear it, we do this so we can visually check init sequence is working */
+// glcd_all_on();
+// delay_ms(50);
+ glcd_normal();
+
+ glcd_set_start_line(0);
+ glcd_clear_now();
+}
+
+void glcd_spi_write(uint8_t c)
+{
+ GLCD_SELECT();
+ spi_transive(c, 1000);
+ GLCD_DESELECT();
+}
+
+void glcd_reset(void)
+{
+ GLCD_SELECT();
+ GLCD_RESET_LOW();
+ delay_ms(2);
+ GLCD_RESET_HIGH();
+ GLCD_DESELECT();
+}
+/*void GLCD_BKL_ON(void)
+{
+ GPIO_SetBits(GPIOA, GPIO_Pin_15);
+}
+void GLCD_BKL_OFF(void)
+{
+ GPIO_ResetBits(GPIOA, GPIO_Pin_15);
+}*/
diff --git a/lcd/glcd_spi.h b/lcd/glcd_spi.h
new file mode 100644
index 0000000..64a6249
--- /dev/null
+++ b/lcd/glcd_spi.h
@@ -0,0 +1,100 @@
+/**
+ * \file STM32F10x.h
+ * \brief Device implementation for ST STM32F10x ARM Cortex-M3 MCUs
+ * Requires the use of ST's Standard Peripheral Library
+ * \author Andy Gock
+ *
+ * \todo Code is untested!
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __glcd_spi_h__
+#define __glcd_spi_h__
+
+#include "spi.h"
+
+/** SPI port number e.g SPI1, SPI2 (not to be confused with GPIOA, GPIOB, etc) */
+#define CONTROLLER_SPI_NUMBER
+#define CONTROLLER_SPI_PORT
+#define CONTROLLER_SPI_SCK_PIN
+#define CONTROLLER_SPI_SCK_PINSRC
+#define CONTROLLER_SPI_MISO_PIN
+#define CONTROLLER_SPI_MISO_PINSRC
+#define CONTROLLER_SPI_MOSI_PIN
+#define CONTROLLER_SPI_MOSI_PINSRC
+
+#define CONTROLLER_SPI_SS_PORT
+#define CONTROLLER_SPI_SS_PIN
+#define CONTROLLER_SPI_DC_PORT GPIOC
+#define CONTROLLER_SPI_DC_PIN GPIO_Pin_10
+#define CONTROLLER_SPI_RST_PORT GPIOC
+#define CONTROLLER_SPI_RST_PIN GPIO_Pin_11
+
+#define GLCD_SELECT() SPI_SELECT_CH2()
+#define GLCD_DESELECT() SPI_DESELECT_CH2()
+#define GLCD_DC_LOW() GPIO_ResetBits(CONTROLLER_SPI_DC_PORT,CONTROLLER_SPI_DC_PIN)
+#define GLCD_DC_HIGH() GPIO_SetBits(CONTROLLER_SPI_DC_PORT,CONTROLLER_SPI_DC_PIN)
+#define GLCD_A0_LOW() GPIO_ResetBits(CONTROLLER_SPI_DC_PORT,CONTROLLER_SPI_DC_PIN)
+#define GLCD_A0_HIGH() GPIO_SetBits(CONTROLLER_SPI_DC_PORT,CONTROLLER_SPI_DC_PIN)
+#define GLCD_RESET_LOW() GPIO_ResetBits(CONTROLLER_SPI_RST_PORT,CONTROLLER_SPI_RST_PIN)
+#define GLCD_RESET_HIGH() GPIO_SetBits(CONTROLLER_SPI_RST_PORT,CONTROLLER_SPI_RST_PIN)
+/*#ifdef HW_V01
+#define GLCD_BKL_ON() GPIO_SetBits(GPIOD, GPIO_Pin_2)
+#define GLCD_BKL_OFF() GPIO_ResetBits(GPIOD, GPIO_Pin_2)
+#endif
+#ifdef HW_V02*/
+#define GLCD_BKL_ON() GPIO_SetBits(GPIOA, GPIO_Pin_15)
+#define GLCD_BKL_OFF() GPIO_ResetBits(GPIOA, GPIO_Pin_15)
+//#endif
+
+/**
+ * Initialise the LCD. This function is platform and controller specific.
+ */
+void glcd_HW_init(void);
+
+/**
+ * Write a byte to the connected SPI slave.
+ * \param c Byte to be written
+ * \return Returned value from SPI (often not used)
+ */
+void glcd_spi_write(uint8_t c);
+
+
+/**
+ * Reset the LCD.
+ * \note Not all LCD controllers support reset.
+ */
+void glcd_reset(void);
+
+void glcd_bkl_on(void);
+
+void glcd_bkl_off(void);
+
+#endif
+/* __glcd_spi_h__ */
diff --git a/lcd/glcd_text.h b/lcd/glcd_text.h
new file mode 100644
index 0000000..85b4e61
--- /dev/null
+++ b/lcd/glcd_text.h
@@ -0,0 +1,109 @@
+/**
+ \file glcd_text.h
+ \brief GLCD Library - Text functions
+ \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef GLCD_TEXT_H
+#define GLCD_TEXT_H
+
+/** \addtogroup Text
+ * Functions relating to using text fonts.
+ * @{
+ */
+
+/** \addtogroup StandardText Standard Text
+ * Functions relating to using text fonts of all sizes.
+ * @{
+ */
+
+/** Set GLCD font to predefined font table. Only suitable for MikroElektronika font storage format.
+ *
+ * \param font_table pointer to font table to be used
+ * \param width width of each character
+ * \param height height of each character
+ * \param start_char first character of font table
+ * \param end_char last character of font table
+ * \note Only suitable for MikroElektronika font storage format. For Stang format, use
+ * glcd_tiny_set_font()
+ * \see glcd_tiny_set_font()
+ */
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_set_font(PGM_P font_table, uint8_t width, uint8_t height, char start_char, char end_char);
+#else
+void glcd_set_font(const char * font_table, uint8_t width, uint8_t height, char start_char, char end_char);
+#endif
+
+/** Set GLCD font to predefined font table. Suitable for different different types of font tables.
+ *
+ * \param font_table pointer to font table to be used
+ * \param width width of each character
+ * \param height height of each character
+ * \param start_char first character of font table
+ * \param end_char last character of font table
+ * \param type font table type
+ * \note Only suitable for MikroElektronika font storage format. For Stang format, use
+ * glcd_tiny_set_font()
+ * \see glcd_tiny_set_font()
+ */
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_font(PGM_P font_table, uint8_t width, uint8_t height, char start_char, char end_char, font_table_type_t type);
+#else
+void glcd_font(const char * font_table, uint8_t width, uint8_t height, char start_char, char end_char, font_table_type_t type);
+#endif
+
+/** Draw a char at specified location.
+ * \param x x location to place top-left of character frame
+ * \param y y location to place top-left of character frame
+ * \param c character to be drawn
+ * \return width of character, 0 on error (e.g could not read font table)
+ */
+uint8_t glcd_draw_char_xy(uint8_t x, uint8_t y, char c);
+
+/** Draw a string at specified location.
+ * \param x x location to place top-left of character frame
+ * \param y y location to place top-left of character frame
+ * \param c pointer to string to be drawn
+ */
+void glcd_draw_string_xy(uint8_t x, uint8_t y, char *c);
+
+/** Draw a string from program memory at specified location.
+ * \param x x location to place top-left of character frame
+ * \param y y location to place top-left of character frame
+ * \param str pointer to string in program memory to be drawn
+ */
+void glcd_draw_string_xy_P(uint8_t x, uint8_t y, const char *str);
+
+/** @}*/
+
+/** @}*/
+
+#endif
diff --git a/lcd/glcd_text_tiny.h b/lcd/glcd_text_tiny.h
new file mode 100644
index 0000000..e8dc4d7
--- /dev/null
+++ b/lcd/glcd_text_tiny.h
@@ -0,0 +1,138 @@
+/**
+ \file glcd_text_tiny.h
+ \brief GLCD Library - Tiny Text functions.
+ \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef GLCD_TEXT_TINY_H
+#define GLCD_TEXT_TINY_H
+
+#include "stdint.h"
+
+/** \addtogroup TinyText Tiny Text
+ * Functions relating to using tiny 5x7 text fonts.
+ *
+ * Tiny text functions are usually used on a line by line basis. Each line being 8 bits high.
+ * Characters start on the top most bit and are 7 bits high, leaving a one bit space underneath.
+ *
+ * @{
+ */
+
+/** Set font to be used from now on. This is the tiny 5x7 monospace font.
+ * \param font_table flash pointer to start from font table
+ * \param width width of each character
+ * \param height height of each character
+ * \param start_char start character
+ * \param end_char end character
+ * \note Only suitable for Stang font storage format. For MikroElektronika format, use
+ * glcd_set_font()
+ * \see glcd_set_font()
+ */
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_tiny_set_font(PGM_P font_table, uint8_t width, uint8_t height, char start_char, char end_char);
+#else
+void glcd_tiny_set_font(const char *font_table, uint8_t width, uint8_t height, char start_char, char end_char);
+#endif
+
+/** Write character to LCD in tiny 5x7 font.
+ * \param x column position to start
+ * \param line line number to be written (each line is 8 pixels high)
+ * \param c char to be written
+ */
+void glcd_tiny_draw_char(uint8_t x, uint8_t line, char c);
+
+/** Write string to display buffer in tiny 5x7 font.
+ * Will wrap to next line if needed. Screen is not updated. Use glcd_write() to physically update display.
+ * \param x column position to start
+ * \param line line number to be written (each line is 8 pixels high)
+ * \param str string to be written
+ */
+void glcd_tiny_draw_string(uint8_t x, uint8_t line, char *str);
+
+/** Write flash string to display buffer in tiny 5x7 font.
+ * Will wrap to next line if needed. Screen is not updated. Use glcd_write() to physically update display.
+ * \param x column position to start
+ * \param line line to be written (each line is 8 pixels high)
+ * \param str string stored in flash memory to be written
+ */
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_tiny_draw_string_P(uint8_t x, uint8_t line, PGM_P str);
+#else
+void glcd_tiny_draw_string_P(uint8_t x, uint8_t line, const char *str);
+#endif
+
+/** Write string to bottom row of display.
+ * Screen buffer is scrolled up by one line. Screen is then physically updated.
+ * \param str string to be written
+ */
+void glcd_tiny_draw_string_ammend(char *str);
+
+/** Write string from flash memory to bottom row of display.
+ * Screen buffer is scrolled up by one line. Screen is then physically updated.
+ * \param str string to be written
+ */
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_tiny_draw_string_ammend_P(PGM_P str);
+#else
+void glcd_tiny_draw_string_ammend_P(const char *str);
+#endif
+
+/**
+ * Invert all contents of line number. Line 0 is the top most line.
+ * \param line Line number (0 is top most line)
+ */
+void glcd_tiny_invert_line(uint8_t line);
+
+/** Write character to LCD in tiny 5x7 font to specified X, Y location.
+ * If position is aligned with 8 bit line heights, use glcd_tiny_draw_char() instead
+ * as it will be faster.
+ *
+ * \param x column position to start
+ * \param y row position to start (pixel based, not 8 bit high rows)
+ * \param c char to be written
+ * \see glcd_tiny_draw_char()
+ * \note This does the same thing as glcd_tiny_draw_char_xy() but is limited to Stang format
+ * font tables.
+ */
+void glcd_tiny_draw_char_xy(uint8_t x, uint8_t y, char c);
+
+/** Initialise 5x7 text */
+#define GLCD_TEXT_INIT() glcd_tiny_set_font(Font5x7,5,7,32,127);
+
+/** Write string to bottom-most line after scrolling everything else up */
+#define GLCD_WRITE(str) glcd_tiny_draw_string_ammend(str)
+
+/** Write string from program memory to bottom-most line after scrolling everything else up */
+#define GLCD_WRITE_P(str) glcd_tiny_draw_string_ammend_P(str)
+
+/** @}*/
+
+#endif
diff --git a/lcd/graphics.c b/lcd/graphics.c
new file mode 100644
index 0000000..dec75c0
--- /dev/null
+++ b/lcd/graphics.c
@@ -0,0 +1,309 @@
+/**
+ \file graphics.c
+ \brief Functions relating to graphics. e.g drawing lines, rectangles, circles etc.
+ \author Andy Gock
+
+ Some functions based on Limor Fried's PCD8544 Arduino library.
+
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ Copyright (c) 2012, Adafruit Industries
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "glcd.h"
+
+/* Based on PCD8544 library by Limor Fried */
+void glcd_set_pixel(uint8_t x, uint8_t y, uint8_t color) {
+ if (x > (GLCD_LCD_WIDTH-1) || y > (GLCD_LCD_HEIGHT-1)) {
+ /* don't do anything if x/y is outside bounds of display size */
+ return;
+ }
+
+ if (color) {
+ /* Set black */
+ glcd_buffer[x+ (y/8)*GLCD_LCD_WIDTH] |= ( 1 << (y%8));
+ } else {
+ /* Set white */
+ glcd_buffer[x+ (y/8)*GLCD_LCD_WIDTH] &= ~ (1 << (y%8));
+ }
+
+ glcd_update_bbox(x,y,x,y);
+}
+
+/* Based on PCD8544 library by Limor Fried */
+uint8_t glcd_get_pixel(uint8_t x, uint8_t y) {
+ if ((x >= GLCD_LCD_WIDTH) || (y >= GLCD_LCD_HEIGHT)) {
+ return 0;
+ }
+
+ if ( glcd_buffer[x+ (y/8)*GLCD_LCD_WIDTH] & ( 1 << (y%8)) ) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void glcd_invert_pixel(uint8_t x, uint8_t y) {
+ if ((x >= GLCD_LCD_WIDTH) || (y >= GLCD_LCD_HEIGHT)) {
+ return;
+ }
+ glcd_update_bbox(x,y,x,y);
+ glcd_buffer[x+ (y/8)*GLCD_LCD_WIDTH] ^= ( 1 << (y%8));
+}
+
+/* Bresenham's algorithm - based on PCD8544 library Limor Fried */
+void glcd_draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color) {
+ uint8_t steep = abs(y1 - y0) > abs(x1 - x0);
+ uint8_t dx, dy;
+ int8_t err;
+ int8_t ystep;
+
+ if (steep) {
+ swap(x0, y0);
+ swap(x1, y1);
+ }
+
+ if (x0 > x1) {
+ swap(x0, x1);
+ swap(y0, y1);
+ }
+
+ glcd_update_bbox( x0, y0, x1, y1 );
+
+ dx = x1 - x0;
+ dy = abs(y1 - y0);
+
+ err = dx / 2;
+
+ if (y0 < y1) {
+ ystep = 1;
+ } else {
+ ystep = -1;
+ }
+
+ for (; x0<=x1; x0++) {
+ if (steep) {
+ glcd_set_pixel(y0, x0, color);
+ } else {
+ glcd_set_pixel(x0, y0, color);
+ }
+ err -= dy;
+ if (err < 0) {
+ y0 += ystep;
+ err += dx;
+ }
+ }
+}
+
+void glcd_fill_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color)
+{
+ int16_t i;
+ for (i=x; i<x+w; i++) {
+ int16_t j;
+ for (j=y; j<y+h; j++) {
+ glcd_set_pixel(i, j, color);
+ }
+ }
+ glcd_update_bbox(x, y, x+w-1, y+h-1);
+}
+
+void glcd_draw_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color)
+{
+ int16_t i;
+ for (i=x; i<x+w; i++) {
+ glcd_set_pixel(i, y, color);
+ glcd_set_pixel(i, y+h-1, color);
+ }
+ for (i=y; i<y+h; i++) {
+ glcd_set_pixel(x, i, color);
+ glcd_set_pixel(x+w-1, i, color);
+ }
+ glcd_update_bbox(x, y, x+w-1, y+h-1);
+}
+
+void glcd_draw_rect_thick(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t tx, uint8_t ty, uint8_t color)
+{
+ int16_t i, t;
+
+ if (tx == 0) {
+ tx = 1;
+ }
+
+ if (ty == 0) {
+ ty = 1;
+ }
+
+ for (i=x; i<x+w; i++) {
+ /* Top and bottom sides */
+ for (t=0; t<(ty); t++) {
+ glcd_set_pixel(i, y+t, color);
+ glcd_set_pixel(i, y+h-1-t, color);
+ }
+ }
+ for (i=y; i<y+h; i++) {
+ /* Left and right sides */
+ for (t=0; t<(tx); t++) {
+ glcd_set_pixel(x+t, i, color);
+ glcd_set_pixel(x+w-1-t, i, color);
+ }
+ }
+ glcd_update_bbox(x, y, x+w-1, y+h-1);
+}
+
+void glcd_draw_rect_shadow(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color)
+{
+ glcd_draw_rect(x, y, w, h, color);
+ glcd_draw_line(x+1, y+h, x+w, y+h, color);
+ glcd_draw_line(x+w, y+1, x+w, y+h, color);
+}
+
+void glcd_draw_circle(uint8_t x0, uint8_t y0, uint8_t r, uint8_t color)
+{
+
+ int8_t f = 1 - r;
+ int8_t ddF_x = 1;
+ int8_t ddF_y = -2 * r;
+ int8_t x = 0;
+ int8_t y = r;
+
+ glcd_update_bbox(x0-r, y0-r, x0+r, y0+r);
+
+ glcd_set_pixel(x0, y0+r, color);
+ glcd_set_pixel(x0, y0-r, color);
+ glcd_set_pixel(x0+r, y0, color);
+ glcd_set_pixel(x0-r, y0, color);
+
+ while (x<y) {
+ if (f >= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+
+ glcd_set_pixel(x0 + x, y0 + y, color);
+ glcd_set_pixel(x0 - x, y0 + y, color);
+ glcd_set_pixel(x0 + x, y0 - y, color);
+ glcd_set_pixel(x0 - x, y0 - y, color);
+
+ glcd_set_pixel(x0 + y, y0 + x, color);
+ glcd_set_pixel(x0 - y, y0 + x, color);
+ glcd_set_pixel(x0 + y, y0 - x, color);
+ glcd_set_pixel(x0 - y, y0 - x, color);
+
+ }
+}
+
+void glcd_fill_circle(uint8_t x0, uint8_t y0, uint8_t r, uint8_t color)
+{
+
+ int8_t f = 1 - r;
+ int8_t ddF_x = 1;
+ int8_t ddF_y = -2 * r;
+ int8_t x = 0;
+ int8_t y = r;
+
+ int16_t i;
+
+ glcd_update_bbox(x0-r, y0-r, x0+r, y0+r);
+
+ for (i=y0-r; i<=y0+r; i++) {
+ glcd_set_pixel(x0, i, color);
+ }
+
+ while (x < y) {
+ if (f >= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+
+ for (i=y0-y; i<=y0+y; i++) {
+ glcd_set_pixel(x0+x, i, color);
+ glcd_set_pixel(x0-x, i, color);
+ }
+ for (i=y0-x; i<=y0+x; i++) {
+ glcd_set_pixel(x0+y, i, color);
+ glcd_set_pixel(x0-y, i, color);
+ }
+ }
+}
+
+void glcd_invert_area(uint8_t x, uint8_t y, uint8_t w, uint8_t h)
+{
+ uint8_t xx, yy;
+ for (xx = x; xx < (x+w); xx++) {
+ /* Loop through each partial column */
+ for (yy = y; yy < (y+h); yy++) {
+ /* Go down and invert every pixel */
+ glcd_invert_pixel(xx,yy);
+ }
+ }
+}
+
+void glcd_draw_bitmap(const unsigned char *data)
+{
+
+#if 0
+ /* Testing purposes only: Writing to the LCD right away (not for AVR) */
+ /* Normally, we do not do this, we just write to the screen buffer */
+ uint8_t *original_buffer;
+
+ /* Save the location of original screen buffer */
+ original_buffer = glcd_buffer_selected;
+
+ /* Use bitmap location as screen buffer (this won't work when using AVR8 PGM_P) */
+ glcd_select_screen((uint8_t *)data, glcd_bbox_selected);
+
+ /* Make sure we write the entre display */
+ glcd_bbox_refresh();
+ glcd_write();
+
+ /* Restore the screen buffer back to original */
+ glcd_select_screen(original_buffer, glcd_bbox_selected);
+#endif
+
+ /* Copy bitmap data to the screen buffer */
+#if defined(GLCD_DEVICE_AVR8)
+ memcpy_P(glcd_buffer_selected, data, (GLCD_LCD_WIDTH * GLCD_LCD_HEIGHT / 8));
+#else
+ memcpy(glcd_buffer_selected, data, (GLCD_LCD_WIDTH * GLCD_LCD_HEIGHT / 8));
+#endif
+
+ glcd_bbox_refresh();
+}
diff --git a/lcd/graphs.c b/lcd/graphs.c
new file mode 100644
index 0000000..fb1f034
--- /dev/null
+++ b/lcd/graphs.c
@@ -0,0 +1,120 @@
+/**
+ \file graphs.c
+ \brief Functions relating to graphs. e.g bar graphs etc.
+ \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "glcd.h"
+
+static uint8_t glcd_map(uint8_t x1, uint8_t x2, uint8_t x);
+
+void glcd_bar_graph_horizontal(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val)
+{
+ if (height < 3) {
+ return;
+ }
+ glcd_draw_rect(x, y, width, height, BLACK);
+ glcd_fill_rect(x+1, y+1, glcd_map(0,width-2,val), height-2 , BLACK);
+}
+
+void glcd_bar_graph_horizontal_no_border(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val)
+{
+ if (height < 3) {
+ return;
+ }
+ glcd_fill_rect(x, y, glcd_map(0,width,val), height , BLACK);
+}
+
+void glcd_bar_graph_vertical(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val)
+{
+ glcd_draw_rect(x, y, width, height, BLACK);
+ glcd_fill_rect(x+1, y+1+glcd_map(0,height-2,255-val), width-2, height-2-glcd_map(0,height-2,255-val), BLACK);
+}
+
+void glcd_bar_graph_vertical_no_border(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val)
+{
+ glcd_fill_rect(x, y+glcd_map(0,height-2,255-val), width, height-2-glcd_map(0,height-2,255-val), BLACK);
+}
+
+void glcd_scrolling_bar_graph(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val)
+{
+ uint8_t nx, ny;
+ uint8_t color;
+
+ /* Draw border of graph */
+ glcd_draw_rect(x,y,width,height,BLACK);
+
+ /* Scroll inner contents left by one pixel width */
+ for (ny = 1; ny <= (height-2); ny++) {
+ /* Redraw each horizontal line */
+ for (nx = 1; nx <= (width-2); nx += 1) {
+ color = glcd_get_pixel(x+nx+1,y+ny);
+ glcd_set_pixel(x+nx,y+ny,color);
+ }
+ }
+
+ val = val * (height-3) / 255;
+
+ /* Make sure we're not exceeding the size of box interior */
+ if (val > (height-3)) {
+ val = height - 3;
+ }
+
+ /* Draw new bar - both black and white portions*/
+ glcd_draw_line(x+width-2,y+height-2,x+width-2,y+height-2-val,BLACK);
+ glcd_draw_line(x+width-2,y+height-3-val,x+width-2,y+1,WHITE);
+
+ /* Write to display */
+ glcd_write();
+}
+
+void glcd_scrolling_bar_graph_timing(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t val, uint8_t line_width, uint16_t delay)
+{
+ uint8_t n;
+ if (line_width == 0) {
+ line_width = 1;
+ }
+
+ /* Adjust graph line's width by just running glcd_scrolling_bar_graph() x number of times */
+ /* \todo This should be done differently! */
+ for (n=0; n<line_width; n++) {
+ glcd_scrolling_bar_graph(x,y,width,height,val);
+ }
+
+ if (delay) {
+ delay_ms(delay);
+ }
+}
+
+static uint8_t glcd_map(uint8_t x1, uint8_t x2, uint8_t x)
+{
+ return x1+(x2-x1)*x/255;
+}
diff --git a/lcd/spi.c b/lcd/spi.c
new file mode 100644
index 0000000..23bb27a
--- /dev/null
+++ b/lcd/spi.c
@@ -0,0 +1,79 @@
+#include "spi.h"
+
+static void spi_gpio_init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_13;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+}
+
+static void spi_cs_init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+ GPIO_SetBits(GPIOB, GPIO_Pin_12);
+ GPIO_SetBits(GPIOC, GPIO_Pin_7);
+ GPIO_SetBits(GPIOA, GPIO_Pin_8);
+}
+
+void spi_init(void)
+{
+ SPI_InitTypeDef SPI_InitStructure;
+
+ spi_cs_init();
+ spi_gpio_init();
+
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
+ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
+ SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+ SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
+ SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
+ SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
+ SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
+ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
+ SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
+ SPI_InitStructure.SPI_CRCPolynomial = 7;
+ SPI_Init(SPI2, &SPI_InitStructure);
+
+ SPI_Cmd(SPI2, ENABLE);
+}
+
+//transmit/receive
+uint8_t spi_transive(uint8_t byte, uint32_t timeout)
+{
+ uint32_t timer;
+
+ timer = timeout;
+ while((SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)&&timer)
+ {
+ timer --;
+ }
+ SPI_I2S_SendData(SPI2, byte);
+
+ timer = timeout;
+ while((SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)&&timer)
+ {
+ timer --;
+ }
+ return SPI_I2S_ReceiveData(SPI2);
+}
diff --git a/lcd/spi.h b/lcd/spi.h
new file mode 100644
index 0000000..89a3c5b
--- /dev/null
+++ b/lcd/spi.h
@@ -0,0 +1,19 @@
+#ifndef __spi_h__
+#define __spi_h__
+
+#include "stm32f10x.h"
+
+#define SPI_SELECT_CH1() GPIO_ResetBits(GPIOB, GPIO_Pin_12)
+#define SPI_DESELECT_CH1() GPIO_SetBits(GPIOB, GPIO_Pin_12)
+
+#define SPI_SELECT_CH2() GPIO_ResetBits(GPIOA, GPIO_Pin_8)
+#define SPI_DESELECT_CH2() GPIO_SetBits(GPIOA, GPIO_Pin_8)
+
+
+#define SPI_SELECT_CH3() GPIO_ResetBits(GPIOC, GPIO_Pin_7)
+#define SPI_DESELECT_CH3() GPIO_SetBits(GPIOC, GPIO_Pin_7)
+
+extern void spi_init(void);
+extern uint8_t spi_transive(uint8_t byte, uint32_t timeout);
+
+#endif
diff --git a/lcd/text.c b/lcd/text.c
new file mode 100644
index 0000000..23bfa5d
--- /dev/null
+++ b/lcd/text.c
@@ -0,0 +1,321 @@
+
+/**
+ \file text.c
+ \brief Functions relating to using text fonts of all sizes.
+ \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "glcd.h"
+
+extern uint8_t *glcd_buffer_selected;
+extern glcd_BoundingBox_t *glcd_bbox_selected;
+
+glcd_FontConfig_t font_current;
+
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_set_font(PGM_P font_table, uint8_t width, uint8_t height, char start_char, char end_char)
+#else
+void glcd_set_font(const char * font_table, uint8_t width, uint8_t height, char start_char, char end_char)
+#endif
+{
+ /* Supports variable width fonts */
+ font_current.font_table = font_table;
+ font_current.width = width;
+ font_current.height = height;
+ font_current.start_char = start_char;
+ font_current.end_char = end_char;
+ font_current.table_type = MIKRO; /* Only supports MikroElektronika generated format at the moment */
+}
+
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_font(PGM_P font_table, uint8_t width, uint8_t height, char start_char, char end_char, font_table_type_t type)
+#else
+void glcd_font(const char * font_table, uint8_t width, uint8_t height, char start_char, char end_char, font_table_type_t type)
+#endif
+{
+ /* Supports variable width fonts */
+ font_current.font_table = font_table;
+ font_current.width = width;
+ font_current.height = height;
+ font_current.start_char = start_char;
+ font_current.end_char = end_char;
+ font_current.table_type = type; /* Only supports MikroElektronika generated format at the moment */
+}
+
+uint8_t glcd_draw_char_xy(uint8_t x, uint8_t y, char c)
+{
+ if (c < font_current.start_char || c > font_current.end_char) {
+ c = '.';
+ }
+
+ if (font_current.table_type == STANG) {
+ /* Font table in Pascal Stang format (single byte height with with no width specifier) */
+ /* Maximum height of 8 bits only */
+
+ uint8_t i;
+ for ( i = 0; i < font_current.width; i++ ) {
+#if defined(GLCD_DEVICE_AVR8)
+ uint8_t dat = pgm_read_byte( font_current.font_table + ((c - font_current.start_char) * (font_current.width)) + i );
+#else
+ uint8_t dat = *( font_current.font_table + ((c - font_current.start_char) * (font_current.width)) + i );
+#endif
+ uint8_t j;
+
+ if(glcd_get_reverse_sta())
+ dat = ~dat;
+ for (j = 0; j < 8; j++) {
+ /* Set pixel color for each bit of the column (8-bits) */
+ if (x+i >= GLCD_LCD_WIDTH || y+j >= GLCD_LCD_HEIGHT) {
+ /* Don't try and write past the dimensions of the LCD */
+ return 0;
+ }
+ if (dat & (1<<j)) {
+ glcd_set_pixel(x+i,y+j,BLACK);
+ } else {
+ glcd_set_pixel(x+i,y+j,WHITE);
+ }
+ }
+ }
+
+ /* always return how many pixels of width were written */
+ /* here for "stang" format fonts, it is always fixed */
+ return font_current.width;
+
+ } else if (font_current.table_type == MIKRO) {
+ /* Font table in MikroElecktronica format
+ - multi row fonts allowed (more than 8 pixels high)
+ - variable width fonts allowed
+ a complete column is written before moving to the next */
+
+ uint8_t i;
+ uint8_t var_width;
+ uint8_t bytes_high;
+ uint8_t bytes_per_char;
+ const char *p;
+
+ if ((font_current.height % 8) > 0){
+ bytes_high = (font_current.height / 8) + 1;
+ }
+ else{
+ bytes_high = (font_current.height / 8);
+ }
+ bytes_per_char = font_current.width * bytes_high + 1; /* The +1 is the width byte at the start */
+
+ p = font_current.font_table + (c - font_current.start_char) * bytes_per_char;
+
+ /* The first byte per character is always the width of the character */
+#if defined(GLCD_DEVICE_AVR8)
+ var_width = pgm_read_byte(p);
+#else
+ var_width = *p;
+#endif
+ p++; /* Step over the variable width field */
+
+ /*
+ if (x+var_width >= GLCD_LCD_WIDTH || y+font_current.height >= GLCD_LCD_HEIGHT) {
+ return;
+ }
+ */
+
+ for ( i = 0; i < var_width; i++ ) {
+ uint8_t j;
+ for ( j = 0; j < bytes_high; j++ ) {
+#if defined(GLCD_DEVICE_AVR8)
+ uint8_t dat = pgm_read_byte( p + i*bytes_high + j );
+#else
+ uint8_t dat = *( p + i*bytes_high + j );
+#endif
+ uint8_t bit;
+
+ if(glcd_get_reverse_sta())
+ dat = ~dat;
+ for (bit = 0; bit < 8; bit++) {
+
+ if (x+i >= GLCD_LCD_WIDTH || y+j*8+bit >= GLCD_LCD_HEIGHT) {
+ /* Don't write past the dimensions of the LCD, skip the entire char */
+ return 0;
+ }
+
+ /* We should not write if the y bit exceeds font height */
+ if ((j*8 + bit) >= font_current.height) {
+ /* Skip the bit */
+ continue;
+ }
+
+ if (dat & (1<<bit)) {
+ glcd_set_pixel(x+i,y+j*8+bit,BLACK);
+ } else {
+ glcd_set_pixel(x+i,y+j*8+bit,WHITE);
+ }
+ }
+ }
+ }
+ return var_width;
+
+ } else if (font_current.table_type == GLCD_UTILS) {
+ /* Font table format of glcd-utils
+ - A complete row is written first (not completed columns)
+ - Width not stored, but we can search and determine it
+ - Not yet supported */
+
+ uint8_t var_width, n;
+ uint8_t bytes_high, bytes_per_char;
+ const char *p;
+ uint8_t j;
+
+ bytes_high = font_current.height / 8 + 1;
+ bytes_per_char = font_current.width * bytes_high;
+
+ /* Point to chars first byte */
+ p = font_current.font_table + (c - font_current.start_char) * bytes_per_char;
+
+ /* Determine the width of the character */
+ var_width = font_current.width;
+
+ n = 0; /* How many columns back from the end */
+
+ while (1) {
+ uint8_t max_byte = 0;
+ uint8_t row = 0;
+
+ for (row = 0; row < bytes_high; row++) {
+ uint8_t offset;
+ offset = (font_current.width - 1 - n) * row;
+ max_byte = *(p + offset);
+ }
+ if (max_byte == 0) {
+ /* column is empty for all rows, go left and test again */
+ /* reduce variable width by 1 */
+ var_width--;
+ if (var_width == 0) {
+ break;
+ }
+ } else {
+ break; /* Part of a character was found */
+ }
+ n++;
+ }
+
+ /* Uncomment line below, to force fixed width, for debugging only */
+ //var_width = font_current.width; // bypass auto width detection, treat as fixed width
+
+ /* For glcd-utils format, we write one complete row at a time */
+ /* loop as rows, 1st row, j=0 */
+ for ( j = 0; j < bytes_high; j++ ) {
+ /* Loop one row at a time */
+
+ uint8_t i;
+ for ( i = 0; i < var_width; i++ ) {
+ /* Loop one column at a time */
+
+ uint8_t dat, bit;
+
+#if defined(GLCD_DEVICE_AVR8)
+ dat = pgm_read_byte( p + j*font_current.width + i );
+#else
+ dat = *( p + j*font_current.width + i );
+#endif
+
+ if(glcd_get_reverse_sta())
+ dat = ~dat;
+
+ for (bit = 0; bit < 8; bit++) {
+
+ if ((x+i) >= GLCD_LCD_WIDTH || (y+j*8+bit) >= GLCD_LCD_HEIGHT) {
+ /* Don't write past the dimensions of the LCD, skip the entire char */
+ return 0;
+ }
+
+ /* We should not write if the y bit exceeds font height */
+ if ((j*8 + bit) >= font_current.height) {
+ /* Skip the bit */
+ continue;
+ }
+
+ if (dat & (1<<bit)) {
+ glcd_set_pixel(x+i,y+j*8+bit,BLACK);
+ } else {
+ glcd_set_pixel(x+i,y+j*8+bit,WHITE);
+ }
+ }
+ } /* i */
+ } /* j */
+
+ return var_width; /* Number of columns written to display */
+
+ } else {
+ /* Don't recognise the font table */
+ return 0;
+
+ }
+
+}
+
+void glcd_draw_string_xy(uint8_t x, uint8_t y, char *c)
+{
+ uint8_t width;
+
+ if (y > (GLCD_LCD_HEIGHT - font_current.height - 1)) {
+ /* Character won't fit */
+ return;
+ }
+
+ while (*c) {
+ width = glcd_draw_char_xy(x,y,*c);
+ x += (width + 1);
+ c++;
+ }
+}
+
+void glcd_draw_string_xy_P(uint8_t x, uint8_t y, const char *str)
+{
+ uint8_t width;
+
+ if (y > (GLCD_LCD_HEIGHT - font_current.height - 1)) {
+ /* Character won't fit */
+ return;
+ }
+
+ while (1) {
+#if defined(GLCD_DEVICE_AVR8)
+ char c = pgm_read_byte(str++);
+#else
+ char c = *(str++);
+#endif
+ if (!c)
+ return;
+
+ width = glcd_draw_char_xy(x,y,c);
+ x += (width + 1);
+ c++;
+ }
+}
+
diff --git a/lcd/text_tiny.c b/lcd/text_tiny.c
new file mode 100644
index 0000000..ade6d4e
--- /dev/null
+++ b/lcd/text_tiny.c
@@ -0,0 +1,177 @@
+/**
+ \file text_tiny.c
+ \brief Functions relating to using tiny 5x7 text fonts.
+ \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "glcd.h"
+
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_tiny_set_font(PGM_P font_table, uint8_t width, uint8_t height, char start_char, char end_char)
+#else
+void glcd_tiny_set_font(const char * font_table, uint8_t width, uint8_t height, char start_char, char end_char)
+#endif
+{
+ font_current.font_table = font_table;
+ font_current.width = width;
+ font_current.height = height;
+ font_current.start_char = start_char;
+ font_current.end_char = end_char;
+ font_current.table_type = STANG;
+}
+
+void glcd_tiny_draw_char(uint8_t x, uint8_t line, char c)
+{
+ uint8_t i;
+
+ /* Only works for fonts < 8 bits in height */
+ if (font_current.height >= 8) {
+ return;
+ }
+ if (c < font_current.start_char || c > font_current.end_char) {
+ c = '.';
+ }
+ if ( line >= GLCD_LCD_HEIGHT / (font_current.height + 1) ) {
+ return;
+ }
+ if ( (x+font_current.width) >= GLCD_LCD_WIDTH ) {
+ return;
+ }
+
+ glcd_update_bbox(x, line*(font_current.height + 1), x+font_current.width, line*(font_current.height + 1) + (font_current.height + 1));
+
+ for ( i = 0; i < font_current.width; i++ ) {
+#if defined(GLCD_DEVICE_AVR8)
+ glcd_buffer_selected[x + (line * GLCD_LCD_WIDTH)] = pgm_read_byte( font_current.font_table + ((c - font_current.start_char) * (font_current.width)) + i );
+#else
+ glcd_buffer_selected[x + (line * GLCD_LCD_WIDTH)] = *( font_current.font_table + ((c - font_current.start_char) * (font_current.width)) + i );
+#endif
+ x++;
+ }
+}
+
+void glcd_tiny_draw_string(uint8_t x, uint8_t line, char *str)
+{
+ if (font_current.height >= 8) {
+ return;
+ }
+ while (*str) {
+ glcd_tiny_draw_char(x, line, *str++);
+ x += (font_current.width + 1);
+ if ((x + font_current.width + 1) > GLCD_LCD_WIDTH) {
+ x = 0; /* Ran out of this line */
+ line++;
+ }
+ if (line >= (GLCD_LCD_HEIGHT/(font_current.height + 1)))
+ return; /* Ran out of space :( */
+ }
+}
+
+#if defined(GLCD_DEVICE_AVR8)
+void glcd_tiny_draw_string_P(uint8_t x, uint8_t line, PGM_P str)
+#else
+void glcd_tiny_draw_string_P(uint8_t x, uint8_t line, const char *str)
+#endif
+{
+ if (font_current.height >= 8) {
+ return;
+ }
+ while (1) {
+#if defined(GLCD_DEVICE_AVR8)
+ char c = pgm_read_byte(str++);
+#else
+ char c = *(str++);
+#endif
+ if (!c)
+ return;
+
+ glcd_tiny_draw_char(x, line, c);
+
+ x += (font_current.width + 1);
+ if ((x + font_current.width + 1) > GLCD_LCD_WIDTH) {
+ x = 0; /* Ran out of this line */
+ line++;
+ }
+ if (line >= (GLCD_LCD_HEIGHT/(font_current.height + 1)))
+ return; /* Ran out of space :( */
+ }
+}
+
+void glcd_tiny_draw_string_ammend(char *str) {
+ glcd_scroll_line();
+ glcd_tiny_draw_string(0, (GLCD_LCD_HEIGHT/8-1), str);
+ glcd_write();
+}
+
+void glcd_tiny_draw_string_ammend_P(const char *str) {
+ glcd_scroll_line();
+ glcd_tiny_draw_string_P(0, (GLCD_LCD_HEIGHT/8-1), str);
+ glcd_write();
+}
+
+void glcd_tiny_invert_line(uint8_t line)
+{
+ glcd_invert_area(0,line*8,GLCD_LCD_WIDTH-1,8);
+}
+
+void glcd_tiny_draw_char_xy(uint8_t x, uint8_t y, char c)
+{
+ uint8_t i;
+ uint8_t xvar, yvar;
+ uint8_t dat;
+
+ /* Only works for fonts < 8 bits in height */
+
+ /* Check all important bounds requirements are okay */
+ if ( (y >= GLCD_LCD_HEIGHT) || ((x+font_current.width) >= GLCD_LCD_WIDTH) || (font_current.height >= 8) || font_current.table_type != STANG) {
+ return;
+ }
+ if (c < font_current.start_char || c > font_current.end_char) {
+ c = '.';
+ }
+
+ xvar = x;
+
+ for ( i = 0; i < font_current.width; i++ ) {
+#if defined(GLCD_DEVICE_AVR8)
+ dat = pgm_read_byte( font_current.font_table + ((c - font_current.start_char) * (font_current.width)) + i );
+#else
+ dat = *( font_current.font_table + ((c - font_current.start_char) * (font_current.width)) + i );
+#endif
+ for (yvar = 0; yvar < font_current.height; yvar++) {
+ glcd_set_pixel(xvar,y+yvar, (dat & (1<<yvar) ? 1 : 0) );
+ }
+ xvar++;
+ }
+
+ glcd_update_bbox(x, y, x+font_current.width,y+font_current.height);
+
+}
diff --git a/lcd/unit_tests.c b/lcd/unit_tests.c
new file mode 100644
index 0000000..75f8bf1
--- /dev/null
+++ b/lcd/unit_tests.c
@@ -0,0 +1,334 @@
+/**
+ * \file unit_tests.c
+ * \brief Various test functions to demonstrate features of the library
+ * \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "glcd.h"
+#include "unit_tests.h"
+
+/** Fonts */
+#include "font5x7.h"
+#include "Liberation_Sans11x14_Numbers.h"
+#include "Liberation_Sans15x21_Numbers.h"
+#include "Liberation_Sans17x17_Alpha.h"
+#include "Liberation_Sans27x36_Numbers.h"
+#include "Bebas_Neue20x36_Bold_Numbers.h"
+
+volatile uint8_t unit_test_return = 0;
+
+/**
+ * Return from test procedure. Global var \p unit_test_return is set to 1 elsewhere,
+ * to signal function to return.
+ */
+#define DEMO_RETURN() if (unit_test_return) { unit_test_return = 0; return; }
+
+#if defined(GLCD_UNIT_TEST_BITMAP_ENABLE)
+ /* Open Source logo -- Size: 128x64 */
+ #if defined(GLCD_DEVICE_AVR8)
+ const unsigned char bmp_oslogo[] PROGMEM = {
+ #else
+ const unsigned char bmp_oslogo[] = {
+ #endif /* GLCD_DEVICE_AVR8 */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xfe, 0xfc, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf0, 0xe0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xf0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1f, 0x7f,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x1f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00
+, 0x00 //
+ };
+#endif /* GLCD_UNIT_TEST_BITMAP_ENABLE */
+
+void glcd_test_circles(void)
+{
+ uint8_t x,y,radius;
+
+ unit_test_return = 0;
+ while (1) {
+ uint8_t i;
+
+ glcd_clear();
+
+ // generate random(ish) position on display
+ x = rand() % GLCD_LCD_WIDTH;
+ y = rand() % GLCD_LCD_HEIGHT;
+ radius = rand() % 50;
+
+ //x = 70; y=25; radius=50; // for debugging
+
+ // fill circle with black
+
+ for (i=0; i<=radius; i++) {
+ glcd_fill_circle(x,y,i,BLACK);
+ glcd_write();
+ delay_ms(2);
+ }
+
+ // fill the same circle above but with white
+ for (i=0; i<=radius; i++) {
+ glcd_fill_circle(x,y,i,WHITE);
+ glcd_write();
+ delay_ms(1);
+ }
+ DEMO_RETURN();
+ }
+}
+
+void glcd_test_counter_and_graph(void)
+{
+ uint8_t count = 0;
+ char string[8] = "";
+
+ unit_test_return = 0;
+ while(1) {
+ glcd_clear_buffer();
+
+ //glcd_tiny_set_font(Font5x7,5,7,32,127);
+ //glcd_draw_string_xy(0,40,(char *)utoa(count,string,10));
+
+ glcd_set_font(Liberation_Sans15x21_Numbers,15,21,46,57);
+ //glcd_set_font(Liberation_Sans27x36_Numbers,27,36,46,57);
+ //glcd_set_font(Bebas_Neue20x36_Bold_Numbers,20,36,46,57);
+ //glcd_set_font(Bebas_Neue18x36_Numbers,18,36,46,57);
+ //glcd_set_font(HelveticaNeueLT_Com_57_Cn23x35_Numbers,23,35,46,57); // commercial font - not for public distribution
+
+ sprintf(string,"%d",count);
+ glcd_draw_string_xy(0,0,string);
+ glcd_bar_graph_horizontal(10,38,30,6,count*4);
+ glcd_bar_graph_vertical(70,0,8,30,count*2);
+
+ glcd_write();
+ count += 1;
+
+ DEMO_RETURN();
+ }
+
+}
+
+/* Test glcd-utils font table type, increments and display a 16-bit number over and over */
+#include "Earthbound_12x19_48to57.h"
+void glcd_test_glcdutils(void)
+{
+ uint16_t count = 0;
+ char string[8] = "";
+
+ unit_test_return = 0;
+ while(1) {
+ glcd_clear_buffer();
+
+ /* Set the font */
+ glcd_font(font_Earthbound_12x19_48to57,12,19,48,57,GLCD_UTILS);
+
+ sprintf(string,"%d",count);
+ glcd_draw_string_xy(0,0,string);
+ glcd_write();
+
+ count += 1;
+
+ DEMO_RETURN();
+ }
+}
+
+void glcd_test_text_up_down(void)
+{
+ // moves some text up and down the display
+
+ uint8_t y;
+ uint8_t max_y;
+
+ //glcd_set_font(Liberation_Sans11x14_Numbers,11,14,46,57);
+ glcd_set_font(Liberation_Sans15x21_Numbers,15,21,46,57);
+ //glcd_set_font(Liberation_Sans27x36_Numbers,27,36,46,57);
+ //glcd_set_font(Liberation_Sans17x17_Alpha,17,17,46,90);
+
+ max_y = GLCD_LCD_HEIGHT - font_current.height - 2; // max y start position for draw_string
+
+ unit_test_return = 0;
+ while(1) {
+ // move top to bottom
+ for (y=0; y<max_y; y++) {
+ DEMO_RETURN();
+ glcd_clear_buffer();
+ glcd_draw_string_xy(0,y,"123");
+ glcd_write();
+ delay_ms(80);
+ }
+
+ // move bottom to top
+ for (y=(max_y); y>0; y--) {
+ DEMO_RETURN();
+ glcd_clear_buffer();
+ glcd_draw_string_xy(0,y,"456");
+ glcd_write();
+ delay_ms(80);
+ }
+
+ }
+
+}
+
+void glcd_test_tiny_text(void)
+{
+ /* Write tiny text on display, all chars, scrolling up every second */
+
+ char string[GLCD_LCD_WIDTH / 6 + 1];
+
+ uint8_t c = 32;
+ uint8_t len = GLCD_LCD_WIDTH / 6;
+
+ GLCD_TEXT_INIT();
+
+ unit_test_return = 0;
+ while(1) {
+ // write chars to string from 32 to 127 ASCII
+ uint8_t i;
+ for (i=0; i<len; i++) {
+ string[i] = c;
+ c++;
+ if (c > 127) {
+ c = 32;
+ }
+ }
+
+ // write null terminator
+ string[len] = '\0';
+
+ GLCD_WRITE(string);
+
+ DEMO_RETURN();
+
+ delay_ms(1000);
+ }
+
+}
+
+void glcd_test_hello_world(void)
+{
+ glcd_tiny_set_font(Font5x7,5,7,32,127);
+ glcd_clear_buffer();
+ glcd_tiny_draw_string(0,0,"Hello World!");
+ glcd_write();
+
+ unit_test_return = 0;
+ while(1) {
+ DEMO_RETURN();
+ }
+}
+
+void glcd_test_rectangles(void)
+{
+ glcd_tiny_set_font(Font5x7,5,7,32,127);
+ glcd_clear_buffer();
+ glcd_tiny_draw_string(0,0,"RECTANGLE DEMO");
+ glcd_write();
+ delay_ms(200);
+
+ unit_test_return = 0;
+ while(1) {
+
+ //glcd_clear();
+ glcd_draw_rect(0,0,100,50,BLACK);
+ glcd_tiny_draw_string(0,GLCD_NUMBER_OF_BANKS-1,"glcd_draw_rect");
+ glcd_write();
+ delay_ms(500);
+ DEMO_RETURN();
+
+ glcd_clear();
+ glcd_tiny_draw_string(0,GLCD_NUMBER_OF_BANKS-1,"glcd_draw_rect_thick");
+ glcd_write();
+
+ glcd_draw_rect_thick(5,5,80,30,3,6,BLACK);
+ glcd_write();
+ delay_ms(500);
+ DEMO_RETURN();
+
+ glcd_draw_rect_thick(0,0,20,20,2,2,BLACK);
+ glcd_write();
+ delay_ms(500);
+ DEMO_RETURN();
+
+ glcd_draw_rect_thick(100,10,20,20,5,5,BLACK);
+ glcd_write();
+ delay_ms(500);
+ DEMO_RETURN();
+
+ glcd_clear();
+ glcd_tiny_draw_string(0,GLCD_NUMBER_OF_BANKS-1,"glcd_draw_rect_shadow");
+ glcd_draw_rect_shadow(0,0,45,30,BLACK);
+ glcd_write();
+ delay_ms(500);
+ DEMO_RETURN();
+
+ glcd_draw_rect_shadow(95,5,30,30,BLACK);
+ glcd_write();
+ delay_ms(500);
+ DEMO_RETURN();
+
+ }
+
+}
+
+void glcd_test_scrolling_graph(void)
+{
+ glcd_clear();
+ glcd_write();
+
+ unit_test_return = 0;
+ while(1) {
+ uint16_t n;
+ for (n=0; n<=255; n += 20) {
+ glcd_scrolling_bar_graph(0,0,50,50,n);
+ glcd_scrolling_bar_graph(60,0,50,30,n);
+ glcd_scrolling_bar_graph(60,35,60,20,n);
+ DEMO_RETURN();
+ }
+ for (n=0; n<=255; n += 20) {
+ glcd_scrolling_bar_graph(0,0,50,50,255-n);
+ glcd_scrolling_bar_graph(60,0,50,30,n);
+ glcd_scrolling_bar_graph(60,35,60,20,n);
+ DEMO_RETURN();
+ }
+ }
+}
+
+#if defined (GLCD_UNIT_TEST_BITMAP_ENABLE)
+void glcd_test_bitmap_128x64(void)
+{
+ glcd_draw_bitmap(bmp_oslogo);
+
+ unit_test_return = 0;
+ glcd_write();
+ while (1) {
+ DEMO_RETURN();
+ }
+}
+#endif
diff --git a/lcd/unit_tests.h b/lcd/unit_tests.h
new file mode 100644
index 0000000..f3540ba
--- /dev/null
+++ b/lcd/unit_tests.h
@@ -0,0 +1,71 @@
+/**
+ * \file unit_tests.h
+ * \brief Various test functions to demonstrate features of the library
+ * \author Andy Gock
+ */
+
+/*
+ Copyright (c) 2012, Andy Gock
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Andy Gock nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL ANDY GOCK BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _UNIT_TESTS_H
+#define _UNIT_TESTS_H
+
+#include "stdint.h"
+
+#define GLCD_UNIT_TEST_BITMAP_ENABLE
+
+extern volatile uint8_t unit_test_return;
+
+/** Make random "exploding circles" */
+void glcd_test_circles(void);
+
+/* Shows a 8-bit counter incorementing, with a verticla and horizontal bar graph */
+void glcd_test_counter_and_graph(void);
+
+/* Shows a 16-bit counter incrementing, using glcdutils font format */
+void glcd_test_glcdutils(void);
+
+/** Scroll some text up and down the screen */
+void glcd_test_text_up_down(void);
+
+/** Display all chars of tiny 5x7 font, scrolling previous lines one by one every second */
+void glcd_test_tiny_text(void);
+
+/** Print hello world to display */
+void glcd_test_hello_world(void);
+
+/** Demonstrating rectangle drawing */
+void glcd_test_rectangles(void);
+
+/** Demonstrate scrolling bar graph */
+void glcd_test_scrolling_graph(void);
+
+/** Demonstrate bitmap display */
+void glcd_test_bitmap_128x64(void);
+
+#endif