From e3d457d72f59bd442a3a8d13b311d7c8444e177d Mon Sep 17 00:00:00 2001 From: Kleidi Bujari Date: Fri, 4 Oct 2024 17:30:14 -0400 Subject: labs 1,2 --- F2024/coe718/labs/lab2/bitbanding/Font_16x24_h.h | 472 +++++++++++ F2024/coe718/labs/lab2/bitbanding/Font_6x8_h.h | 248 ++++++ F2024/coe718/labs/lab2/bitbanding/GLCD.h | 59 ++ .../coe718/labs/lab2/bitbanding/GLCD_SPI_LPC1700.c | 928 +++++++++++++++++++++ F2024/coe718/labs/lab2/bitbanding/bitband.c | 115 +++ F2024/coe718/labs/lab2/bitbanding/bitband.h | 71 ++ 6 files changed, 1893 insertions(+) create mode 100755 F2024/coe718/labs/lab2/bitbanding/Font_16x24_h.h create mode 100755 F2024/coe718/labs/lab2/bitbanding/Font_6x8_h.h create mode 100755 F2024/coe718/labs/lab2/bitbanding/GLCD.h create mode 100755 F2024/coe718/labs/lab2/bitbanding/GLCD_SPI_LPC1700.c create mode 100755 F2024/coe718/labs/lab2/bitbanding/bitband.c create mode 100755 F2024/coe718/labs/lab2/bitbanding/bitband.h (limited to 'F2024/coe718/labs/lab2/bitbanding') 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 +#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 + +//------- 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_ */ -- cgit 1.4.1