summary refs log tree commit diff
path: root/F2024/coe718/labs/lab2/bitbanding
diff options
context:
space:
mode:
Diffstat (limited to 'F2024/coe718/labs/lab2/bitbanding')
-rwxr-xr-xF2024/coe718/labs/lab2/bitbanding/Font_16x24_h.h472
-rwxr-xr-xF2024/coe718/labs/lab2/bitbanding/Font_6x8_h.h248
-rwxr-xr-xF2024/coe718/labs/lab2/bitbanding/GLCD.h59
-rwxr-xr-xF2024/coe718/labs/lab2/bitbanding/GLCD_SPI_LPC1700.c928
-rwxr-xr-xF2024/coe718/labs/lab2/bitbanding/bitband.c115
-rwxr-xr-xF2024/coe718/labs/lab2/bitbanding/bitband.h71
6 files changed, 1893 insertions, 0 deletions
diff --git a/F2024/coe718/labs/lab2/bitbanding/Font_16x24_h.h b/F2024/coe718/labs/lab2/bitbanding/Font_16x24_h.h
new file mode 100755
index 0000000..b3a4a22
--- /dev/null
+++ b/F2024/coe718/labs/lab2/bitbanding/Font_16x24_h.h
@@ -0,0 +1,472 @@
+/*----------------------------------------------------------------------------

+ * Name:    Font_16x24_h.h

+ * Purpose: ASCII font characters (width 16 pixels, height 24 pixels, 

+ *          horizontal pixel packing)

+ *----------------------------------------------------------------------------

+ * This file is part of the uVision/ARM development tools.

+ * This software may only be used under the terms of a valid, current,

+ * end user licence from KEIL for a compatible version of KEIL software

+ * development tools. Nothing else gives you the right to use this software.

+ *

+ * This software is supplied "AS IS" without warranties of any kind.

+ *

+ * Copyright (c) 2010 Keil - An ARM Company. All rights reserved.

+ *----------------------------------------------------------------------------*/

+

+#ifndef __FONT_16x24_H_H

+#define __FONT_16x24_H_H

+

+const unsigned short Font_16x24_h[] = {

+  /* 0x20: Space ' ' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x21: '!' */

+  0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000,

+  0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x22: '"' */

+  0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x23: '#' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60,

+  0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318,

+  0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000,

+  /* 0x24: '$' */

+  0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C,

+  0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C,

+  0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000,

+  /* 0x25: '%' */

+  0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611,

+  0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460,

+  0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000,

+  /* 0x26: '&' */

+  0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0,

+  0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06,

+  0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x27: ''' */

+  0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x28: '(' */

+  0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060,

+  0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,

+  0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000,

+  /* 0x29: ')' */

+  0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300,

+  0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,

+  0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000,

+  /* 0x2A: '*' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,

+  0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x2B: '+' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x2C: ',' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000,

+  /* 0x2D: '-' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x2E: '.' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x2F: '/' */

+  0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300,

+  0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0,

+  0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x30: '0' */

+  0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C,

+  0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38,

+  0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x31: '1' */

+  0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180,

+  0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x32: '2' */

+  0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800,

+  0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018,

+  0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x33: '3' */

+  0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600,

+  0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18,

+  0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x34: '4' */

+  0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60,

+  0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00,

+  0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x35: '5' */

+  0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC,

+  0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18,

+  0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x36: '6' */

+  0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC,

+  0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38,

+  0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x37: '7' */

+  0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380,

+  0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030,

+  0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x38: '8' */

+  0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638,

+  0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38,

+  0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x39: '9' */

+  0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C,

+  0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C,

+  0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x3A: ':' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x3B: ';' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000,

+  /* 0x3C: '<' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0,

+  0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x3D: '=' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x3E: '>' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0,

+  0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x3F: '?' */

+  0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00,

+  0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000,

+  0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x40: '@' */

+  0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411,

+  0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004,

+  0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x41: 'A' */

+  0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60,

+  0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C,

+  0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x42: 'B' */

+  0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C,

+  0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C,

+  0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x43: 'C' */

+  0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006,

+  0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C,

+  0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x44: 'D' */

+  0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006,

+  0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06,

+  0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x45: 'E' */

+  0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,

+  0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,

+  0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x46: 'F' */

+  0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,

+  0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,

+  0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x47: 'G' */

+  0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003,

+  0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C,

+  0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x48: 'H' */

+  0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,

+  0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,

+  0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x49: 'I' */

+  0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x4A: 'J' */

+  0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,

+  0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738,

+  0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x4B: 'K' */

+  0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6,

+  0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806,

+  0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x4C: 'L' */

+  0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,

+  0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,

+  0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x4D: 'M' */

+  0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836,

+  0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6,

+  0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x4E: 'N' */

+  0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC,

+  0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C,

+  0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x4F: 'O' */

+  0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003,

+  0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C,

+  0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x50: 'P' */

+  0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C,

+  0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,

+  0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x51: 'Q' */

+  0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003,

+  0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C,

+  0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x52: 'R' */

+  0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806,

+  0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006,

+  0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x53: 'S' */

+  0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C,

+  0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C,

+  0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x54: 'T' */

+  0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x55: 'U' */

+  0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,

+  0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818,

+  0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x56: 'V' */

+  0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C,

+  0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360,

+  0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x57: 'W' */

+  0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366,

+  0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C,

+  0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x58: 'X' */

+  0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0,

+  0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C,

+  0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x59: 'Y' */

+  0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660,

+  0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x5A: 'Z' */

+  0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600,

+  0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006,

+  0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x5B: '[' */

+  0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060,

+  0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060,

+  0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000,

+  /* 0x5C: '\' */

+  0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0,

+  0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300,

+  0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x5D: ']' */

+  0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,

+  0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,

+  0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000,

+  /* 0x5E: '^' */

+  0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630,

+  0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x5F: '_' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x60: ''' */

+  0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x61: 'a' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8,

+  0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C,

+  0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x62: 'b' */

+  0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8,

+  0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38,

+  0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x63: 'c' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0,

+  0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30,

+  0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x64: 'd' */

+  0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0,

+  0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30,

+  0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x65: 'e' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0,

+  0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30,

+  0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x66: 'f' */

+  0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0,

+  0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,

+  0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x67: 'g' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8,

+  0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18,

+  0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000,

+  /* 0x68: 'h' */

+  0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8,

+  0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,

+  0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x69: 'i' */

+  0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,

+  0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,

+  0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x6A: 'j' */

+  0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,

+  0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,

+  0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000,

+  /* 0x6B: 'k' */

+  0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C,

+  0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C,

+  0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x6C: 'l' */

+  0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,

+  0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,

+  0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x6D: 'm' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF,

+  0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183,

+  0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x6E: 'n' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8,

+  0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,

+  0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x6F: 'o' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0,

+  0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30,

+  0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x70: 'p' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8,

+  0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38,

+  0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000,

+  /* 0x71: 'q' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0,

+  0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30,

+  0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000,

+  /* 0x72: 'r' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0,

+  0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,

+  0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x73: 's' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0,

+  0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38,

+  0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x74: 't' */

+  0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0,

+  0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,

+  0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x75: 'u' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818,

+  0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38,

+  0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x76: 'v' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18,

+  0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360,

+  0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x77: 'w' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1,

+  0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C,

+  0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x78: 'x' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38,

+  0x0C30, 0x0660, 0x03C0, 0x03C0, 0x03C0, 0x03C0, 0x0660, 0x0C30,

+  0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x79: 'y' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830,

+  0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380,

+  0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000,

+  /* 0x7A: 'z' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC,

+  0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018,

+  0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x7B: '{' */

+  0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,

+  0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0,

+  0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000,

+  /* 0x7C: '|' */

+  0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000,

+  /* 0x7D: '}' */

+  0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180,

+  0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180,

+  0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000,

+  /* 0x7E: '~' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x7F: ' ' */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+

+  /* Special Symbols  starting at character 0x80 */

+  /* 0x80: Circle - Empty */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0C30, 0x1008,

+  0x2004, 0x2004, 0x4002, 0x4002, 0x4002, 0x4002, 0x4002, 0x2004,

+  0x2004, 0x1008, 0x0C30, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x81: Circle - Full */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, 0x1FF8,

+  0x3FFC, 0x3FFC, 0x7FFE, 0x7FFE, 0x7FFE, 0x7FFE, 0x7FFE, 0x3FFC,

+  0x3FFC, 0x1FF8, 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x82: Square - Empty */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0,

+  0x0FF0, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0FF0,

+  0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x83: Square - Full */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0,

+  0x0FF0, 0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8, 0x0FF0,

+  0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x84: Up - Empty */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x03C0, 0x0660, 0x0C30,

+  0x1818, 0x1818, 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x85: Up - Full */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x03C0, 0x07E0, 0x0FF0,

+  0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x86: Down - Empty */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x1FF8, 0x1818, 0x1818,

+  0x0C30, 0x0660, 0x03C0, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x87: Down - Full */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x1FF8, 0x1FF8, 0x1FF8,

+  0x0FF0, 0x07E0, 0x03C0, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000,

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x88: Left - Empty */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01E0,

+  0x01F0, 0x0198, 0x018C, 0x0186, 0x0186, 0x018C, 0x0198, 0x01F0,

+  0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x89: Left - Full */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01E0,

+  0x01F0, 0x01F8, 0x01FC, 0x01FE, 0x01FE, 0x01FC, 0x01F8, 0x01F0,

+  0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x8A: Right - Empty */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0780,

+  0x0F80, 0x1980, 0x3180, 0x6180, 0x6180, 0x3180, 0x1980, 0x0F80,

+  0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x8B: Right - Full */

+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0780,

+  0x0F80, 0x1F80, 0x3F80, 0x7F80, 0x7F80, 0x3F80, 0x1F80, 0x0F80,

+  0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+  /* 0x8C: Wait - Empty */

+  0x0000, 0x01C0, 0x0220, 0x0220, 0x0140, 0x0630, 0x0808, 0x0808,

+  0x0808, 0x0808, 0x0808, 0x0808, 0x0808, 0x0220, 0x0220, 0x0220,

+  0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0000,

+  /* 0x8D: Wait - Full */

+  0x0000, 0x01C0, 0x03E0, 0x03E0, 0x01C0, 0x07F0, 0x0DD8, 0x0DD8,

+  0x0DD8, 0x0DD8, 0x0DD8, 0x0DD8, 0x0DD8, 0x0360, 0x0360, 0x0360,

+  0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0000,

+  /* 0x8E: Walk - Empty */

+  0x0000, 0x01C0, 0x0220, 0x0220, 0x0140, 0x0630, 0x0808, 0x0808,

+  0x0808, 0x1004, 0x2002, 0x2002, 0x0140, 0x0220, 0x0220, 0x0410,

+  0x0808, 0x0808, 0x1004, 0x1004, 0x2004, 0x4004, 0x0000, 0x0000,

+  /* 0x8F: Walk - Full */

+  0x0000, 0x01C0, 0x03E0, 0x03E0, 0x01C0, 0x07F0, 0x0DD8, 0x0DD8,

+  0x0DD8, 0x19CC, 0x31C6, 0x61C2, 0x01C0, 0x0360, 0x0360, 0x0670,

+  0x0C38, 0x0C18, 0x180C, 0x180C, 0x300C, 0x600C, 0x0000, 0x0000,

+};

+

+#endif /* __FONT_16x24_H_H */

diff --git a/F2024/coe718/labs/lab2/bitbanding/Font_6x8_h.h b/F2024/coe718/labs/lab2/bitbanding/Font_6x8_h.h
new file mode 100755
index 0000000..75bce6d
--- /dev/null
+++ b/F2024/coe718/labs/lab2/bitbanding/Font_6x8_h.h
@@ -0,0 +1,248 @@
+/*----------------------------------------------------------------------------

+ * Name:    Font_6x8_h.h

+ * Purpose: ASCII font characters (width 6 pixels, height 8 pixels, 

+ *          horizontal pixel packing)

+ *----------------------------------------------------------------------------

+ * This file is part of the uVision/ARM development tools.

+ * This software may only be used under the terms of a valid, current,

+ * end user licence from KEIL for a compatible version of KEIL software

+ * development tools. Nothing else gives you the right to use this software.

+ *

+ * This software is supplied "AS IS" without warranties of any kind.

+ *

+ * Copyright (c) 2010 Keil - An ARM Company. All rights reserved.

+ *----------------------------------------------------------------------------*/

+

+#ifndef __FONT_6x8_H_H

+#define __FONT_6x8_H_H

+

+const unsigned char Font_6x8_h[] = {

+  /* 0x20: Space ' ' */

+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

+  /* 0x21: '!' */

+  0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00,

+  /* 0x22: '"' */

+  0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00,

+  /* 0x23: '#' */

+  0x0A, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x0A, 0x00,

+  /* 0x24: '$' */

+  0x04, 0x1E, 0x05, 0x0E, 0x14, 0x0F, 0x04, 0x00,

+  /* 0x25: '%' */

+  0x03, 0x13, 0x08, 0x04, 0x02, 0x19, 0x18, 0x00,

+  /* 0x26: '&' */

+  0x02, 0x05, 0x05, 0x02, 0x15, 0x09, 0x16, 0x00,

+  /* 0x27: ''' */

+  0x0C, 0x0C, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00,

+  /* 0x28: '(' */

+  0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00,

+  /* 0x29: ')' */

+  0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02, 0x00,

+  /* 0x2A: '*' */

+  0x00, 0x04, 0x15, 0x0E, 0x0E, 0x15, 0x04, 0x00,

+  /* 0x2B: '+' */

+  0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x00, 0x00,

+  /* 0x2C: ',' */

+  0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x04, 0x02,

+  /* 0x2D: '-' */

+  0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00,

+  /* 0x2E: '.' */

+  0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,

+  /* 0x2F: '/' */

+  0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00,

+  /* 0x30: '0' */

+  0x0E, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0E, 0x00,

+  /* 0x31: '1' */

+  0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x0E, 0x00,

+  /* 0x32: '2' */

+  0x0E, 0x11, 0x10, 0x0E, 0x01, 0x01, 0x1F, 0x00,

+  /* 0x33: '3' */

+  0x1F, 0x10, 0x08, 0x0C, 0x10, 0x11, 0x0E, 0x00,

+  /* 0x34: '4' */

+  0x08, 0x0C, 0x0A, 0x09, 0x1F, 0x08, 0x08, 0x00,

+  /* 0x35: '5' */

+  0x1F, 0x01, 0x0F, 0x10, 0x10, 0x11, 0x0E, 0x00,

+  /* 0x36: '6' */

+  0x1C, 0x02, 0x01, 0x0F, 0x11, 0x11, 0x0E, 0x00,

+  /* 0x37: '7' */

+  0x1F, 0x10, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00,

+  /* 0x38: '8' */

+  0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E, 0x00,

+  /* 0x39: '9' */

+  0x0E, 0x11, 0x11, 0x1E, 0x10, 0x08, 0x07, 0x00,

+  /* 0x3A: ':' */

+  0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00,

+  /* 0x3B: ';' */

+  0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x02, 0x00,

+  /* 0x3C: '<' */

+  0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x00,

+  /* 0x3D: '=' */

+  0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x00,

+  /* 0x3E: '>' */

+  0x02, 0x04, 0x08, 0x10, 0x08, 0x04, 0x02, 0x00,

+  /* 0x3F: '?' */

+  0x0E, 0x11, 0x10, 0x0C, 0x04, 0x00, 0x04, 0x00,

+  /* 0x40: '@' */

+  0x0E, 0x11, 0x15, 0x1D, 0x0D, 0x01, 0x1E, 0x00,

+  /* 0x41: 'A' */

+  0x04, 0x0A, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00,

+  /* 0x42: 'B' */

+  0x0F, 0x11, 0x11, 0x0F, 0x11, 0x11, 0x0F, 0x00,

+  /* 0x43: 'C' */

+  0x0E, 0x11, 0x01, 0x01, 0x01, 0x11, 0x0E, 0x00,

+  /* 0x44: 'D' */

+  0x0F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0F, 0x00,

+  /* 0x45: 'E' */

+  0x1F, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x1F, 0x00,

+  /* 0x46: 'F' */

+  0x1F, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x01, 0x00,

+  /* 0x47: 'G' */

+  0x1E, 0x11, 0x01, 0x01, 0x19, 0x11, 0x1E, 0x00,

+  /* 0x48: 'H' */

+  0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11, 0x00,

+  /* 0x49: 'I' */

+  0x0E, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E, 0x00,

+  /* 0x4A: 'J' */

+  0x1C, 0x08, 0x08, 0x08, 0x08, 0x09, 0x06, 0x00,

+  /* 0x4B: 'K' */

+  0x11, 0x09, 0x05, 0x03, 0x05, 0x09, 0x11, 0x00,

+  /* 0x4C: 'L' */

+  0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x00,

+  /* 0x4D: 'M' */

+  0x11, 0x1B, 0x15, 0x15, 0x15, 0x11, 0x11, 0x00,

+  /* 0x4E: 'N' */

+  0x11, 0x11, 0x13, 0x15, 0x19, 0x11, 0x11, 0x00,

+  /* 0x4F: 'O' */

+  0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00,

+  /* 0x50: 'P' */

+  0x0F, 0x11, 0x11, 0x0F, 0x01, 0x01, 0x01, 0x00,

+  /* 0x51: 'Q' */

+  0x0E, 0x11, 0x11, 0x11, 0x15, 0x09, 0x16, 0x00,

+  /* 0x52: 'R' */

+  0x0F, 0x11, 0x11, 0x0F, 0x05, 0x09, 0x11, 0x00,

+  /* 0x53: 'S' */

+  0x0E, 0x11, 0x01, 0x0E, 0x10, 0x11, 0x0E, 0x00,

+  /* 0x54: 'T' */

+  0x1F, 0x15, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00,

+  /* 0x55: 'U' */

+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00,

+  /* 0x56: 'V' */

+  0x11, 0x11, 0x11, 0x11, 0x11, 0x0A, 0x04, 0x00,

+  /* 0x57: 'W' */

+  0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x0A, 0x00,

+  /* 0x58: 'X' */

+  0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11, 0x00,

+  /* 0x59: 'Y' */

+  0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x00,

+  /* 0x5A: 'Z' */

+  0x1F, 0x10, 0x08, 0x0E, 0x02, 0x01, 0x1F, 0x00,

+  /* 0x5B: '[' */

+  0x1E, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1E, 0x00,

+  /* 0x5C: '\' */

+  0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00,

+  /* 0x5D: ']' */

+  0x1E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1E, 0x00,

+  /* 0x5E: '^' */

+  0x04, 0x0A, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00,

+  /* 0x5F: '_' */

+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00,

+  /* 0x60: ''' */

+  0x06, 0x06, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00,

+  /* 0x61: 'a' */

+  0x00, 0x00, 0x06, 0x08, 0x0E, 0x09, 0x1E, 0x00,

+  /* 0x62: 'b' */

+  0x01, 0x01, 0x0D, 0x13, 0x11, 0x13, 0x0D, 0x00,

+  /* 0x63: 'c' */

+  0x00, 0x00, 0x0E, 0x11, 0x01, 0x11, 0x0E, 0x00,

+  /* 0x64: 'd' */

+  0x10, 0x10, 0x16, 0x19, 0x11, 0x19, 0x16, 0x00,

+  /* 0x65: 'e' */

+  0x00, 0x00, 0x0E, 0x11, 0x1F, 0x01, 0x0E, 0x00,

+  /* 0x66: 'f' */

+  0x08, 0x14, 0x04, 0x0E, 0x04, 0x04, 0x04, 0x00,

+  /* 0x67: 'g' */

+  0x00, 0x00, 0x0E, 0x19, 0x19, 0x16, 0x10, 0x0E,

+  /* 0x68: 'h' */

+  0x01, 0x01, 0x0D, 0x13, 0x11, 0x11, 0x11, 0x00,

+  /* 0x69: 'i' */

+  0x04, 0x00, 0x06, 0x04, 0x04, 0x04, 0x0E, 0x00,

+  /* 0x6A: 'j' */

+  0x08, 0x00, 0x08, 0x08, 0x08, 0x09, 0x06, 0x00,

+  /* 0x6B: 'k' */

+  0x01, 0x01, 0x09, 0x05, 0x03, 0x05, 0x09, 0x00,

+  /* 0x6C: 'l' */

+  0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E, 0x00,

+  /* 0x6D: 'm' */

+  0x00, 0x00, 0x0B, 0x15, 0x15, 0x15, 0x15, 0x00,

+  /* 0x6E: 'n' */

+  0x00, 0x00, 0x0D, 0x13, 0x11, 0x11, 0x11, 0x00,

+  /* 0x6F: 'o' */

+  0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00,

+  /* 0x70: 'p' */

+  0x00, 0x00, 0x0D, 0x13, 0x13, 0x0D, 0x01, 0x01,

+  /* 0x71: 'q' */

+  0x00, 0x00, 0x16, 0x19, 0x19, 0x16, 0x10, 0x10,

+  /* 0x72: 'r' */

+  0x00, 0x00, 0x0D, 0x13, 0x01, 0x01, 0x01, 0x00,

+  /* 0x73: 's' */

+  0x00, 0x00, 0x1E, 0x01, 0x0E, 0x10, 0x0F, 0x00,

+  /* 0x74: 't' */

+  0x04, 0x04, 0x1F, 0x04, 0x04, 0x14, 0x08, 0x00,

+  /* 0x75: 'u' */

+  0x00, 0x00, 0x11, 0x11, 0x11, 0x19, 0x16, 0x00,

+  /* 0x76: 'v' */

+  0x00, 0x00, 0x11, 0x11, 0x11, 0x0A, 0x04, 0x00,

+  /* 0x77: 'w' */

+  0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A, 0x00,

+  /* 0x78: 'x' */

+  0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00,

+  /* 0x79: 'y' */

+  0x00, 0x00, 0x11, 0x11, 0x1E, 0x10, 0x11, 0x0E,

+  /* 0x7A: 'z' */

+  0x00, 0x00, 0x1F, 0x08, 0x04, 0x02, 0x1F, 0x00,

+  /* 0x7B: '{' */

+  0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0x00,

+  /* 0x7C: '|' */

+  0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x04, 0x00,

+  /* 0x7D: '}' */

+  0x02, 0x04, 0x04, 0x08, 0x04, 0x04, 0x02, 0x00,

+  /* 0x7E: '~' */

+  0x02, 0x15, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,

+  /* 0x7F: ' ' */

+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

+

+  /* Special Symbols  starting at character 0x80 */

+  /* 0x80: Circle - Empty */

+  0x00, 0x00, 0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00,

+  /* 0x81: Circle - Full */

+  0x00, 0x00, 0x0C, 0x1E, 0x1E, 0x0C, 0x00, 0x00,

+  /* 0x82: Square - Empty */

+  0x00, 0x00, 0x1E, 0x12, 0x12, 0x1E, 0x00, 0x00,

+  /* 0x83: Square - Full */

+  0x00, 0x00, 0x1E, 0x1E, 0x1E, 0x1E, 0x00, 0x00,

+  /* 0x84: Up - Empty */

+  0x00, 0x00, 0x0C, 0x0C, 0x12, 0x1E, 0x00, 0x00,

+  /* 0x85: Up - Full */

+  0x00, 0x00, 0x0C, 0x0C, 0x1E, 0x1E, 0x00, 0x00,

+  /* 0x86: Down - Empty */

+  0x00, 0x00, 0x1E, 0x12, 0x0C, 0x0C, 0x00, 0x00,

+  /* 0x87: Down - Full */

+  0x00, 0x00, 0x1E, 0x1E, 0x0C, 0x0C, 0x00, 0x00,

+  /* 0x88: Left - Empty */

+  0x00, 0x00, 0x18, 0x16, 0x16, 0x18, 0x00, 0x00,

+  /* 0x89: Left - Full */

+  0x00, 0x00, 0x18, 0x1E, 0x1E, 0x18, 0x00, 0x00,

+  /* 0x8A: Right - Empty */

+  0x00, 0x00, 0x06, 0x1A, 0x1A, 0x06, 0x00, 0x00,

+  /* 0x8B: Right - Full */

+  0x00, 0x00, 0x06, 0x1E, 0x1E, 0x06, 0x00, 0x00,

+  /* 0x8C: Wait - Empty */

+  0x00, 0x00, 0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00,

+  /* 0x8D: Wait - Full */

+  0x00, 0x00, 0x0C, 0x1E, 0x1E, 0x0C, 0x00, 0x00,

+  /* 0x8E: Walk - Empty */

+  0x00, 0x00, 0x1E, 0x12, 0x12, 0x1E, 0x00, 0x00,

+  /* 0x8F: Walk - Full */

+  0x00, 0x00, 0x1E, 0x1E, 0x1E, 0x1E, 0x00, 0x00,

+};

+

+#endif /* __FONT_6x8_H_H */

diff --git a/F2024/coe718/labs/lab2/bitbanding/GLCD.h b/F2024/coe718/labs/lab2/bitbanding/GLCD.h
new file mode 100755
index 0000000..f48ff4b
--- /dev/null
+++ b/F2024/coe718/labs/lab2/bitbanding/GLCD.h
@@ -0,0 +1,59 @@
+/******************************************************************************/

+/* GLCD.h: Graphic LCD function prototypes and defines                        */

+/******************************************************************************/

+/* This file is part of the uVision/ARM development tools.                    */

+/* Copyright (c) 2005-2011 Keil - An ARM Company. All rights reserved.        */

+/* This software may only be used under the terms of a valid, current,        */

+/* end user licence from KEIL for a compatible version of KEIL software       */

+/* development tools. Nothing else gives you the right to use this software.  */

+/******************************************************************************/

+

+#ifndef _GLCD_H

+#define _GLCD_H

+

+/*------------------------------------------------------------------------------

+  Color coding

+  GLCD is coded:   15..11 red, 10..5 green, 4..0 blue  (unsigned short)  GLCD_R5, GLCD_G6, GLCD_B5   

+  original coding: 17..12 red, 11..6 green, 5..0 blue                    ORG_R6,  ORG_G6,  ORG_B6

+

+  ORG_R1..5 = GLCD_R0..4,  ORG_R0 = GLCD_R4

+  ORG_G0..5 = GLCD_G0..5,

+  ORG_B1..5 = GLCD_B0..4,  ORG_B0 = GLCD_B4

+ *----------------------------------------------------------------------------*/

+                            
+/* GLCD RGB color definitions                                                 */

+#define Black           0x0000      /*   0,   0,   0 */

+#define Navy            0x000F      /*   0,   0, 128 */

+#define DarkGreen       0x03E0      /*   0, 128,   0 */

+#define DarkCyan        0x03EF      /*   0, 128, 128 */

+#define Maroon          0x7800      /* 128,   0,   0 */

+#define Purple          0x780F      /* 128,   0, 128 */

+#define Olive           0x7BE0      /* 128, 128,   0 */

+#define LightGrey       0xC618      /* 192, 192, 192 */

+#define DarkGrey        0x7BEF      /* 128, 128, 128 */

+#define Blue            0x001F      /*   0,   0, 255 */

+#define Green           0x07E0      /*   0, 255,   0 */

+#define Cyan            0x07FF      /*   0, 255, 255 */

+#define Red             0xF800      /* 255,   0,   0 */

+#define Magenta         0xF81F      /* 255,   0, 255 */

+#define Yellow          0xFFE0      /* 255, 255, 0   */

+#define White           0xFFFF      /* 255, 255, 255 */

+

+extern void GLCD_Init           (void);

+extern void GLCD_WindowMax      (void);

+extern void GLCD_PutPixel       (unsigned int x, unsigned int y);

+extern void GLCD_SetTextColor   (unsigned short color);

+extern void GLCD_SetBackColor   (unsigned short color);

+extern void GLCD_Clear          (unsigned short color);

+extern void GLCD_DrawChar       (unsigned int x,  unsigned int y, unsigned int cw, unsigned int ch, unsigned char *c);

+extern void GLCD_DisplayChar    (unsigned int ln, unsigned int col, unsigned char fi, unsigned char  c);

+extern void GLCD_DisplayString  (unsigned int ln, unsigned int col, unsigned char fi, unsigned char *s);

+extern void GLCD_ClearLn        (unsigned int ln, unsigned char fi);

+extern void GLCD_Bargraph       (unsigned int x,  unsigned int y, unsigned int w, unsigned int h, unsigned int val);

+extern void GLCD_Bitmap         (unsigned int x,  unsigned int y, unsigned int w, unsigned int h, unsigned char *bitmap);

+extern void GLCD_ScrollVertical (unsigned int dy);

+

+extern void GLCD_WrCmd          (unsigned char cmd);

+extern void GLCD_WrReg          (unsigned char reg, unsigned short val); 

+

+#endif /* _GLCD_H */

diff --git a/F2024/coe718/labs/lab2/bitbanding/GLCD_SPI_LPC1700.c b/F2024/coe718/labs/lab2/bitbanding/GLCD_SPI_LPC1700.c
new file mode 100755
index 0000000..5037c8e
--- /dev/null
+++ b/F2024/coe718/labs/lab2/bitbanding/GLCD_SPI_LPC1700.c
@@ -0,0 +1,928 @@
+/******************************************************************************/

+/* GLCD_SPI_LPC1700.c: LPC1700 low level Graphic LCD (240x320 pixels) driven  */

+/*                     with SPI functions                                     */

+/******************************************************************************/

+/* This file is part of the uVision/ARM development tools.                    */

+/* Copyright (c) 2005-2011 Keil - An ARM Company. All rights reserved.        */

+/* This software may only be used under the terms of a valid, current,        */

+/* end user licence from KEIL for a compatible version of KEIL software       */

+/* development tools. Nothing else gives you the right to use this software.  */

+/******************************************************************************/

+

+

+#include <lpc17xx.h>

+#include "GLCD.h"

+#include "Font_6x8_h.h"

+#include "Font_16x24_h.h"

+

+/************************** Orientation  configuration ************************/

+

+#define LANDSCAPE   1                   /* 1 for landscape, 0 for portrait    */

+#define ROTATE180   0                   /* 1 to rotate the screen for 180 deg */

+

+/*********************** Hardware specific configuration **********************/

+

+/* SPI Interface: SPI3

+   

+   PINS: 

+   - CS     = P0.6 (GPIO pin)

+   - RS     = GND

+   - WR/SCK = P0.7 (SCK1)

+   - RD     = GND

+   - SDO    = P0.8 (MISO1)

+   - SDI    = P0.9 (MOSI1)                                                    */

+

+#define PIN_CS      (1 << 6)

+#define PIN_CLK     (1 << 7)

+#define PIN_DAT     (1 << 9)

+

+#define IN          0x00

+#define OUT         0x01

+

+/* SPI_SR - bit definitions                                                   */

+#define TFE         0x01

+#define RNE         0x04

+#define BSY         0x10

+

+/*------------------------- Speed dependant settings -------------------------*/

+

+/* If processor works on high frequency delay has to be increased, it can be 

+   increased by factor 2^N by this constant                                   */

+#define DELAY_2N    18

+

+/*---------------------- Graphic LCD size definitions ------------------------*/

+

+#if (LANDSCAPE == 1)

+#define WIDTH       320                 /* Screen Width (in pixels)           */

+#define HEIGHT      240                 /* Screen Hight (in pixels)           */

+#else

+#define WIDTH       240                 /* Screen Width (in pixels)           */

+#define HEIGHT      320                 /* Screen Hight (in pixels)           */

+#endif

+#define BPP         16                  /* Bits per pixel                     */

+#define BYPP        ((BPP+7)/8)         /* Bytes per pixel                    */

+

+/*--------------- Graphic LCD interface hardware definitions -----------------*/

+

+/* Pin CS setting to 0 or 1                                                   */

+#define LCD_CS(x)   ((x) ? (LPC_GPIO0->FIOSET = PIN_CS)    : (LPC_GPIO0->FIOCLR = PIN_CS))

+#define LCD_CLK(x)  ((x) ? (LPC_GPIO0->FIOSET = PIN_CLK)   : (LPC_GPIO0->FIOCLR = PIN_CLK))

+#define LCD_DAT(x)  ((x) ? (LPC_GPIO0->FIOSET = PIN_DAT)   : (LPC_GPIO0->FIOCLR = PIN_DAT))

+

+#define DAT_MODE(x) ((x == OUT) ? (LPC_GPIO0->FIODIR |= PIN_DAT) : (LPC_GPIO0->FIODIR &= ~PIN_DAT))

+#define BUS_VAL()                ((LPC_GPIO0->FIOPIN  & PIN_DAT) != 0)

+

+

+#define SPI_START   (0x70)              /* Start byte for SPI transfer        */

+#define SPI_RD      (0x01)              /* WR bit 1 within start              */

+#define SPI_WR      (0x00)              /* WR bit 0 within start              */

+#define SPI_DATA    (0x02)              /* RS bit 1 within start byte         */

+#define SPI_INDEX   (0x00)              /* RS bit 0 within start byte         */

+

+#define BG_COLOR  0                     /* Background color                   */

+#define TXT_COLOR 1                     /* Text color                         */

+

+ 

+/*---------------------------- Global variables ------------------------------*/

+

+/******************************************************************************/

+static volatile unsigned short Color[2] = {White, Black};

+static unsigned char Himax;

+

+/************************ Local auxiliary functions ***************************/

+

+/*******************************************************************************

+* Delay in while loop cycles                                                   *

+*   Parameter:    cnt:    number of while cycles to delay                      *

+*   Return:                                                                    *

+*******************************************************************************/

+

+static void delay (int cnt) {

+  cnt <<= DELAY_2N;

+  while (cnt--);

+}

+

+

+/*******************************************************************************

+* Transfer 1 byte over the serial communication                                *

+*   Parameter:    byte:   byte to be sent                                      *

+*                 mode:   OUT = transmit byte, IN = receive byte               *

+*   Return:               byte read while sending                              *

+*******************************************************************************/

+static unsigned char spi_tran_man (unsigned char byte, unsigned int mode) {

+  unsigned char val = 0;

+  int i;

+

+  if (mode == OUT) { DAT_MODE (OUT); }

+  else             { DAT_MODE (IN);  }

+

+  for (i = 7; i >= 0; i--) {

+    LCD_CLK(0);

+    delay(1);

+    if (mode == OUT) {

+      LCD_DAT((byte & (1 << i)) != 0);

+    }

+    else {

+      val |= (BUS_VAL() << i);

+    }

+    LCD_CLK(1);

+    delay(1);

+  }

+  return (val);

+}

+

+

+/*******************************************************************************

+* Transfer 1 byte over the serial communication                                *

+*   Parameter:    byte:   byte to be sent                                      *

+*   Return:               byte read while sending                              *

+*******************************************************************************/

+

+static __inline unsigned char spi_tran (unsigned char byte) {

+

+  LPC_SSP1->DR = byte;

+  while (!(LPC_SSP1->SR & RNE));        /* Wait for send to finish            */

+  return (LPC_SSP1->DR);

+}

+

+

+/*******************************************************************************

+* Write a command the LCD controller                                           *

+*   Parameter:    cmd:    command to be written                                *

+*   Return:                                                                    *

+*******************************************************************************/

+

+static __inline void wr_cmd (unsigned char cmd) {

+  LCD_CS(0);

+  spi_tran(SPI_START | SPI_WR | SPI_INDEX);   /* Write : RS = 0, RW = 0       */

+  spi_tran(0);

+  spi_tran(cmd);

+  LCD_CS(1);

+}

+

+

+/*******************************************************************************

+* Write data to the LCD controller                                             *

+*   Parameter:    dat:    data to be written                                   *

+*   Return:                                                                    *

+*******************************************************************************/

+

+static __inline void wr_dat (unsigned short dat) {

+  LCD_CS(0);

+  spi_tran(SPI_START | SPI_WR | SPI_DATA);    /* Write : RS = 1, RW = 0       */

+  spi_tran((dat >>   8));                     /* Write D8..D15                */

+  spi_tran((dat & 0xFF));                     /* Write D0..D7                 */

+  LCD_CS(1);

+}

+

+

+/*******************************************************************************

+* Start of data writing to the LCD controller                                  *

+*   Parameter:                                                                 *

+*   Return:                                                                    *

+*******************************************************************************/

+

+static __inline void wr_dat_start (void) {

+  LCD_CS(0);

+  spi_tran(SPI_START | SPI_WR | SPI_DATA);    /* Write : RS = 1, RW = 0       */

+}

+

+

+/*******************************************************************************

+* Stop of data writing to the LCD controller                                   *

+*   Parameter:                                                                 *

+*   Return:                                                                    *

+*******************************************************************************/

+

+static __inline void wr_dat_stop (void) {

+

+  LCD_CS(1);

+}

+

+

+/*******************************************************************************

+* Data writing to the LCD controller                                           *

+*   Parameter:    dat:    data to be written                                   *

+*   Return:                                                                    *

+*******************************************************************************/

+

+static __inline void wr_dat_only (unsigned short dat) {

+

+  spi_tran((dat >>   8));                     /* Write D8..D15                */

+  spi_tran((dat & 0xFF));                     /* Write D0..D7                 */

+}

+

+

+/*******************************************************************************

+* Read data from the LCD controller                                            *

+*   Parameter:                                                                 *

+*   Return:               read data                                            *

+*******************************************************************************/

+

+static __inline unsigned short rd_dat (void) {

+  unsigned short val = 0;

+

+  LCD_CS(0);

+  spi_tran(SPI_START | SPI_RD | SPI_DATA);    /* Read: RS = 1, RW = 1         */

+  spi_tran(0);                                /* Dummy read 1                 */  

+  val   = spi_tran(0);                        /* Read D8..D15                 */

+  val <<= 8;

+  val  |= spi_tran(0);                        /* Read D0..D7                  */

+  LCD_CS(1);

+  return (val);

+}

+

+

+/*******************************************************************************

+* Write a value to the to LCD register                                         *

+*   Parameter:    reg:    register to be written                               *

+*                 val:    value to write to the register                       *

+*******************************************************************************/

+

+static __inline void wr_reg (unsigned char reg, unsigned short val) {

+

+  wr_cmd(reg);

+  wr_dat(val);

+}

+

+

+/*******************************************************************************

+* Read from the LCD register                                                   *

+*   Parameter:    reg:    register to be read                                  *

+*   Return:               value read from the register                         *

+*******************************************************************************/

+

+static unsigned short rd_reg (unsigned char reg) {

+

+  wr_cmd(reg);

+  return(rd_dat());

+}

+

+

+/*******************************************************************************

+* Read LCD controller ID (Himax GLCD)                                          *

+*   Parameter:    (none)                                                       *

+*   Return:       controller ID                                                *

+*******************************************************************************/

+

+static unsigned short rd_id_man (void) {

+  unsigned short val;

+

+  /* Set MOSI, MISO and SCK as GPIO pins, with pull-down/pull-up disabled     */

+  LPC_PINCON->PINSEL0  &= ~((3 << 18) | (3 << 16) | (3 << 14));

+  LPC_PINCON->PINMODE0 |= 0x000AA000;

+  LPC_GPIO0->FIODIR    |= PIN_CLK;      /* SCK pin is GPIO output             */

+  LCD_CS (1);                           /* Set chip select high               */

+  LCD_CLK(1);                           /* Set clock high                     */

+

+  LCD_CS(0);

+  spi_tran_man (SPI_START | SPI_WR | SPI_INDEX, OUT);

+  spi_tran_man (0x00, OUT);

+  LCD_CS(1);

+

+  LCD_CS(0);

+  spi_tran_man (SPI_START | SPI_RD | SPI_DATA, OUT);

+  val = spi_tran_man(0, IN);

+  LCD_CS(1);

+

+  /* Connect MOSI, MISO, and SCK to SSP peripheral                            */

+  LPC_GPIO0->FIODIR    &= ~PIN_CLK;

+  LPC_PINCON->PINSEL0  |= (2 << 18) | (2 << 16) | (2 << 14);

+  LPC_PINCON->PINMODE0 &= ~0x000FF000;

+

+  return (val);

+}

+

+

+/************************ Exported functions **********************************/

+

+/*******************************************************************************

+* Initialize the Graphic LCD controller                                        *

+*   Parameter:                                                                 *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_Init (void) {

+  unsigned short driverCode;

+

+  /* Enable clock for SSP1, clock = CCLK / 2                                  */

+  LPC_SC->PCONP       |= 0x00000400;

+  LPC_SC->PCLKSEL0    |= 0x00200000;

+

+  /* Configure the LCD Control pins                                           */

+  LPC_PINCON->PINSEL9 &= 0xF0FFFFFF;

+  LPC_GPIO4->FIODIR   |= 0x30000000;

+  LPC_GPIO4->FIOSET    = 0x20000000;

+

+  /* SSEL1 is GPIO output set to high                                         */

+  LPC_GPIO0->FIODIR   |= 0x00000040;

+  LPC_GPIO0->FIOSET    = 0x00000040;

+  LPC_PINCON->PINSEL0 &= 0xFFF03FFF;

+  LPC_PINCON->PINSEL0 |= 0x000A8000;

+

+  /* Enable SPI in Master Mode, CPOL=1, CPHA=1                                */

+  /* Max. 12.5 MBit used for Data Transfer @ 100MHz                           */

+  LPC_SSP1->CR0        = 0x01C7;

+  LPC_SSP1->CPSR       = 0x02;

+  LPC_SSP1->CR1        = 0x02;

+  

+  driverCode = rd_id_man ();

+  if (driverCode == 0) {

+    driverCode = rd_reg(0x00);

+  }

+

+  if (driverCode == 0x47) {             /* LCD with HX8347-D LCD Controller   */

+    Himax = 1;                          /* Set Himax LCD controller flag      */

+    /* Driving ability settings ----------------------------------------------*/

+    wr_reg(0xEA, 0x00);                 /* Power control internal used (1)    */

+    wr_reg(0xEB, 0x20);                 /* Power control internal used (2)    */

+    wr_reg(0xEC, 0x0C);                 /* Source control internal used (1)   */

+    wr_reg(0xED, 0xC7);                 /* Source control internal used (2)   */

+    wr_reg(0xE8, 0x38);                 /* Source output period Normal mode   */

+    wr_reg(0xE9, 0x10);                 /* Source output period Idle mode     */

+    wr_reg(0xF1, 0x01);                 /* RGB 18-bit interface ;0x0110       */

+    wr_reg(0xF2, 0x10);

+

+    /* Adjust the Gamma Curve ------------------------------------------------*/

+    wr_reg(0x40, 0x01);

+    wr_reg(0x41, 0x00);

+    wr_reg(0x42, 0x00);

+    wr_reg(0x43, 0x10);

+    wr_reg(0x44, 0x0E);

+    wr_reg(0x45, 0x24);

+    wr_reg(0x46, 0x04);

+    wr_reg(0x47, 0x50);

+    wr_reg(0x48, 0x02);

+    wr_reg(0x49, 0x13);

+    wr_reg(0x4A, 0x19);

+    wr_reg(0x4B, 0x19);

+    wr_reg(0x4C, 0x16);

+

+    wr_reg(0x50, 0x1B);

+    wr_reg(0x51, 0x31);

+    wr_reg(0x52, 0x2F);

+    wr_reg(0x53, 0x3F);

+    wr_reg(0x54, 0x3F);

+    wr_reg(0x55, 0x3E);

+    wr_reg(0x56, 0x2F);

+    wr_reg(0x57, 0x7B);

+    wr_reg(0x58, 0x09);

+    wr_reg(0x59, 0x06);

+    wr_reg(0x5A, 0x06);

+    wr_reg(0x5B, 0x0C);

+    wr_reg(0x5C, 0x1D);

+    wr_reg(0x5D, 0xCC);

+

+    /* Power voltage setting -------------------------------------------------*/

+    wr_reg(0x1B, 0x1B);

+    wr_reg(0x1A, 0x01);

+    wr_reg(0x24, 0x2F);

+    wr_reg(0x25, 0x57);

+    wr_reg(0x23, 0x88);

+

+    /* Power on setting ------------------------------------------------------*/

+    wr_reg(0x18, 0x36);                 /* Internal oscillator frequency adj  */

+    wr_reg(0x19, 0x01);                 /* Enable internal oscillator         */

+    wr_reg(0x01, 0x00);                 /* Normal mode, no scrool             */

+    wr_reg(0x1F, 0x88);                 /* Power control 6 - DDVDH Off        */

+    delay(20);

+    wr_reg(0x1F, 0x82);                 /* Power control 6 - Step-up: 3 x VCI */

+    delay(5);

+    wr_reg(0x1F, 0x92);                 /* Power control 6 - Step-up: On      */

+    delay(5);

+    wr_reg(0x1F, 0xD2);                 /* Power control 6 - VCOML active     */

+    delay(5);

+

+    /* Color selection -------------------------------------------------------*/

+    wr_reg(0x17, 0x55);                 /* RGB, System interface: 16 Bit/Pixel*/

+    wr_reg(0x00, 0x00);                 /* Scrolling off, no standby          */

+

+    /* Interface config ------------------------------------------------------*/

+    wr_reg(0x2F, 0x11);                 /* LCD Drive: 1-line inversion        */

+    wr_reg(0x31, 0x00);

+    wr_reg(0x32, 0x00);                 /* DPL=0, HSPL=0, VSPL=0, EPL=0       */

+

+    /* Display on setting ----------------------------------------------------*/

+    wr_reg(0x28, 0x38);                 /* PT(0,0) active, VGL/VGL            */

+    delay(20);

+    wr_reg(0x28, 0x3C);                 /* Display active, VGL/VGL            */

+

+   #if (LANDSCAPE == 1)

+    #if (ROTATE180 == 0)

+     wr_reg (0x16, 0xA8);

+    #else

+     wr_reg (0x16, 0x68);

+    #endif

+   #else

+    #if (ROTATE180 == 0)

+     wr_reg (0x16, 0x08);

+    #else

+     wr_reg (0x16, 0xC8);

+    #endif

+   #endif

+

+    /* Display scrolling settings --------------------------------------------*/

+    wr_reg(0x0E, 0x00);                 /* TFA MSB                            */

+    wr_reg(0x0F, 0x00);                 /* TFA LSB                            */

+    wr_reg(0x10, 320 >> 8);             /* VSA MSB                            */

+    wr_reg(0x11, 320 &  0xFF);          /* VSA LSB                            */

+    wr_reg(0x12, 0x00);                 /* BFA MSB                            */

+    wr_reg(0x13, 0x00);                 /* BFA LSB                            */

+  }

+  else {

+    Himax = 0;                          /* This is not Himax LCD controller   */

+    /* Start Initial Sequence ------------------------------------------------*/

+   #if (ROTATE180 == 1)

+    wr_reg(0x01, 0x0000);               /* Clear SS bit                       */

+   #else

+    wr_reg(0x01, 0x0100);               /* Set SS bit                         */

+   #endif

+    wr_reg(0x02, 0x0700);               /* Set 1 line inversion               */

+    wr_reg(0x04, 0x0000);               /* Resize register                    */

+    wr_reg(0x08, 0x0207);               /* 2 lines front, 7 back porch        */

+    wr_reg(0x09, 0x0000);               /* Set non-disp area refresh cyc ISC  */

+    wr_reg(0x0A, 0x0000);               /* FMARK function                     */

+    wr_reg(0x0C, 0x0000);               /* RGB interface setting              */

+    wr_reg(0x0D, 0x0000);               /* Frame marker Position              */

+    wr_reg(0x0F, 0x0000);               /* RGB interface polarity             */

+

+    /* Power On sequence -----------------------------------------------------*/

+    wr_reg(0x10, 0x0000);               /* Reset Power Control 1              */

+    wr_reg(0x11, 0x0000);               /* Reset Power Control 2              */

+    wr_reg(0x12, 0x0000);               /* Reset Power Control 3              */

+    wr_reg(0x13, 0x0000);               /* Reset Power Control 4              */

+    delay(20);                          /* Discharge cap power voltage (200ms)*/

+    wr_reg(0x10, 0x12B0);               /* SAP, BT[3:0], AP, DSTB, SLP, STB   */

+    wr_reg(0x11, 0x0007);               /* DC1[2:0], DC0[2:0], VC[2:0]        */

+    delay(5);                           /* Delay 50 ms                        */

+    wr_reg(0x12, 0x01BD);               /* VREG1OUT voltage                   */

+    delay(5);                           /* Delay 50 ms                        */

+    wr_reg(0x13, 0x1400);               /* VDV[4:0] for VCOM amplitude        */

+    wr_reg(0x29, 0x000E);               /* VCM[4:0] for VCOMH                 */

+    delay(5);                           /* Delay 50 ms                        */

+    wr_reg(0x20, 0x0000);               /* GRAM horizontal Address            */

+    wr_reg(0x21, 0x0000);               /* GRAM Vertical Address              */

+

+    /* Adjust the Gamma Curve ------------------------------------------------*/

+    switch (driverCode) {

+      case 0x5408:                      /* LCD with SPFD5408 LCD Controller   */

+        wr_reg(0x30, 0x0B0D);

+        wr_reg(0x31, 0x1923);

+        wr_reg(0x32, 0x1C26);

+        wr_reg(0x33, 0x261C);

+        wr_reg(0x34, 0x2419);

+        wr_reg(0x35, 0x0D0B);

+        wr_reg(0x36, 0x1006);

+        wr_reg(0x37, 0x0610);

+        wr_reg(0x38, 0x0706);

+        wr_reg(0x39, 0x0304);

+        wr_reg(0x3A, 0x0E05);

+        wr_reg(0x3B, 0x0E01);

+        wr_reg(0x3C, 0x010E);

+        wr_reg(0x3D, 0x050E);

+        wr_reg(0x3E, 0x0403);

+        wr_reg(0x3F, 0x0607);

+        break;

+

+      case 0x9325:                      /* LCD with RM68050 LCD Controller    */

+        wr_reg(0x0030,0x0000);

+        wr_reg(0x0031,0x0607);

+        wr_reg(0x0032,0x0305);

+        wr_reg(0x0035,0x0000);

+        wr_reg(0x0036,0x1604);

+        wr_reg(0x0037,0x0204);

+        wr_reg(0x0038,0x0001);

+        wr_reg(0x0039,0x0707);

+        wr_reg(0x003C,0x0000);

+        wr_reg(0x003D,0x000F);

+        break;

+

+      case 0x9320:                      /* LCD with ILI9320 LCD Controller    */

+      default:                          /* LCD with other LCD Controller      */

+        wr_reg(0x30, 0x0006);

+        wr_reg(0x31, 0x0101);

+        wr_reg(0x32, 0x0003);

+        wr_reg(0x35, 0x0106);

+        wr_reg(0x36, 0x0B02);

+        wr_reg(0x37, 0x0302);

+        wr_reg(0x38, 0x0707);

+        wr_reg(0x39, 0x0007);

+        wr_reg(0x3C, 0x0600);

+        wr_reg(0x3D, 0x020B);

+        break;

+    }

+

+    /* Set GRAM area ---------------------------------------------------------*/

+    wr_reg(0x50, 0x0000);               /* Horizontal GRAM Start Address      */

+    wr_reg(0x51, (HEIGHT-1));           /* Horizontal GRAM End   Address      */

+    wr_reg(0x52, 0x0000);               /* Vertical   GRAM Start Address      */

+    wr_reg(0x53, (WIDTH-1));            /* Vertical   GRAM End   Address      */

+

+    /* Set Gate Scan Line ----------------------------------------------------*/

+    switch (driverCode) {

+      case 0x5408:                      /* LCD with SPFD5408 LCD Controller   */

+      case 0x9325:                      /* LCD with RM68050 LCD Controller    */

+       #if (LANDSCAPE ^ ROTATE180)

+        wr_reg(0x60, 0x2700);

+       #else

+        wr_reg(0x60, 0xA700);

+       #endif

+        break;

+

+      case 0x9320:                      /* LCD with ILI9320 LCD Controller    */

+      default:                          /* LCD with other LCD Controller      */

+       #if (LANDSCAPE ^ ROTATE180)

+        wr_reg(0x60, 0xA700);

+       #else

+        wr_reg(0x60, 0x2700);

+       #endif

+        break;

+    }

+    wr_reg(0x61, 0x0001);               /* NDL,VLE, REV                       */

+    wr_reg(0x6A, 0x0000);               /* Set scrolling line                 */

+

+    /* Partial Display Control -----------------------------------------------*/

+    wr_reg(0x80, 0x0000);

+    wr_reg(0x81, 0x0000);

+    wr_reg(0x82, 0x0000);

+    wr_reg(0x83, 0x0000);

+    wr_reg(0x84, 0x0000);

+    wr_reg(0x85, 0x0000);

+

+    /* Panel Control ---------------------------------------------------------*/

+    wr_reg(0x90, 0x0010);

+    wr_reg(0x92, 0x0000);

+    wr_reg(0x93, 0x0003);

+    wr_reg(0x95, 0x0110);

+    wr_reg(0x97, 0x0000);

+    wr_reg(0x98, 0x0000);

+

+    /* Set GRAM write direction

+       I/D=11 (Horizontal : increment, Vertical : increment)                  */

+  #if (LANDSCAPE == 1)

+    /* AM=1   (address is updated in vertical writing direction)              */

+    wr_reg(0x03, 0x1038);

+  #else

+    /* AM=0   (address is updated in horizontal writing direction)            */

+    wr_reg(0x03, 0x1030);

+  #endif

+

+    wr_reg(0x07, 0x0137);               /* 262K color and display ON          */

+  }

+  LPC_GPIO4->FIOSET = 0x10000000;

+}

+

+

+/*******************************************************************************

+* Set draw window region                                                       *

+*   Parameter:      x:        horizontal position                              *

+*                   y:        vertical position                                *

+*                   w:        window width in pixel                            *

+*                   h:        window height in pixels                          *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_SetWindow (unsigned int x, unsigned int y, unsigned int w, unsigned int h) {

+  unsigned int xe, ye;

+

+  if (Himax) {

+    xe = x+w-1;

+    ye = y+h-1;

+

+    wr_reg(0x02, x  >>    8);           /* Column address start MSB           */

+    wr_reg(0x03, x  &  0xFF);           /* Column address start LSB           */

+    wr_reg(0x04, xe >>    8);           /* Column address end MSB             */

+    wr_reg(0x05, xe &  0xFF);           /* Column address end LSB             */

+  

+    wr_reg(0x06, y  >>    8);           /* Row address start MSB              */

+    wr_reg(0x07, y  &  0xFF);           /* Row address start LSB              */

+    wr_reg(0x08, ye >>    8);           /* Row address end MSB                */

+    wr_reg(0x09, ye &  0xFF);           /* Row address end LSB                */

+  }

+  else {

+   #if (LANDSCAPE == 1)

+    wr_reg(0x50, y);                    /* Vertical   GRAM Start Address      */

+    wr_reg(0x51, y+h-1);                /* Vertical   GRAM End   Address (-1) */

+    wr_reg(0x52, x);                    /* Horizontal GRAM Start Address      */

+    wr_reg(0x53, x+w-1);                /* Horizontal GRAM End   Address (-1) */

+    wr_reg(0x20, y);

+    wr_reg(0x21, x);

+   #else

+    wr_reg(0x50, x);                    /* Horizontal GRAM Start Address      */

+    wr_reg(0x51, x+w-1);                /* Horizontal GRAM End   Address (-1) */

+    wr_reg(0x52, y);                    /* Vertical   GRAM Start Address      */

+    wr_reg(0x53, y+h-1);                /* Vertical   GRAM End   Address (-1) */

+    wr_reg(0x20, x);

+    wr_reg(0x21, y);

+   #endif

+  }

+}

+

+

+/*******************************************************************************

+* Set draw window region to whole screen                                       *

+*   Parameter:                                                                 *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_WindowMax (void) {

+  GLCD_SetWindow (0, 0, WIDTH, HEIGHT);

+}

+

+

+/*******************************************************************************

+* Draw a pixel in foreground color                                             *

+*   Parameter:      x:        horizontal position                              *

+*                   y:        vertical position                                *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_PutPixel (unsigned int x, unsigned int y) {

+

+  if (Himax) {

+    wr_reg(0x02, x >>    8);            /* Column address start MSB           */

+    wr_reg(0x03, x &  0xFF);            /* Column address start LSB           */

+    wr_reg(0x04, x >>    8);            /* Column address end MSB             */

+    wr_reg(0x05, x &  0xFF);            /* Column address end LSB             */

+  

+    wr_reg(0x06, y >>    8);            /* Row address start MSB              */

+    wr_reg(0x07, y &  0xFF);            /* Row address start LSB              */

+    wr_reg(0x08, y >>    8);            /* Row address end MSB                */

+    wr_reg(0x09, y &  0xFF);            /* Row address end LSB                */

+  }

+  else {

+   #if (LANDSCAPE == 1)

+    wr_reg(0x20, y);

+    wr_reg(0x21, x);

+   #else

+    wr_reg(0x20, x);

+    wr_reg(0x21, y);

+   #endif

+  }

+

+  wr_cmd(0x22);

+  wr_dat(Color[TXT_COLOR]);

+}

+

+

+/*******************************************************************************

+* Set foreground color                                                         *

+*   Parameter:      color:    foreground color                                 *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_SetTextColor (unsigned short color) {

+

+  Color[TXT_COLOR] = color;

+}

+

+

+/*******************************************************************************

+* Set background color                                                         *

+*   Parameter:      color:    background color                                 *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_SetBackColor (unsigned short color) {

+

+  Color[BG_COLOR] = color;

+}

+

+

+/*******************************************************************************

+* Clear display                                                                *

+*   Parameter:      color:    display clearing color                           *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_Clear (unsigned short color) {

+  unsigned int i;

+

+  GLCD_WindowMax();

+  wr_cmd(0x22);

+  wr_dat_start();

+

+  for(i = 0; i < (WIDTH*HEIGHT); i++)

+    wr_dat_only(color);

+  wr_dat_stop();

+}

+

+

+/*******************************************************************************

+* Draw character on given position                                             *

+*   Parameter:      x:        horizontal position                              *

+*                   y:        vertical position                                *

+*                   cw:       character width in pixel                         *

+*                   ch:       character height in pixels                       *

+*                   c:        pointer to character bitmap                      *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_DrawChar (unsigned int x, unsigned int y, unsigned int cw, unsigned int ch, unsigned char *c) {

+  unsigned int i, j, k, pixs;

+

+  GLCD_SetWindow(x, y, cw, ch);

+

+  wr_cmd(0x22);

+  wr_dat_start();

+

+  k  = (cw + 7)/8;

+

+  if (k == 1) {

+    for (j = 0; j < ch; j++) {

+      pixs = *(unsigned char  *)c;

+      c += 1;

+      

+      for (i = 0; i < cw; i++) {

+        wr_dat_only (Color[(pixs >> i) & 1]);

+      }

+    }

+  }

+  else if (k == 2) {

+    for (j = 0; j < ch; j++) {

+      pixs = *(unsigned short *)c;

+      c += 2;

+      

+      for (i = 0; i < cw; i++) {

+        wr_dat_only (Color[(pixs >> i) & 1]);

+      }

+    }

+  }

+  wr_dat_stop();

+}

+

+

+/*******************************************************************************

+* Disply character on given line                                               *

+*   Parameter:      ln:       line number                                      *

+*                   col:      column number                                    *

+*                   fi:       font index (0 = 6x8, 1 = 16x24)                  *

+*                   c:        ascii character                                  *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_DisplayChar (unsigned int ln, unsigned int col, unsigned char fi, unsigned char c) {

+

+  c -= 32;

+  switch (fi) {

+    case 0:  /* Font 6 x 8 */

+      GLCD_DrawChar(col *  6, ln *  8,  6,  8, (unsigned char *)&Font_6x8_h  [c * 8]);

+      break;

+    case 1:  /* Font 16 x 24 */

+      GLCD_DrawChar(col * 16, ln * 24, 16, 24, (unsigned char *)&Font_16x24_h[c * 24]);

+      break;

+  }

+}

+

+

+/*******************************************************************************

+* Disply string on given line                                                  *

+*   Parameter:      ln:       line number                                      *

+*                   col:      column number                                    *

+*                   fi:       font index (0 = 6x8, 1 = 16x24)                  *

+*                   s:        pointer to string                                *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_DisplayString (unsigned int ln, unsigned int col, unsigned char fi, unsigned char *s) {

+

+  while (*s) {

+    GLCD_DisplayChar(ln, col++, fi, *s++);

+  }

+}

+

+

+/*******************************************************************************

+* Clear given line                                                             *

+*   Parameter:      ln:       line number                                      *

+*                   fi:       font index (0 = 6x8, 1 = 16x24)                  *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_ClearLn (unsigned int ln, unsigned char fi) {

+  unsigned char i;

+  unsigned char buf[60];

+

+  GLCD_WindowMax();

+  switch (fi) {

+    case 0:  /* Font 6 x 8 */

+      for (i = 0; i < (WIDTH+5)/6; i++)

+        buf[i] = ' ';

+      buf[i+1] = 0;

+      break;

+    case 1:  /* Font 16 x 24 */

+      for (i = 0; i < (WIDTH+15)/16; i++)

+        buf[i] = ' ';

+      buf[i+1] = 0;

+      break;

+  }

+  GLCD_DisplayString (ln, 0, fi, buf);

+}

+

+/*******************************************************************************

+* Draw bargraph                                                                *

+*   Parameter:      x:        horizontal position                              *

+*                   y:        vertical position                                *

+*                   w:        maximum width of bargraph (in pixels)            *

+*                   h:        bargraph height                                  *

+*                   val:      value of active bargraph (in 1/1024)             *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_Bargraph (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int val) {

+  int i,j;

+

+  val = (val * w) >> 10;                /* Scale value                        */

+  GLCD_SetWindow(x, y, w, h);

+  wr_cmd(0x22);

+  wr_dat_start();

+  for (i = 0; i < h; i++) {

+    for (j = 0; j <= w-1; j++) {

+      if(j >= val) {

+        wr_dat_only(Color[BG_COLOR]);

+      } else {

+        wr_dat_only(Color[TXT_COLOR]);

+      }

+    }

+  }

+  wr_dat_stop();

+}

+

+

+/*******************************************************************************

+* Display graphical bitmap image at position x horizontally and y vertically   *

+* (This function is optimized for 16 bits per pixel format, it has to be       *

+*  adapted for any other bits per pixel format)                                *

+*   Parameter:      x:        horizontal position                              *

+*                   y:        vertical position                                *

+*                   w:        width of bitmap                                  *

+*                   h:        height of bitmap                                 *

+*                   bitmap:   address at which the bitmap data resides         *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_Bitmap (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *bitmap) {

+  int i, j;

+  unsigned short *bitmap_ptr = (unsigned short *)bitmap;

+

+  GLCD_SetWindow (x, y, w, h);

+

+  wr_cmd(0x22);

+  wr_dat_start();

+  for (i = (h-1)*w; i > -1; i -= w) {

+    for (j = 0; j < w; j++) {

+      wr_dat_only (bitmap_ptr[i+j]);

+    }

+  }

+  wr_dat_stop();

+}

+

+

+

+/*******************************************************************************

+* Scroll content of the whole display for dy pixels vertically                 *

+*   Parameter:      dy:       number of pixels for vertical scroll             *

+*   Return:                                                                    *

+*******************************************************************************/

+

+void GLCD_ScrollVertical (unsigned int dy) {

+#if (LANDSCAPE == 0)

+  static unsigned int y = 0;

+

+  y = y + dy;

+  while (y >= HEIGHT)

+    y -= HEIGHT;

+

+  if (Himax) {

+    wr_reg(0x01, 0x08);

+    wr_reg(0x14, y>>8);                 /* VSP MSB                            */

+    wr_reg(0x15, y&0xFF);               /* VSP LSB                            */

+  }

+  else {

+    wr_reg(0x6A, y);

+    wr_reg(0x61, 3);

+  }

+#endif

+}

+

+

+/*******************************************************************************

+* Write a command to the LCD controller                                        *

+*   Parameter:      cmd:      command to write to the LCD                      *

+*   Return:                                                                    *

+*******************************************************************************/

+void GLCD_WrCmd (unsigned char cmd) {

+  wr_cmd (cmd);

+}

+

+

+/*******************************************************************************

+* Write a value into LCD controller register                                   *

+*   Parameter:      reg:      lcd register address                             *

+*                   val:      value to write into reg                          *

+*   Return:                                                                    *

+*******************************************************************************/

+void GLCD_WrReg (unsigned char reg, unsigned short val) {

+  wr_reg (reg, val);

+}

+/******************************************************************************/

diff --git a/F2024/coe718/labs/lab2/bitbanding/bitband.c b/F2024/coe718/labs/lab2/bitbanding/bitband.c
new file mode 100755
index 0000000..54c2b63
--- /dev/null
+++ b/F2024/coe718/labs/lab2/bitbanding/bitband.c
@@ -0,0 +1,115 @@
+#include "LPC17xx.h"

+#include "GLCD.h"

+

+#include <stdio.h>

+

+//------- ITM Stimulus Port definitions for printf ------------------- //

+#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))

+#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))

+#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))

+

+#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))

+#define TRCENA          0x01000000

+

+struct __FILE { int handle;  };

+FILE __stdout;

+FILE __stdin;

+

+int fputc(int ch, FILE *f) {

+  if (DEMCR & TRCENA) {

+    while (ITM_Port32(0) == 0);

+    ITM_Port8(0) = ch;

+  }

+  return(ch);

+}

+//------------------------------------------------------------------- //

+

+#define __USE_LCD 0	// Uncomment to use the LCD

+#define __FI      1 // Font index 16x24 

+

+// Bit Band Macros used to calculate the alias address at run time

+#define ADDRESS(x)    (*((volatile unsigned long *)(x)))

+#define BitBand(x, y) 	ADDRESS(((unsigned long)(x) & 0xF0000000) | 0x02000000 |(((unsigned long)(x) & 0x000FFFFF) << 5) | ((y) << 2))

+

+#ifdef __USE_LCD

+static inline void method2lcd(unsigned char* msg) {

+  GLCD_DisplayString(6,  8, __FI,  msg);

+}

+#endif

+

+// Simple register masking

+static void method_mask(){

+	LPC_GPIO1->FIOPIN ^= (1 << 28);

+	LPC_GPIO2->FIOPIN ^= (1 << 2);

+}

+

+// Define pointer with bitband method

+static void method_function(){

+	volatile unsigned long* bit1 = &BitBand(&LPC_GPIO1->FIOPIN, 29);		

+	volatile unsigned long* bit2 = &BitBand(&LPC_GPIO2->FIOPIN, 3);		

+

+	static _Bool state = 1;

+	

+	*bit1 = *bit2 = state;

+	state = !state;

+}

+

+// Raw bitbanding

+static void method_bitbanding() {

+	const size_t addr1 = 0x22000000 + (0x2009C034 * 32UL) + (31 * 4);

+	const size_t addr2 = 0x22000000 + (0x2009C054 * 32UL) + (4 * 4);

+

+	static _Bool state = 1;

+	

+	ADDRESS(addr1) = ADDRESS(addr2) = state;

+	state = !state;

+}

+	

+void SysTick_Handler(void) { 

+	static size_t tick = 0;

+	static size_t state = 0;

+

+	if (tick++ < 500) { return; }

+	tick = 0;

+		

+	// Uses MOVS instruction to implement jump table

+	if 			(state == 0) { method_mask(); state++; }

+	else if (state == 1) { method_function(); state++; }

+	else if (state == 2) { method_bitbanding(); state = 0; }

+	

+	#ifdef __USE_LCD

+	if 			(state == 1) { method2lcd("MASK    "); }

+	else if (state == 2) { method2lcd("FUNCTION"); }

+	else if (state == 0) { method2lcd("BITBAND "); }	

+	#endif

+}

+	

+int main(void){

+	LPC_SC->PCONP     |= (1 << 15);            /* enable power to GPIO & IOCON  */

+  LPC_GPIO1->FIODIR |= 0xB0000000;           /* LEDs on PORT1 are output      */

+  LPC_GPIO2->FIODIR |= 0x0000007C;           /* LEDs on PORT2 are output			*/

+	

+	// Configure SysTick with interrupt and internal clock source

+	ADDRESS(0xE000E010) = (1 << 0) | (1 << 1) | (1 << 2);

+	

+	// Run handler every 1ms

+	ADDRESS(0xE000E014) = 99999;

+	

+	#ifdef __USE_LCD

+  GLCD_Init();                               /* Initialize graphical LCD (if enabled */

+

+  GLCD_Clear(White);                         /* Clear graphical LCD display   */

+  GLCD_SetBackColor(Blue);

+  GLCD_SetTextColor(Yellow);

+  GLCD_DisplayString(0, 0, __FI, "     COE718 Lab 2    ");

+	GLCD_SetTextColor(White);

+  GLCD_DisplayString(1, 0, __FI, "       bitband.c     ");

+  GLCD_DisplayString(2, 0, __FI, "  Watch the LEDs!    ");

+  GLCD_SetBackColor(White);

+  GLCD_SetTextColor(Blue);

+  GLCD_DisplayString(6, 0, __FI, "Method:");

+	#endif

+	

+	// Let SysTick callback run in background

+	while (1) {}

+}
\ No newline at end of file
diff --git a/F2024/coe718/labs/lab2/bitbanding/bitband.h b/F2024/coe718/labs/lab2/bitbanding/bitband.h
new file mode 100755
index 0000000..af5be4a
--- /dev/null
+++ b/F2024/coe718/labs/lab2/bitbanding/bitband.h
@@ -0,0 +1,71 @@
+//*****************************************************************************

+//   +--+

+//   | ++----+

+//   +-++    |

+//     |     |

+//   +-+--+  |

+//   | +--+--+

+//   +----+    Copyright (c) 2011 Code Red Technologies Ltd.

+//

+// Header file containing C macros to provide bitbanding on Cortex-M3 MCU's

+//

+// Software License Agreement

+//

+// The software is owned by Code Red Technologies and/or its suppliers, and is

+// protected under applicable copyright laws.  All rights are reserved.  Any

+// use in violation of the foregoing restrictions may subject the user to criminal

+// sanctions under applicable laws, as well as to civil liability for the breach

+// of the terms and conditions of this license.

+//

+// THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED

+// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF

+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.

+// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT

+// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH

+// CODE RED TECHNOLOGIES LTD.

+//

+//*****************************************************************************

+

+#ifndef BITBAND_H_

+#define BITBAND_H_

+

+/* The Cortex-M3 memory map includes two bit-band regions. These occupy the lowest

+ * 1MB of the SRAM and peripheral memory regions respectively.

+ * + SRAM: 	Bit-band region: 	0x20000000 - 0x20100000

+ * 			Bit-band alias:		0x22000000 - 0x23FFFFFF

+ * + PERI:	Bit-band region:	0x40000000 - 0x40100000

+ * 			Bit-band alias:		0x42000000 - 0x43FFFFFF

+ * The mapping formula:

+ * 		bit_word_offset = (byte_offset * 32) + (bit_number * 4)

+ * 		bit_word_address = bit_band_base + bit_word_offset

+ * where:

+ * 	+ bit_word_offset: the position of the target bit in the bit-band memory region

+ * 	+ bit_word_addr: the address of the word in the alias memory region that maps to the target bit

+ *  + bit_band_base: the starting address of the alias region

+ *  + byte_offset: the number of byte in the bit-band region that contains the targeted bit

+ *  + bit_number: is the bit position (0-7) of the targeted bit

+ */

+

+/* Bit band SRAM definitions */

+#define BITBAND_SRAM_REF   0x20000000

+#define BITBAND_SRAM_BASE  0x22000000

+

+#define BITBAND_SRAM(a,b) ((BITBAND_SRAM_BASE + ((a-BITBAND_SRAM_REF)<<5) + (b<<2)))  // Convert SRAM address

+

+/* Bit band PERIPHERAL definitions */

+#define BITBAND_PERI_REF   0x40000000

+#define BITBAND_PERI_BASE  0x42000000

+

+#define BITBAND_PERI(a,b) ((BITBAND_PERI_BASE + ((a-BITBAND_PERI_REF)<<5) + (b<<2)))  // Convert PERI address

+

+/* Basic bit band function definitions */

+#define BITBAND_SRAM_ClearBit(a,b)	(*(volatile uint32_t *) (BITBAND_SRAM(a,b)) = 0)

+#define BITBAND_SRAM_SetBit(a,b)	(*(volatile uint32_t *) (BITBAND_SRAM(a,b)) = 1)

+#define BITBAND_SRAM_GetBit(a,b)	(*(volatile uint32_t *) (BITBAND_SRAM(a,b)))

+

+#define BITBAND_PERI_ClearBit(a,b)	(*(volatile uint32_t *) (BITBAND_PERI(a,b)) = 0)

+#define BITBAND_PERI_SetBit(a,b)	(*(volatile uint32_t *) (BITBAND_PERI(a,b)) = 1)

+#define BITBAND_PERI_GetBit(a,b)	(*(volatile uint32_t *) (BITBAND_PERI(a,b)))

+

+

+#endif /* BITBAND_H_ */