]> git.sur5r.net Git - freertos/commitdiff
Add TI library files necessary to build MSP430X demo. Still a work in progress.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 31 Dec 2010 18:56:23 +0000 (18:56 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 31 Dec 2010 18:56:23 +0000 (18:56 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1199 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

14 files changed:
Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_UCS.c [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_UCS.h [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_macros.h [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_board.c [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_board.h [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_buttons.c [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_buttons.h [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.c [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.h [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd_fonts.c [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd_fonts.h [new file with mode: 0644]
Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.ewp
Demo/MSP430X_MSP430F5438_IAR/main.c

diff --git a/Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_UCS.c b/Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_UCS.c
new file mode 100644 (file)
index 0000000..0b67ec7
--- /dev/null
@@ -0,0 +1,267 @@
+//*******************************************************************************\r
+//  Provides Functions to Initialize the UCS/FLL and clock sources\r
+//    File: hal_ucs.c\r
+//\r
+//    Texas Instruments\r
+//\r
+//    Version 1.2\r
+//    11/24/09\r
+//\r
+//    V1.0  Initial Version\r
+//    V1.1  Added timeout function\r
+//    V1.1  Added parameter for XTDrive\r
+//*******************************************************************************\r
+\r
+#include "msp430.h"\r
+#include "hal_UCS.h"\r
+\r
+//************************************************************************\r
+// Check and define required Defines\r
+//************************************************************************\r
+\r
+#ifndef XT1LFOFFG               // Defines if not available in header file\r
+#define XT1LFOFFG 0\r
+#endif\r
+#ifndef XT1HFOFFG               // Defines if not available in header file\r
+#define XT1HFOFFG 0\r
+#endif\r
+#ifndef XT2OFFG                 // Defines if not available in header file\r
+#define XT2OFFG 0\r
+#endif\r
+#ifndef XTS                    // Defines if not available in header file\r
+#define XTS 0\r
+#endif\r
+#ifndef XT2DRIVE_3             // Defines if not available in header file\r
+#define XT2DRIVE_3  0\r
+#endif\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for 32kHz Cristal on LFXT1\r
+ *\r
+*/\r
+void LFXT_Start(uint16_t xtdrive)\r
+{\r
+  UCSCTL6_L |= XT1DRIVE1_L+XT1DRIVE0_L; // Highest drive setting for XT1 startup\r
+\r
+  while (SFRIFG1 & OFIFG) {   // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags fault flags\r
+    SFRIFG1 &= ~OFIFG;        // Clear OFIFG fault flag\r
+  }\r
+  UCSCTL6 = (UCSCTL6 & ~(XT1DRIVE_3)) |(xtdrive); // set Drive mode\r
+}\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for 32kHz Cristal on LFXT1 with timeout counter\r
+ *\r
+*/\r
+uint16_t LFXT_Start_Timeout(uint16_t xtdrive, uint16_t timeout)\r
+{\r
+  UCSCTL6_L |= XT1DRIVE1_L+XT1DRIVE0_L; // Highest drive setting for XT1 startup\r
+\r
+  while ((SFRIFG1 & OFIFG) && timeout--){   // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags fault flags\r
+    SFRIFG1 &= ~OFIFG;        // Clear OFIFG fault flag\r
+  }\r
+  UCSCTL6 = (UCSCTL6 & ~(XT1DRIVE_3)) |(xtdrive); // set Drive mode\r
+  if (timeout)\r
+    return (UCS_STATUS_OK);\r
+  else\r
+    return (UCS_STATUS_ERROR);\r
+}\r
+\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for  XT1\r
+ *\r
+*/\r
+void XT1_Start(uint16_t xtdrive)\r
+{\r
+  UCSCTL6 &= ~(XT1OFF | XT1DRIVE_3);  // enable XT1\r
+  UCSCTL6 |= (XTS | xtdrive);         // enable XT1 and set XT1Drive\r
+\r
+  while (SFRIFG1 & OFIFG) {   // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags\r
+    SFRIFG1 &= ~OFIFG;        // Clear OFIFG fault flag\r
+  }\r
+}\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for XT1 with timeout counter\r
+ *\r
+*/\r
+uint16_t XT1_Start_Timeout(uint16_t xtdrive, uint16_t timeout)\r
+{\r
+  UCSCTL6 &= ~(XT1OFF | XT1DRIVE_3);  // enable XT1\r
+  UCSCTL6 |= (XTS | xtdrive);         // enable XT1 and set XT1Drive\r
+\r
+  while ((SFRIFG1 & OFIFG) && timeout--) {   // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags\r
+    SFRIFG1 &= ~OFIFG;        // Clear OFIFG fault flag\r
+  }\r
+  if (timeout)\r
+    return (UCS_STATUS_OK);\r
+  else\r
+    return (UCS_STATUS_ERROR);\r
+}\r
+\r
+//====================================================================\r
+/**\r
+ * Use  XT1 in Bypasss mode\r
+ *\r
+*/\r
+void XT1_Bypass(void)\r
+{\r
+  UCSCTL6 |= XT1BYPASS;\r
+\r
+  while (SFRIFG1 & OFIFG) {   // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags\r
+    SFRIFG1 &= ~OFIFG;        // Clear OFIFG fault flag\r
+  }\r
+}\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for  XT2\r
+ *\r
+*/\r
+void XT2_Start(uint16_t xtdrive)\r
+{\r
+  UCSCTL6 &= ~(XT2OFF | XT2DRIVE_3);  // enable XT2\r
+  UCSCTL6 |= (xtdrive);               // Set XT2Drive\r
+\r
+  while (SFRIFG1 & OFIFG) {   // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags\r
+    SFRIFG1 &= ~OFIFG;        // Clear OFIFG fault flag\r
+  }\r
+\r
+}\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for XT2 with timeout counter\r
+ *\r
+*/\r
+uint16_t XT2_Start_Timeout(uint16_t xtdrive, uint16_t timeout)\r
+{\r
+  UCSCTL6 &= ~XT2OFF;                       // Set XT2 On\r
+  UCSCTL6 &= ~XT2DRIVE_3;                   // enable XT2\r
+  UCSCTL6 |= (xtdrive);                     // Set XT2Drive\r
+\r
+  while ((SFRIFG1 & OFIFG) && timeout--){   // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags\r
+    SFRIFG1 &= ~OFIFG;        // Clear OFIFG fault flag\r
+  }\r
+  if (timeout)\r
+    return (UCS_STATUS_OK);\r
+  else\r
+    return (UCS_STATUS_ERROR);\r
+}\r
+\r
+//====================================================================\r
+/**\r
+ * Use XT2 in Bypasss mode\r
+ *\r
+*/\r
+void XT2_Bypass(void)\r
+{\r
+#ifdef XT2BYPASS              // on devices without XT2 this function will be empty\r
+  UCSCTL6 |= XT2BYPASS;\r
+\r
+  while (SFRIFG1 & OFIFG) {   // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags\r
+    SFRIFG1 &= ~OFIFG;        // Clear OFIFG fault flag\r
+  }\r
+#endif\r
+}\r
+\r
+//====================================================================\r
+/**\r
+  * Initializes FLL of the UCS and wait till settled\r
+  *\r
+  * \param fsystem  required system frequency (MCLK) in kHz\r
+  * \param ratio    ratio between MCLK and FLLREFCLK\r
+  */\r
+void Init_FLL_Settle(uint16_t fsystem, uint16_t ratio)\r
+{\r
+  volatile uint16_t x = ratio * 32;       \r
+  // save actual state of FLL loop control\r
+  uint16_t globalInterruptState = __get_SR_register() & SCG0;\r
+                                                               \r
+  __bic_SR_register(SCG0);      // Enable FLL loop control\r
+\r
+  Init_FLL(fsystem, ratio);\r
+  \r
+  while(x--)\r
+  {\r
+   __delay_cycles(30); \r
+  }\r
+  \r
+  __bis_SR_register(globalInterruptState);     // restore previous state\r
+\r
+}\r
+\r
+//====================================================================\r
+/**\r
+  * Initializes FLL of the UCS\r
+  *\r
+  * \param fsystem  required system frequency (MCLK) in kHz\r
+  * \param ratio    ratio between fsystem and FLLREFCLK\r
+  */\r
+static void Init_FLL(uint16_t fsystem, uint16_t ratio)\r
+{\r
+  uint16_t d, dco_div_bits;\r
+  uint16_t mode = 0;\r
+\r
+  d = ratio;\r
+  dco_div_bits = FLLD__2;        // Have at least a divider of 2\r
+  if (fsystem > 16000){\r
+    d >>= 1 ;\r
+    mode = 1;\r
+  }\r
+  else\r
+    fsystem <<= 1;               // fsystem = fsystem * 2\r
+\r
+  while (d > 512)\r
+  {\r
+    dco_div_bits = dco_div_bits + FLLD0;  // set next higher div level\r
+    d >>= 1;\r
+  }\r
+\r
+  UCSCTL0 = 0x000;               // Set DCO to lowest Tap\r
+\r
+  UCSCTL2 &= ~(0x3FF);           // Reset FN bits\r
+  UCSCTL2 = dco_div_bits | (d - 1);\r
+\r
+  if (fsystem <= 630)            //           fsystem < 0.63MHz\r
+       UCSCTL1= DCORSEL_0 ;\r
+  else if (fsystem <  1250)      // 0.63MHz < fsystem < 1.25MHz\r
+       UCSCTL1= DCORSEL_1 ;\r
+  else if (fsystem <  2500)      // 1.25MHz < fsystem <  2.5MHz\r
+       UCSCTL1= DCORSEL_2 ;\r
+  else if (fsystem <  5000)      // 2.5MHz  < fsystem <    5MHz\r
+       UCSCTL1= DCORSEL_3 ;\r
+  else if (fsystem <  10000)     // 5MHz    < fsystem <   10MHz\r
+       UCSCTL1= DCORSEL_4 ;\r
+  else if (fsystem <  20000)     // 10MHz   < fsystem <   20MHz\r
+       UCSCTL1= DCORSEL_5 ;\r
+  else if (fsystem <  40000)     // 20MHz   < fsystem <   40MHz\r
+       UCSCTL1= DCORSEL_6 ;\r
+  else\r
+       UCSCTL1= DCORSEL_7 ;\r
+\r
+  while (SFRIFG1 & OFIFG) {                               // check OFIFG fault flag\r
+    UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG);     // Clear OSC flaut Flags\r
+    SFRIFG1 &= ~OFIFG;                                    // Clear OFIFG fault flag\r
+  }\r
+\r
+  if (mode == 1)                                         // fsystem > 16000\r
+    SELECT_MCLK_SMCLK(SELM__DCOCLK + SELS__DCOCLK);       // select DCOCLK\r
+  else\r
+   SELECT_MCLK_SMCLK(SELM__DCOCLKDIV + SELS__DCOCLKDIV); // selcet DCODIVCLK\r
+\r
+  \r
+} // End of fll_init()\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_UCS.h b/Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_UCS.h
new file mode 100644 (file)
index 0000000..d78aa5d
--- /dev/null
@@ -0,0 +1,143 @@
+//*******************************************************************************\r
+//  Provides Functions to Initialize the UCS/FLL and clock sources\r
+//    File: hal_ucs.c\r
+//\r
+//    Texas Instruments\r
+//\r
+//    Version 1.2\r
+//    11/24/09\r
+//\r
+//    V1.0  Initial Version\r
+//    V1.1  Added timeout function\r
+//    V1.1  Added parameter for XTDrive\r
+//*******************************************************************************\r
+\r
+\r
+#ifndef __hal_UCS\r
+#define __hal_UCS\r
+\r
+#include <stdint.h>\r
+#include "hal_macros.h"\r
+\r
+/*************************************************************************\r
+* MACROS\r
+**************************************************************************/\r
+\r
+/* Select source for FLLREF  e.g. SELECT_FLLREF(SELREF__XT1CLK) */\r
+#define SELECT_FLLREF(source) st(UCSCTL3 = (UCSCTL3 & ~(SELREF_7)) | (source);) \r
+/* Select source for ACLK    e.g. SELECT_ACLK(SELA__XT1CLK) */\r
+#define SELECT_ACLK(source)   st(UCSCTL4 = (UCSCTL4 & ~(SELA_7))   | (source);) \r
+/* Select source for MCLK    e.g. SELECT_MCLK(SELM__XT2CLK) */\r
+#define SELECT_MCLK(source)   st(UCSCTL4 = (UCSCTL4 & ~(SELM_7))   | (source);) \r
+/* Select source for SMCLK   e.g. SELECT_SMCLK(SELS__XT2CLK) */\r
+#define SELECT_SMCLK(source)  st(UCSCTL4 = (UCSCTL4 & ~(SELS_7))   | (source);) \r
+/* Select source for MCLK and SMCLK e.g. SELECT_MCLK_SMCLK(SELM__DCOCLK + SELS__DCOCLK) */\r
+#define SELECT_MCLK_SMCLK(sources) st(UCSCTL4 = (UCSCTL4 & ~(SELM_7 + SELS_7)) | (sources);)\r
+\r
+/* set ACLK/x */\r
+#define ACLK_DIV(x)         st(UCSCTL5 = (UCSCTL5 & ~(DIVA_7)) | (DIVA__##x);)     \r
+/* set MCLK/x */\r
+#define MCLK_DIV(x)         st(UCSCTL5 = (UCSCTL5 & ~(DIVM_7)) | (DIVM__##x);)     \r
+/* set SMCLK/x */\r
+#define SMCLK_DIV(x)        st(UCSCTL5 = (UCSCTL5 & ~(DIVS_7)) | (DIVS__##x);)     \r
+/* Select divider for FLLREF  e.g. SELECT_FLLREFDIV(2) */\r
+#define SELECT_FLLREFDIV(x) st(UCSCTL3 = (UCSCTL3 & ~(FLLREFDIV_7))|(FLLREFDIV__##x);) \r
+\r
+//************************************************************************\r
+// Defines\r
+//************************************************************************\r
+\r
+#define UCS_STATUS_OK     0\r
+#define UCS_STATUS_ERROR  1\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for 32kHz Cristal on LFXT1\r
+ *\r
+ * \param xtdrive: Bits defining the LFXT drive mode after startup\r
+ *\r
+*/\r
+extern void LFXT_Start(uint16_t xtdrive);\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for 32kHz Cristal on LFXT1 with timeout counter\r
+ *\r
+ * \param xtdrive: Bits defining the LFXT drive mode after startup\r
+ * \param timeout: value for the timeout counter\r
+ *\r
+*/\r
+extern uint16_t LFXT_Start_Timeout(uint16_t xtdrive, uint16_t timeout);\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for XT1\r
+ *\r
+ * \param xtdrive: Bits defining the XT drive mode\r
+ *\r
+*/\r
+extern void XT1_Start(uint16_t xtdrive);\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for XT1 with timeout counter\r
+ *\r
+ * \param xtdrive: Bits defining the XT drive mode\r
+ * \param timeout: value for the timeout counter\r
+ *\r
+*/\r
+extern uint16_t XT1_Start_Timeout(uint16_t xtdrive, uint16_t timeout);\r
+\r
+//====================================================================\r
+/**\r
+ * Use XT1 in Bypasss mode\r
+ *\r
+*/\r
+extern void XT1_Bypass(void);\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for XT2\r
+ *\r
+ * \param xtdrive: Bits defining the XT drive mode\r
+ *\r
+*/\r
+extern void XT2_Start(uint16_t xtdrive);\r
+\r
+//====================================================================\r
+/**\r
+ * Startup routine for XT2 with timeout counter\r
+ *\r
+ * \param xtdrive: Bits defining the XT drive mode\r
+ * \param timeout: value for the timeout counter\r
+ *\r
+*/\r
+extern uint16_t XT2_Start_Timeout(uint16_t xtdrive, uint16_t timeout);\r
+\r
+//====================================================================\r
+/**\r
+ * Use XT2 in Bypasss mode for MCLK\r
+ *\r
+*/\r
+extern void XT2_Bypass(void);\r
+\r
+//====================================================================\r
+/**\r
+  * Initializes FLL of the UCS and wait till settled\r
+  *\r
+  * \param fsystem  required system frequency (MCLK) in kHz\r
+  * \param ratio    ratio between fsystem and FLLREFCLK\r
+  */\r
+extern void Init_FLL_Settle(uint16_t fsystem, uint16_t ratio);\r
+\r
+\r
+//====================================================================\r
+/**\r
+  * Initializes FLL of the UCS\r
+  *\r
+  * \param fsystem  required system frequency (MCLK) in kHz\r
+  * \param ratio    ratio between fsystem and FLLREFCLK\r
+  */\r
+static void Init_FLL(uint16_t fsystem, uint16_t ratio);\r
+\r
+#endif /* __hal_UCS */\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_macros.h b/Demo/MSP430X_MSP430F5438_IAR/F5XX_6XX_Core_Lib/hal_macros.h
new file mode 100644 (file)
index 0000000..4eec43a
--- /dev/null
@@ -0,0 +1,4 @@
+/*\r
+ *  This macro is for use by other macros to form a fully valid C statement.\r
+ */\r
+#define st(x)      do { x } while (__LINE__ == -1)\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h
new file mode 100644 (file)
index 0000000..7fa5fde
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************\r
+    Filename: hal_MSP-EXP430F5438.h\r
+\r
+    Copyright 2010 Texas Instruments, Inc.\r
+    \r
+This is the master header file and also the only necessary file to be included\r
+in order to use MSP-EXP430F5438 HAL.          \r
+***************************************************************************/\r
+#ifndef HAL_MSP_EXP430F5438_H\r
+#define HAL_MSP_EXP430F5438_H\r
+\r
+#include "msp430.h" \r
+\r
+#include "hal_PMM.h"\r
+#include "hal_UCS.h"\r
+\r
+#include "hal_lcd.h"\r
+#include "hal_buttons.h"\r
+#include "hal_adc.h"\r
+#include "hal_board.h"\r
+#include "hal_usb.h"\r
+#include "hal_buttons.h"\r
+#include "hal_rf.h"\r
+#include "hal_rtc.h" \r
+#include "hal_tlv.h" \r
+\r
+#endif /* HAL_MSP_EXP430F5438_H */\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_board.c b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_board.c
new file mode 100644 (file)
index 0000000..ff4c940
--- /dev/null
@@ -0,0 +1,74 @@
+/** \r
+ * @file  hal_board.c\r
+ * \r
+ * Copyright 2010 Texas Instruments, Inc.\r
+******************************************************************************/\r
+#include "msp430.h"\r
+#include "hal_MSP-EXP430F5438.h"\r
+\r
+/**********************************************************************//**\r
+ * @brief  Initializes ACLK, MCLK, SMCLK outputs on P11.0, P11.1, \r
+ *         and P11.2, respectively.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halBoardOutputSystemClock(void) //outputs clock to testpoints\r
+{\r
+  CLK_PORT_DIR |= 0x07;\r
+  CLK_PORT_SEL |= 0x07;                           \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Stops the output of ACLK, MCLK, SMCLK on P11.0, P11.1, and P11.2.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halBoardStopOutputSystemClock(void)\r
+{  \r
+  CLK_PORT_OUT &= ~0x07;\r
+  CLK_PORT_DIR |= 0x07;        \r
+  CLK_PORT_SEL &= ~0x07;                 \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Initializes all GPIO configurations. \r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halBoardInit(void)\r
+{  \r
+  //Tie unused ports\r
+  PAOUT  = 0;\r
+  PADIR  = 0xFFFF;  \r
+  PASEL  = 0;\r
+  PBOUT  = 0;  \r
+  PBDIR  = 0xFFFF;\r
+  PBSEL  = 0;\r
+  PCOUT  = 0;    \r
+  PCDIR  = 0xFFFF;\r
+  PCSEL  = 0;  \r
+  PDOUT  = 0;  \r
+  PDDIR  = 0xFFFF;\r
+  PDSEL  = 0x0003;  \r
+  PEOUT  = 0;  \r
+  PEDIR  = 0xFEFF;                          // P10.0 to USB RST pin, \r
+                                            // ...if enabled with J5\r
+  PESEL  = 0;  \r
+  P11OUT = 0;\r
+  P11DIR = 0xFF;\r
+  PJOUT  = 0;    \r
+  PJDIR  = 0xFF;\r
+  P11SEL = 0;\r
+     \r
+  AUDIO_PORT_OUT = AUDIO_OUT_PWR_PIN ;\r
+  USB_PORT_DIR &= ~USB_PIN_RXD;             // USB RX Pin, Input with \r
+                                            // ...pulled down Resistor\r
+  USB_PORT_OUT &= ~USB_PIN_RXD;\r
+  USB_PORT_REN |= USB_PIN_RXD;\r
+}\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_board.h b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_board.h
new file mode 100644 (file)
index 0000000..603c728
--- /dev/null
@@ -0,0 +1,31 @@
+/**********************************************************************//**\r
+    Filename: hal_board.h\r
+\r
+    Copyright 2010 Texas Instruments, Inc.\r
+***************************************************************************/\r
+#ifndef HAL_BOARD_H\r
+#define HAL_BOARD_H\r
+\r
+#define LED_PORT_DIR      P1DIR\r
+#define LED_PORT_OUT      P1OUT\r
+#define LED_1             BIT0\r
+#define LED_2             BIT1\r
+\r
+#define CLK_PORT_DIR      P11DIR //outputs clocks to testpoints\r
+#define CLK_PORT_OUT      P11OUT\r
+#define CLK_PORT_SEL      P11SEL\r
+\r
+/*----------------------------------------------------------------\r
+ *                  Function Prototypes\r
+ *----------------------------------------------------------------\r
+ */\r
+static void halBoardGetSystemClockSettings(unsigned char systemClockSpeed, \r
+                                           unsigned char *setDcoRange,\r
+                                           unsigned char *setVCore,\r
+                                           unsigned int  *setMultiplier);\r
+\r
+extern void halBoardOutputSystemClock(void);\r
+extern void halBoardStopOutputSystemClock(void);\r
+extern void halBoardInit(void);\r
+\r
+#endif /* HAL_BOARD_H */\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_buttons.c b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_buttons.c
new file mode 100644 (file)
index 0000000..42c8f0e
--- /dev/null
@@ -0,0 +1,76 @@
+/** \r
+ * @file  hal_buttons.c\r
+ * \r
+ * Copyright 2010 Texas Instruments, Inc.\r
+***************************************************************************/\r
+#include "msp430.h"\r
+#include "hal_MSP-EXP430F5438.h"\r
+\r
+/**********************************************************************//**\r
+ * @brief  Initializes the GPIO ports to act as buttons.\r
+ * \r
+ * @param  buttonsMask The mask that specifies the button pins.\r
+ * \r
+ * @return none\r
+ *************************************************************************/   \r
+void halButtonsInit(unsigned char buttonsMask)\r
+{  \r
+  BUTTON_PORT_OUT |= buttonsMask;\r
+  BUTTON_PORT_DIR &= ~buttonsMask;\r
+  BUTTON_PORT_REN |= buttonsMask; \r
+  BUTTON_PORT_SEL &= ~buttonsMask;       \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Returns LOW for the buttons pressed.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return The buttons that have been pressed, identified by a bit = 0. \r
+ *************************************************************************/\r
+unsigned char halButtonsPressed(void)\r
+{\r
+  unsigned char value;\r
+  value = BUTTON_PORT_IN;\r
+  return (0xFF - value);                    //Low==ButtonPressed\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Enables button interrupt(s) with low to high transitions.\r
+ * \r
+ * @param  buttonIntEnableMask The button pin(s) for which the interrupt(s) \r
+ *                             should be enabled.\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halButtonsInterruptEnable(unsigned char buttonIntEnableMask)\r
+{\r
+  BUTTON_PORT_IES &= ~buttonIntEnableMask;\r
+  BUTTON_PORT_IFG &= ~buttonIntEnableMask;\r
+  BUTTON_PORT_IE |= buttonIntEnableMask;\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Disables button interrupts \r
+ * \r
+ * @param  buttonIntEnableMask The button pin(s) for which the interrupt(s)\r
+ *                             should be disabled. \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halButtonsInterruptDisable(unsigned char buttonIntEnableMask)\r
+{\r
+  BUTTON_PORT_IE &= ~buttonIntEnableMask;\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Clears the button GPIO settings, disables the buttons. \r
+ * \r
+ * @param  none\r
+ *************************************************************************/\r
+void halButtonsShutDown()\r
+{\r
+  //All output, outputting 0s\r
+  BUTTON_PORT_OUT &= ~(BUTTON_ALL);\r
+  BUTTON_PORT_DIR |= BUTTON_ALL;             \r
+}\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_buttons.h b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_buttons.h
new file mode 100644 (file)
index 0000000..ffe691a
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************\r
+    Filename: hal_buttons.h\r
+\r
+    Copyright 2010 Texas Instruments, Inc.\r
+***************************************************************************/\r
+#ifndef HAL_BUTTONS_H\r
+#define HAL_BUTTONS_H\r
+\r
+#define BUTTON_PORT_DIR   P2DIR\r
+#define BUTTON_PORT_SEL   P2SEL\r
+#define BUTTON_PORT_OUT   P2OUT\r
+#define BUTTON_PORT_REN   P2REN\r
+#define BUTTON_PORT_IE    P2IE\r
+#define BUTTON_PORT_IES   P2IES\r
+#define BUTTON_PORT_IFG   P2IFG\r
+#define BUTTON_PORT_IN    P2IN\r
+\r
+#define BUTTON_SELECT     BIT3\r
+#define BUTTON_DOWN       BIT5\r
+#define BUTTON_UP         BIT4\r
+#define BUTTON_RIGHT      BIT2\r
+#define BUTTON_LEFT       BIT1 \r
+#define BUTTON_S1         BIT6 \r
+#define BUTTON_S2         BIT7 \r
+#define BUTTON_ALL        0xFE\r
+\r
+extern volatile unsigned char buttonsPressed;\r
+\r
+/*-------------------------------------------------------------\r
+ *                  Function Prototypes \r
+ * ------------------------------------------------------------*/ \r
+extern void halButtonsInit(unsigned char buttonsMask);\r
+extern unsigned char halButtonsPressed(void);\r
+extern void halButtonsInterruptEnable(unsigned char buttonIntEnableMask);\r
+extern void halButtonsInterruptDisable(unsigned char buttonIntEnableMask);\r
+extern void halButtonsShutDown();\r
+\r
+#endif /* HAL_BUTTONS_H */\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.c b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.c
new file mode 100644 (file)
index 0000000..12c611e
--- /dev/null
@@ -0,0 +1,1122 @@
+/** \r
+ * @file  hal_lcd.c\r
+ * \r
+ * Copyright 2010 Texas Instruments, Inc.\r
+***************************************************************************/\r
+\r
+#include "msp430.h"\r
+#include "hal_MSP-EXP430F5438.h"\r
+#include "hal_lcd_fonts.h"\r
+\r
+unsigned char LcdInitMacro[]={\r
+            0x74,0x00,0x00,0x76,0x00,0x01,  // R00 start oscillation\r
+            0x74,0x00,0x01,0x76,0x00,0x0D,  // R01 driver output control\r
+            0x74,0x00,0x02,0x76,0x00,0x4C,  // R02 LCD - driving waveform control\r
+            0x74,0x00,0x03,0x76,0x12,0x14,  // R03 Power control\r
+            0x74,0x00,0x04,0x76,0x04,0x66,  // R04 Contrast control\r
+            0x74,0x00,0x05,0x76,0x00,0x10,  // R05 Entry mode\r
+            0x74,0x00,0x06,0x76,0x00,0x00,  // R06 RAM data write mask\r
+            0x74,0x00,0x07,0x76,0x00,0x15,  // R07 Display control\r
+            0x74,0x00,0x08,0x76,0x00,0x03,  // R08 Cursor Control\r
+            0x74,0x00,0x09,0x76,0x00,0x00,  // R09 RAM data write mask\r
+            0x74,0x00,0x0A,0x76,0x00,0x15,  // R0A \r
+            0x74,0x00,0x0B,0x76,0x00,0x03,  // R0B Horizontal Cursor Position\r
+            0x74,0x00,0x0C,0x76,0x00,0x03,  // R0C Vertical Cursor Position\r
+            0x74,0x00,0x0D,0x76,0x00,0x00,  // R0D \r
+            0x74,0x00,0x0E,0x76,0x00,0x15,  // R0E \r
+            0x74,0x00,0x0F,0x76,0x00,0x03,  // R0F \r
+            0x74,0x00,0x10,0x76,0x00,0x15,  // R0E \r
+            0x74,0x00,0x11,0x76,0x00,0x03,  // R0F \r
+};\r
+\r
+unsigned char Read_Block_Address_Macro[]= {0x74,0x00,0x12,0x77,0x00,0x00};                                     \r
+unsigned char Draw_Block_Value_Macro[]={0x74,0x00,0x12,0x76,0xFF,0xFF};\r
+unsigned char Draw_Block_Address_Macro[]={0x74,0x00,0x11,0x76,0x00,0x00};\r
+\r
+unsigned int  LcdAddress = 0, LcdTableAddress = 0;\r
+unsigned char contrast   = 0x66;\r
+unsigned char backlight  = 8;\r
+int LCD_MEM[110*17];           //This array stores a copy of all data on the LCD \r
+                                                       //screen. If memory is an issue though, this array \r
+                                                       //can be eliminated and the halLcdReadBlock()\r
+                                                       //command can be used instead whenever you are \r
+                                                       //manipulating the currently displayed data.\r
+\r
+/**********************************************************************//**\r
+ * @brief  Sends 3+3 bytes of data to the LCD using the format specified\r
+ *         by the LCD Guide.\r
+ * \r
+ * @param  Data[] Data array for transmission \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdSendCommand(unsigned char Data[]) \r
+{\r
+  unsigned char i;\r
+\r
+  LCD_CS_RST_OUT &= ~LCD_CS_PIN;            //CS = 0 --> Start Transfer\r
+  for ( i = 0; i < 6; i++ )\r
+  {\r
+    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+    UCB2TXBUF = Data[i];                    // Load data \r
+\r
+    if (i == 2)                             //Pull CS up after 3 bytes\r
+    {\r
+      while (UCB2STAT & UCBUSY);       \r
+      LCD_CS_RST_OUT |= LCD_CS_PIN;         //CS = 1 --> Stop Transfer\r
+      LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer         \r
+    }\r
+  }\r
+  while (UCB2STAT & UCBUSY);           \r
+  LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Initializes the USCI module, LCD device for communication. \r
+ *           \r
+ * - Sets up the SPI2C Communication Module\r
+ * - Performs Hitachi LCD Initialization Procedure\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdInit(void) \r
+{\r
+  volatile unsigned int i=0;\r
+\r
+  LCD_CS_RST_OUT |= LCD_CS_PIN | LCD_RESET_PIN ;\r
+  LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ;     \r
+\r
+  LCD_BACKLT_SEL |= LCD_BACKLIGHT_PIN;\r
+\r
+  LCD_CS_RST_OUT &= ~LCD_RESET_PIN;         // Reset LCD\r
+  __delay_cycles(0x47FF);                   //Reset Pulse\r
+  LCD_CS_RST_OUT |= LCD_RESET_PIN;    \r
+\r
+  // UCLK,MOSI setup, SOMI cleared\r
+  LCD_SPI_SEL |= LCD_MOSI_PIN + LCD_CLK_PIN;\r
+  LCD_SPI_SEL &= ~LCD_MISO_PIN;\r
+  LCD_SPI_DIR &= ~(LCD_MISO_PIN + LCD_MOSI_PIN);            // Pin direction controlled by module,\r
+                                                            // Set both pins to input as default\r
\r
+  // Initialize the USCI_B2 module for SPI operation \r
+  UCB2CTL1 = UCSWRST;                       // Hold USCI in SW reset mode while configuring it\r
+  UCB2CTL0 = UCMST+UCSYNC+UCCKPL+UCMSB;     // 3-pin, 8-bit SPI master\r
+  UCB2CTL1 |= UCSSEL_2;                     // SMCLK\r
+  UCB2BR0 = 4;                              // Note: Do not exceed D/S spec for UCLK!\r
+  UCB2BR1 = 0;\r
+  UCB2CTL1 &= ~UCSWRST;                     // Release USCI state machine\r
+  UCB2IFG &= ~UCRXIFG;\r
+\r
+  // Wake-up the LCD as per datasheet specifications\r
+  halLcdActive();\r
+  \r
+  // LCD Initialization Routine Using Predefined Macros\r
+  halLcdSendCommand(&LcdInitMacro[ 1 * 6 ]);\r
+  halLcdSendCommand(&LcdInitMacro[ 2 * 6 ]);\r
+  halLcdSendCommand(&LcdInitMacro[ 4 * 6 ]);\r
+  halLcdSendCommand(&LcdInitMacro[ 5 * 6 ]);\r
+  halLcdSendCommand(&LcdInitMacro[ 6 * 6 ]);\r
+  halLcdSendCommand(&LcdInitMacro[ 7 * 6 ]);\r
+\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Shuts down the LCD display and hdisables the USCI communication. \r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdShutDown(void)\r
+{\r
+  halLcdStandby();  \r
+\r
+  LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ;\r
+  LCD_CS_RST_OUT &= ~(LCD_CS_PIN | LCD_RESET_PIN );  \r
+  LCD_CS_RST_OUT &= ~LCD_RESET_PIN;                                         \r
+  \r
+  LCD_SPI_SEL &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN);\r
+  LCD_CS_RST_DIR |= LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN;\r
+  LCD_CS_RST_OUT &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN);  \r
+  \r
+  UCB2CTL0 = UCSWRST; \r
+}  \r
+\r
+/**********************************************************************//**\r
+ * @brief  Initializes the LCD backlight PWM signal. \r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ * \r
+ *************************************************************************/\r
+void halLcdBackLightInit(void)\r
+{\r
+  LCD_BACKLT_DIR |= LCD_BACKLIGHT_PIN;\r
+  LCD_BACKLT_OUT |= LCD_BACKLIGHT_PIN;     \r
+  LCD_BACKLT_SEL |= LCD_BACKLIGHT_PIN;\r
+\r
+  TA0CCTL3 = OUTMOD_7;\r
+  TA0CCR3 = TA0CCR0 >> 1 ;\r
+  backlight = 8;\r
+  \r
+  TA0CCR0 = 400;\r
+  TA0CTL = TASSEL_2+MC_1;   \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Get function for the backlight PWM's duty cycle. \r
+ * \r
+ * @param  none \r
+ * \r
+ * @return backlight One of the the 17 possible settings - valued 0 to 16. \r
+ *\r
+ *************************************************************************/\r
+unsigned int halLcdGetBackLight(void)\r
+{  \r
+  return backlight;\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Set function for the backlight PWM's duty cycle \r
+ * \r
+ * @param  BackLightLevel The target backlight duty cycle - valued 0 to 16.\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdSetBackLight(unsigned char BackLightLevel)\r
+{ \r
+  unsigned int dutyCycle = 0, i, dummy; \r
+  \r
+  if (BackLightLevel > 0)\r
+  {\r
+    TA0CCTL3 = OUTMOD_7;\r
+    dummy = (TA0CCR0 >> 4);\r
+    \r
+    for (i = 0; i < BackLightLevel; i++) \r
+      dutyCycle += dummy;\r
+      \r
+    TA0CCR3 = dutyCycle;\r
+    \r
+    // If the backlight was previously turned off, turn it on. \r
+    if (!backlight)                         \r
+      TA0CTL |= MC0;  \r
+  }\r
+  else\r
+  {    \r
+    TA0CCTL3 = 0;\r
+    TA0CTL &= ~MC0;\r
+  }  \r
+  backlight = BackLightLevel;\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Turns off the backlight. \r
+ * \r
+ * Clears the respective GPIO and timer settings.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdShutDownBackLight(void)\r
+{\r
+  LCD_BACKLT_DIR |= LCD_BACKLIGHT_PIN;\r
+  LCD_BACKLT_OUT &= ~(LCD_BACKLIGHT_PIN);  \r
+  LCD_BACKLT_SEL &= ~LCD_BACKLIGHT_PIN;\r
+  \r
+  TA0CCTL3 = 0;\r
+  TA0CTL = 0;  \r
+  \r
+  backlight = 0;  \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Set function for the contrast level of the LCD. \r
+ * \r
+ * @param  ContrastLevel The target contrast level \r
+ * \r
+ * @return none \r
+ *************************************************************************/\r
+void halLcdSetContrast(unsigned char ContrastLevel)\r
+{\r
+  if (ContrastLevel > 127) ContrastLevel = 127;\r
+  if (ContrastLevel < 70) ContrastLevel = 70;\r
+  LcdInitMacro[ 0x04 * 6 + 5 ] = ContrastLevel;\r
+  halLcdSendCommand(&LcdInitMacro[ 0x04 * 6 ]);\r
+} \r
+\r
+/**********************************************************************//**\r
+ * @brief  Get function for the contrast level of the LCD. \r
+ * \r
+ * @param  none\r
+ * \r
+ * @return ContrastLevel The LCD constrast level\r
+ *************************************************************************/\r
+unsigned char halLcdGetContrast(void)\r
+{\r
+  return LcdInitMacro[ 0x04 * 6 + 5 ] ;\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Turns the LCD cursor on at the current text position.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdCursor(void)\r
+{\r
+  LcdInitMacro[  8 * 6 + 5 ] ^= BIT2;\r
+  halLcdSendCommand(&LcdInitMacro[ 8 * 6 ]);\r
+  \r
+  LcdInitMacro[ 0x0B * 6 + 5 ] = ((LcdAddress & 0x1F) << 3) ;\r
+  LcdInitMacro[ 0x0B * 6 + 4 ] = ( (LcdAddress & 0x1F) << 3 ) + 3;\r
+  LcdInitMacro[ 0x0C * 6 + 5 ] = (LcdAddress >> 5);\r
+  LcdInitMacro[ 0x0C * 6 + 4 ] = (LcdAddress >> 5) + 7;\r
+  halLcdSendCommand(&LcdInitMacro[ 0x0B * 6 ]);\r
+  halLcdSendCommand(&LcdInitMacro[ 0x0C * 6 ]);\r
+  \r
+  halLcdSetAddress(LcdAddress);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Turns off the LCD cursor.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdCursorOff(void)\r
+{\r
+  LcdInitMacro[  8 * 6 + 5 ] &= ~BIT2;\r
+  halLcdSendCommand(&LcdInitMacro[ 8 * 6 ]);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Inverts the grayscale values of the LCD display (Black <> white).  \r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdReverse(void)\r
+{\r
+  LcdInitMacro[  7 * 6 + 5 ] ^= BIT1;\r
+  halLcdSendCommand(&LcdInitMacro[ 7 * 6 ]);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Sets the LCD in standby mode to reduce power consumption.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdStandby(void)\r
+{\r
+  LcdInitMacro[ 3 * 6 + 5 ] &= (~BIT3) & (~BIT2);\r
+  LcdInitMacro[ 3 * 6 + 5 ] |= BIT0;\r
+  halLcdSendCommand(&LcdInitMacro[ 3 * 6 ]);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Puts the LCD into active mode.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdActive(void)\r
+{\r
+  halLcdSendCommand(LcdInitMacro);                  // R00 start oscillation\r
+  \r
+  // Wait a minimum of 25ms after issuing "start oscillation"\r
+  // command (to accomodate for MCLK up to 25MHz)    \r
+  __delay_cycles(250000);  \r
+  \r
+  LcdInitMacro[ 3 * 6 + 5 ] |= BIT3;\r
+  LcdInitMacro[ 3 * 6 + 5 ] &= ~BIT0;\r
+  halLcdSendCommand(&LcdInitMacro[ 3 * 6 ]);        // R03 Power control\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Sets the pointer location in the LCD. \r
+ *         \r
+ * - LcdAddress      = Address                                          \r
+ * - LcdTableAddress = Correct Address Row + Column \r
+ *                   = (Address / 0x20)* 17 + Column  \r
+ * \r
+ * @param  Address The target pointer location in the LCD.\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdSetAddress(int Address)\r
+{\r
+  int temp;\r
+  \r
+  Draw_Block_Address_Macro[4] = Address >> 8;\r
+  Draw_Block_Address_Macro[5] = Address & 0xFF;\r
+  halLcdSendCommand(Draw_Block_Address_Macro);\r
+  LcdAddress = Address;\r
+  temp = Address >> 5;                      // Divided by 0x20\r
+  temp = temp + (temp << 4); \r
+  //Multiplied by (1+16) and added by the offset\r
+  LcdTableAddress = temp + (Address & 0x1F); \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Draws a block at the specified LCD address. \r
+ * \r
+ * A block is the smallest addressable memory on the LCD and is\r
+ * equivalent to 8 pixels, each of which is represented by 2 bits\r
+ * that represent a grayscale value between 00b and 11b.   \r
+ * \r
+ * @param  Address The address at which to draw the block.\r
+ * \r
+ * @param  Value   The value of the block \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdDrawBlock(unsigned int Address, unsigned int Value)\r
+{\r
+  halLcdSetAddress(Address);\r
+  halLcdDrawCurrentBlock(Value);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Writes Value to LCD CGram and MSP430 internal LCD table. \r
+ * \r
+ * Also updates the LcdAddress and LcdTableAddress to the correct values.\r
+ *  \r
+ * @param  Value The value of the block to be written to the LCD. \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdDrawCurrentBlock(unsigned int Value)\r
+{   \r
+  int temp;\r
+\r
+  Draw_Block_Value_Macro[4] = Value >> 8;\r
+  Draw_Block_Value_Macro[5] = Value & 0xFF;\r
+  LCD_MEM[ LcdTableAddress ] = Value;\r
+  \r
+  halLcdSendCommand(Draw_Block_Value_Macro);\r
+  \r
+  LcdAddress++;\r
+  temp = LcdAddress >> 5;                   // Divided by 0x20\r
+  temp = temp + (temp << 4); \r
+  // Multiplied by (1+16) and added by the offset\r
+  LcdTableAddress = temp + (LcdAddress & 0x1F); \r
+  \r
+  // If LcdAddress gets off the right edge, move to next line\r
+  if ((LcdAddress & 0x1F) > 0x11)\r
+    halLcdSetAddress( (LcdAddress & 0xFFE0) + 0x20 );\r
+  if (LcdAddress == LCD_Size)\r
+    halLcdSetAddress( 0 );  \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Returns the LCD CGRAM value at location Address.\r
+ * \r
+ * @param  Address The address of the block to be read from the LCD. \r
+ * \r
+ * @return Value   The value held at the specified address.\r
+ *************************************************************************/\r
+int halLcdReadBlock(unsigned int Address)\r
+{\r
+  int i = 0, Value = 0, ReadData[7]; \r
+  \r
+  halLcdSetAddress( Address );    \r
+  halLcdSendCommand(Read_Block_Address_Macro);      \r
+  \r
+  LCD_CS_RST_OUT &= ~LCD_CS_PIN;              // start transfer CS=0\r
+  UCB2TXBUF = 0x77;                         // Transmit first character 0x77\r
+  \r
+  while (!(UCB2IFG & UCTXIFG)); \r
+  while (UCB2STAT & UCBUSY);\r
+  \r
+  //Read 5 dummies values and 2 valid address data  \r
+  LCD_SPI_SEL &= ~LCD_MOSI_PIN;             //Change SPI2C Dir\r
+  LCD_SPI_SEL |= LCD_MISO_PIN;  \r
+  \r
+  for (i = 0; i < 7; i ++ )\r
+  {\r
+    UCB2IFG &= ~UCRXIFG;\r
+    UCB2TXBUF = 1;                          // load dummy byte 1 for clk\r
+    while (!(UCB2IFG & UCRXIFG)); \r
+    ReadData[i] = UCB2RXBUF; \r
+  } \r
+  LCD_CS_RST_OUT |= LCD_CS_PIN;              // Stop Transfer CS = 1\r
+  \r
+  LCD_SPI_SEL |= LCD_MOSI_PIN;               //Change SPI2C Dir\r
+  LCD_SPI_SEL &= ~LCD_MISO_PIN;\r
+  LCD_CS_RST_DIR |= LCD_MOSI_PIN + LCD_CLK_PIN;\r
+  LCD_CS_RST_DIR &= ~LCD_MISO_PIN;\r
+  \r
+  Value = (ReadData[5] << 8) + ReadData[6];  \r
+  return Value;\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Draw a Pixel of grayscale at coordinate (x,y) to LCD \r
+ * \r
+ * @param  x         x-coordinate for grayscale value \r
+ * \r
+ * @param  y         y-coordinate for grayscale value\r
+ * \r
+ * @param  GrayScale The intended grayscale value of the pixel - one of \r
+ *                   four possible settings.\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdPixel( int x, int y, unsigned char GrayScale)\r
+{\r
+  int  Address, Value;\r
+  unsigned char offset;\r
+  \r
+  //Each line increments by 0x20\r
+  if ( (x>=0 ) && (x<LCD_COL) && (y>=0) && (y<LCD_ROW))\r
+  {\r
+    Address = (y << 5) + (x >> 3) ;         //Narrow down to 8 possible pixels    \r
+    \r
+    Value = LCD_MEM[(y << 4)+ y + (x>>3)];  //y * 17 --> row. x>>3 --> column\r
+    \r
+    offset = (x & 0x07) << 1;      //3 LSBs = pos. within the 8 columns\r
+    Value &= ~  (3 << offset);     //clear out the corresponding bits\r
+    Value |= GrayScale << offset;  //set pixel to GrayScale level\r
+    \r
+    halLcdDrawBlock( Address, Value );\r
+  }\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Clears entire LCD CGRAM as well as LCD_MEM.\r
+ * \r
+ * @param  none\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdClearScreen(void)\r
+{\r
+  int i, j, k, Current_Location = 0;\r
+  halLcdSetAddress(0);  \r
\r
+  for (i=0; i < 110; i++)\r
+  {\r
+    //prepare to send image\r
+    LCD_CS_RST_OUT &= ~LCD_CS_PIN;            //CS = 0 --> Start Transfer\r
+    for ( k = 0; k < 3; k++ )\r
+    {\r
+      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+      UCB2TXBUF = Draw_Block_Value_Macro[k];     // Load data\r
+    }\r
+    while (UCB2STAT & UCBUSY);         \r
+    LCD_CS_RST_OUT |= LCD_CS_PIN;         //CS = 1 --> Stop Transfer\r
+    LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer  \r
+    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+    UCB2TXBUF = Draw_Block_Value_Macro[3];     // Load data\r
+  \r
+    //send blank line\r
+    for (j=0; j < 17; j++)\r
+    {\r
+         LCD_MEM[ LcdTableAddress++ ] = 0x00;\r
+      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      UCB2TXBUF = 0x00;                   // Load data\r
+      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      UCB2TXBUF = 0x00;                   // Load data\r
+    }  \r
+    //Clear the partially visible block at the edge of the screen  \r
+    while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      UCB2TXBUF = 0x00;                   // Load data\r
+    while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      UCB2TXBUF = 0x00;                   // Load data\r
+    while (UCB2STAT & UCBUSY);         \r
+    LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer\r
+    \r
+    Current_Location += 0x20;\r
+    halLcdSetAddress(Current_Location );\r
+  }\r
+  \r
+  halLcdSetAddress(0);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Loads an image of size = rows * columns, starting at the \r
+ *         coordinate (x,y).\r
+ * \r
+ * @param  Image[] The image to be loaded\r
+ * \r
+ * @param  Rows    The number of rows in the image. Size = Rows * Columns.\r
+ * \r
+ * @param  Columns The number of columns in the image. Size = Rows * Columns.\r
+ * \r
+ * @param  x       x-coordinate of the image's starting location \r
+ * \r
+ * @param  y       y-coordinate of the image's starting location \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdImage(const unsigned int Image[], int Columns, int Rows, int x, int y)\r
+{  \r
+  int i, CurrentLocation;\r
+   \r
+  CurrentLocation = (y << 5) + (x >> 3);\r
+  halLcdSetAddress(CurrentLocation);\r
+  for (i=0; i < Rows; i++)\r
+  {\r
+    halLcdDrawCurrentLine(Image, Columns);\r
+    Image += Columns;\r
+    CurrentLocation += 0x20;\r
+    halLcdSetAddress(CurrentLocation);\r
+  }\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Writes Value to LCD CGram and MSP430 internal LCD table. \r
+ * \r
+ * Also updates the LcdAddress and LcdTableAddress to the correct values.\r
+ *  \r
+ * @param  *value Pointer to the line to be written to the LCD. \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdDrawCurrentLine(const unsigned int *value, int Columns)\r
+{    \r
+  unsigned char i;\r
+  \r
+  //prepare to send image\r
+  LCD_CS_RST_OUT &= ~LCD_CS_PIN;            //CS = 0 --> Start Transfer\r
+  for ( i = 0; i < 3; i++ )\r
+  {\r
+      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+      UCB2TXBUF = Draw_Block_Value_Macro[i];     // Load data\r
+  }\r
+  while (UCB2STAT & UCBUSY);           \r
+  LCD_CS_RST_OUT |= LCD_CS_PIN;         //CS = 1 --> Stop Transfer\r
+  LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer    \r
+  while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+  UCB2TXBUF = Draw_Block_Value_Macro[3];     // Load data\r
+  \r
+  //send the image\r
+  for ( i = 0; i < Columns; i++ )\r
+  {    \r
+    // Make sure we are not writing outside LCD_MEM[]\r
+    if (LcdTableAddress >= sizeof(LCD_MEM)) {\r
+       break;\r
+    }\r
+       LCD_MEM[ LcdTableAddress++ ] = *value;\r
+       while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+    UCB2TXBUF = (*value) >> 8;                   // Load data\r
+    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+    UCB2TXBUF = (*value++) & 0xFF;                   // Load data\r
+  }\r
+\r
+  while (UCB2STAT & UCBUSY);           \r
+  LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Clears an image of size rows x columns starting at (x, y). \r
+ * \r
+ * @param  Columns The size, in columns, of the image to be cleared.\r
+ * \r
+ * @param  Rows    The size, in rows, of the image to be cleared.\r
+ * \r
+ * @param  x       x-coordinate of the image to be cleared\r
+ * \r
+ * @param  y       y-coordinate of the image to be cleared\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdClearImage(int Columns, int Rows, int x, int y)\r
+{\r
+  int i,j,k, Current_Location;\r
+  Current_Location = (y << 5) + (x >> 3);\r
+  halLcdSetAddress( Current_Location );\r
\r
+  for (i=0; i < Rows; i++)\r
+  {\r
+    //prepare to send image\r
+    LCD_CS_RST_OUT &= ~LCD_CS_PIN;            //CS = 0 --> Start Transfer\r
+    for ( k = 0; k < 3; k++ )\r
+    {\r
+      while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+      UCB2TXBUF = Draw_Block_Value_Macro[k];     // Load data\r
+    }\r
+    while (UCB2STAT & UCBUSY);         \r
+    LCD_CS_RST_OUT |= LCD_CS_PIN;         //CS = 1 --> Stop Transfer\r
+    LCD_CS_RST_OUT &= ~LCD_CS_PIN;        //CS = 0 --> Start Transfer  \r
+    while (!(UCB2IFG & UCTXIFG));           // Wait for TXIFG    \r
+    UCB2TXBUF = Draw_Block_Value_Macro[3];     // Load data\r
+  \r
+    //send blank line\r
+    for (j=0; j < Columns; j++)\r
+    {\r
+         LCD_MEM[ LcdTableAddress++ ] = 0x00;\r
+      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      UCB2TXBUF = 0x00;                   // Load data\r
+      while (!(UCB2IFG & UCTXIFG));       // Wait for TXIFG    \r
+      UCB2TXBUF = 0x00;                   // Load data\r
+    }     \r
+    while (UCB2STAT & UCBUSY);         \r
+    LCD_CS_RST_OUT |= LCD_CS_PIN;             //CS = 1 --> Stop Transfer\r
+    \r
+    Current_Location += 0x20;\r
+    halLcdSetAddress(Current_Location );\r
+  }\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Writes Value to LCD CGRAM. Pointers internal to the LCD \r
+ *         are also updated. \r
+ * \r
+ * @param  Value The value to be written to the current LCD pointer\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdDrawTextBlock(unsigned int Value)\r
+{   \r
+  int temp;\r
+  \r
+  Draw_Block_Value_Macro[4] = Value >> 8;    \r
+  Draw_Block_Value_Macro[5] = Value & 0xFF;  \r
+  LCD_MEM[ LcdTableAddress ] = Value;        \r
+  \r
+  halLcdSendCommand(Draw_Block_Value_Macro);\r
+  \r
+  LcdAddress++;\r
+  temp = LcdAddress >> 5;                   // Divided by 0x20\r
+  temp = temp + (temp << 4); \r
+  //Multiplied by (1+16) and added by the offset\r
+  LcdTableAddress = temp + (LcdAddress & 0x1F); \r
+  \r
+  // If LcdAddress gets off the right edge, move to next line \r
+  if ((LcdAddress & 0x1F) > 0x10)\r
+    halLcdSetAddress( (LcdAddress & 0xFFE0) + 0x20 );\r
+  \r
+  if (LcdAddress >= LCD_Size)\r
+    halLcdSetAddress( 0 );  \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Displays the string to the LCD starting at current location.\r
+ * \r
+ * Writes all the data to LCD_MEM first, then updates all corresponding \r
+ * LCD CGRAM locations at once, in a continuous fashion.\r
+ *  \r
+ * @param  String[]  The string to be displayed on LCD.\r
+ * \r
+ * @param  TextStyle Value that specifies whether the string is to be \r
+ *                   inverted or overwritten. \r
+ *                   - Invert    = 0x01 \r
+ *                   - Overwrite = 0x04 \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdPrint( char String[], unsigned char TextStyle) \r
+{\r
+  int i, j, Counter=0, BlockValue;\r
+  int Address, LCD_MEM_Add, ActualAddress;\r
+  int temp;\r
+  char LookUpChar;\r
+  \r
+  ActualAddress = LcdAddress;\r
+  Counter =  LcdAddress & 0x1F;  \r
+  i=0;\r
+  \r
+  while (String[i]!=0)                      // Stop on null character\r
+  { \r
+    LookUpChar = fonts_lookup[String[i]]; \r
+    \r
+    for (j=0;j < FONT_HEIGHT ;j++)      \r
+    {\r
+      Address = ActualAddress + j*0x20;\r
+      temp = Address >> 5;\r
+      temp += (temp <<4);\r
+\r
+      LCD_MEM_Add = temp + (Address & 0x1F); \r
+      \r
+      BlockValue = LCD_MEM[ LCD_MEM_Add ];\r
+      \r
+      if(TextStyle & GRAYSCALE_TEXT)\r
+      {\r
+       if (TextStyle & INVERT_TEXT)\r
+         if (TextStyle & OVERWRITE_TEXT)\r
+           BlockValue = 0xAAAA - GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];\r
+         else\r
+           BlockValue |= 0xAAAA - GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];\r
+       else\r
+         if (TextStyle & OVERWRITE_TEXT)\r
+            BlockValue = GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j]; \r
+          else\r
+            BlockValue |= GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];\r
+      }\r
+      else\r
+      {      \r
+        if (TextStyle & INVERT_TEXT)         \r
+          if (TextStyle & OVERWRITE_TEXT)\r
+            BlockValue = 0xFFFF - fonts[LookUpChar*13+j]; \r
+          else\r
+            BlockValue |= 0xFFFF - fonts[LookUpChar*13+j]; \r
+        \r
+        else     \r
+          if (TextStyle & OVERWRITE_TEXT)\r
+            BlockValue = fonts[LookUpChar*(FONT_HEIGHT+1) +j]; \r
+          else\r
+            BlockValue |= fonts[LookUpChar*(FONT_HEIGHT+1) +j]; \r
+      }\r
+      halLcdDrawBlock( Address, BlockValue);          \r
+    }\r
+    \r
+    Counter++;\r
+    if (Counter == 17)\r
+    {\r
+      Counter = 0;        \r
+      ActualAddress += 0x20*FONT_HEIGHT  - 16;\r
+      if (ActualAddress > LCD_Last_Pixel-0x20*FONT_HEIGHT )\r
+        ActualAddress = 0;\r
+    }\r
+    else \r
+      ActualAddress++;\r
+    i++;\r
+  }\r
+  halLcdSetAddress(ActualAddress);\r
+  \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Displays the string to the LCD starting at (x,y) location. \r
+ * \r
+ * Writes all the data to LCD_MEM first, then updates all corresponding \r
+ * LCD CGRAM locations at once, in a continuous fashion.\r
+ * \r
+ * @param  String[]  String to be displayed on LCD\r
+ * \r
+ * @param  x         x-coordinate of the write location on the LCD \r
+ * \r
+ * @param  y         y-coordinate of the write location on the LCD\r
+ * \r
+ * @param  TextStyle Value that specifies whether the string is to be \r
+ *                   inverted or overwritten. \r
+ *                   - Invert    = 0x01 \r
+ *                   - Overwrite = 0x04 \r
+ *************************************************************************/\r
+void halLcdPrintXY( char String[], int x, int y, unsigned char TextStyle)  \r
+{\r
+  //Each line increments by 0x20\r
+  halLcdSetAddress( (y << 5) + (x >> 3)) ;  //Narrow down to 8 possible pixels    \r
+  halLcdPrint(String,  TextStyle);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Displays a string on the LCD on the specified line.  \r
+ * \r
+ * @param  String[]  The string to be displayed on LCD.\r
+ * \r
+ * @param  Line      The line on the LCD on which to print the string.\r
+ * \r
+ * @param  TextStyle Value that specifies whether the string is to be \r
+ *                   inverted or overwritten. \r
+ *                   - Invert    = 0x01 \r
+ *                   - Overwrite = 0x04 \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdPrintLine(char String[], unsigned char Line, unsigned char TextStyle)  \r
+{\r
+  int temp; \r
+  temp = Line * FONT_HEIGHT ;\r
+  halLcdSetAddress( temp << 5 ) ;           // 0x20 = 2^5  \r
+  halLcdPrint(String, TextStyle);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Prints a string beginning on a given line and column.  \r
+ * \r
+ * @param  String[]  The string to be displayed on LCD.\r
+ * \r
+ * @param  Line      The line on which to print the string of text\r
+ * \r
+ * @param  Col       The column on which to print the string of text\r
+ * \r
+ * @param  TextStyle Value that specifies whether the string is to be \r
+ *                   inverted or overwritten. \r
+ *                   - Invert    = 0x01 \r
+ *                   - Overwrite = 0x04 \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdPrintLineCol(char String[], unsigned char Line, unsigned char Col,\r
+                        unsigned char TextStyle)  \r
+{\r
+  int temp; \r
+  \r
+  temp = Line * FONT_HEIGHT;\r
+  temp <<= 5;\r
+  temp += Col;\r
+  \r
+  halLcdSetAddress( temp ) ;                // 0x20 = 2^5                     \r
+  halLcdPrint(String, TextStyle);\r
+}\r
+\r
+\r
+/**********************************************************************//**\r
+ * @brief  Draws a horizontral line from (x1,y) to (x2,y) of GrayScale level\r
+ * \r
+ * @param  x1        x-coordinate of the first point \r
+ * \r
+ * @param  x2        x-coordinate of the second point\r
+ * \r
+ * @param  y         y-coordinate of both points\r
+ * \r
+ * @param  GrayScale Grayscale level of the horizontal line\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdHLine( int x1, int x2, int y, unsigned char GrayScale)\r
+{\r
+  int x_dir, x;\r
+  if ( x1 < x2 )\r
+    x_dir = 1;\r
+  else \r
+    x_dir = -1;\r
+  x = x1;    \r
+  while (x != x2)\r
+  {\r
+    halLcdPixel( x,y, GrayScale); \r
+    x += x_dir;\r
+  }\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Draws a vertical line from (x,y1) to (x,y2) of GrayScale level\r
+ * \r
+ * @param  x         x-coordinate of both points\r
+ * \r
+ * @param  y1        y-coordinate of the first point \r
+ * \r
+ * @param  y2        y-coordinate of the second point\r
+ * \r
+ * @param  GrayScale GrayScale level of the vertical line\r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdVLine( int x, int y1, int y2, unsigned char GrayScale)\r
+{\r
+  int y_dir, y;\r
+  if ( y1 < y2 )\r
+    y_dir = 1;\r
+  else \r
+    y_dir = -1;\r
+  y = y1;    \r
+  while (y != y2)\r
+  {\r
+    halLcdPixel( x,y, GrayScale); \r
+    y += y_dir;\r
+  }\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Draws a line from (x1,y1) to (x2,y2) of GrayScale level.\r
+ *         \r
+ * Uses Bresenham's line algorithm.\r
+ * \r
+ * @param  x1         x-coordinate of the first point        \r
+ *  \r
+ * @param  y1         y-coordinate of the first point\r
+ * \r
+ * @param  x2         x-coordinate of the second point\r
+ * \r
+ * @param  y2         y-coordinate of the second point\r
+ * \r
+ * @param  GrayScale  Grayscale level of the line \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale) \r
+{\r
+  int x, y, deltay, deltax, d;  \r
+  int x_dir, y_dir;\r
+\r
+  if ( x1 == x2 )\r
+    halLcdVLine( x1, y1, y2, GrayScale );\r
+  else\r
+  {\r
+    if ( y1 == y2 )\r
+      halLcdHLine( x1, x2, y1, GrayScale );\r
+    else                                    // a diagonal line\r
+    {\r
+      if (x1 > x2)\r
+        x_dir = -1;\r
+      else x_dir = 1;\r
+      if (y1 > y2)\r
+        y_dir = -1;\r
+      else y_dir = 1;\r
+      \r
+      x = x1;\r
+      y = y1;\r
+      deltay = ABS(y2 - y1);\r
+      deltax = ABS(x2 - x1);\r
+\r
+      if (deltax >= deltay)\r
+      {\r
+        d = (deltay << 1) - deltax;\r
+        while (x != x2)\r
+        {\r
+          halLcdPixel(x, y,  GrayScale);\r
+          if ( d < 0 )\r
+            d += (deltay << 1);\r
+          else\r
+          {\r
+            d += ((deltay - deltax) << 1);\r
+            y += y_dir;\r
+          }\r
+          x += x_dir;\r
+        }                \r
+      }\r
+      else\r
+      {\r
+        d = (deltax << 1) - deltay;\r
+        while (y != y2)\r
+        {\r
+          halLcdPixel(x, y, GrayScale);\r
+          if ( d < 0 )\r
+            d += (deltax << 1);\r
+          else\r
+          {\r
+            d += ((deltax - deltay) << 1);\r
+            x += x_dir;\r
+          }\r
+          y += y_dir;\r
+        }        \r
+      }\r
+    }  \r
+  }\r
+}\r
+\r
+\r
+/**********************************************************************//**\r
+ * @brief  Draw a circle of Radius with center at (x,y) of GrayScale level.\r
+ *         \r
+ * Uses Bresenham's circle algorithm\r
+ * \r
+ * @param  x         x-coordinate of the circle's center point\r
+ * \r
+ * @param  y         y-coordinate of the circle's center point\r
+ * \r
+ * @param  Radius    Radius of the circle\r
+ * \r
+ * @param  GrayScale Grayscale level of the circle \r
+ *************************************************************************/\r
+void halLcdCircle(int x, int y, int Radius, int GrayScale)\r
+{\r
+  int xx, yy, ddF_x, ddF_y, f;\r
+  \r
+  ddF_x = 0;\r
+  ddF_y = -(2 * Radius);\r
+  f = 1 - Radius;\r
+\r
+  xx = 0;\r
+  yy = Radius;\r
+  halLcdPixel(x + xx, y + yy, GrayScale);\r
+  halLcdPixel(x + xx, y - yy, GrayScale);\r
+  halLcdPixel(x - xx, y + yy, GrayScale);\r
+  halLcdPixel(x - xx, y - yy, GrayScale);\r
+  halLcdPixel(x + yy, y + xx, GrayScale);\r
+  halLcdPixel(x + yy, y - xx, GrayScale);\r
+  halLcdPixel(x - yy, y + xx, GrayScale);\r
+  halLcdPixel(x - yy, y - xx, GrayScale);\r
+  while (xx < yy)\r
+  {\r
+    if (f >= 0)\r
+    {\r
+      yy--;\r
+      ddF_y += 2;\r
+      f += ddF_y;\r
+    }\r
+    xx++;\r
+    ddF_x += 2;\r
+    f += ddF_x + 1;\r
+    halLcdPixel(x + xx, y + yy, GrayScale);\r
+    halLcdPixel(x + xx, y - yy, GrayScale);\r
+    halLcdPixel(x - xx, y + yy, GrayScale);\r
+    halLcdPixel(x - xx, y - yy, GrayScale);\r
+    halLcdPixel(x + yy, y + xx, GrayScale);\r
+    halLcdPixel(x + yy, y - xx, GrayScale);\r
+    halLcdPixel(x - yy, y + xx, GrayScale);\r
+    halLcdPixel(x - yy, y - xx, GrayScale);\r
+  }\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Scrolls a single row of pixels one column to the left. \r
+ * \r
+ * The column that is scrolled out of the left side of the LCD will be \r
+ * displayed the right side of the LCD. \r
+ * \r
+ * @param  y    The row of pixels to scroll. y = 0 is at the top-left\r
+ *              corner of the LCD. \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdScrollRow(int y)\r
+{\r
+  int i, Address, LcdTableAddressTemp;\r
+  unsigned int temp;\r
+  \r
+  Address = y << 5;\r
+  \r
+  halLcdSetAddress( Address );\r
+  \r
+  //Multiplied by (1+16) and added by the offset\r
+  LcdTableAddressTemp = y + (y << 4);       \r
+  temp = ((LCD_MEM[LcdTableAddressTemp] & 0x0003) <<14);\r
+  \r
+  for (i = 0; i < 0x10; i++)      \r
+    halLcdDrawCurrentBlock( ( (LCD_MEM[LcdTableAddressTemp+i] & 0xFFFC ) >> 2 ) \\r
+    + ((LCD_MEM[LcdTableAddressTemp+i+1] & 0x0003) << 14 ));\r
+    \r
+  halLcdDrawCurrentBlock( (( LCD_MEM[LcdTableAddressTemp + 0x10] & 0xFFFC ) >> 2) + temp);    \r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Scrolls multiple rows of pixels, yStart to yEnd, \r
+ *         one column to the left. \r
+ * \r
+ * The column that is scrolled out of the left side of the LCD will be \r
+ * displayed the right side of the LCD. y = 0 is at the top-left of the \r
+ * LCD screen.\r
+ * \r
+ * @param  yStart The beginning row to be scrolled\r
+ * \r
+ * @param  yEnd   The last row to be scrolled \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdHScroll(int yStart, int yEnd)\r
+{\r
+  int i ;  \r
+  \r
+  for (i = yStart; i < yEnd+1; i++)\r
+    halLcdScrollRow(i);\r
+}\r
+\r
+/**********************************************************************//**\r
+ * @brief  Scrolls a line of text one column to the left. \r
+ * \r
+ * @param  Line The line of text to be scrolled.  \r
+ * \r
+ * @return none\r
+ *************************************************************************/\r
+void halLcdScrollLine(int Line)\r
+{\r
+  int i, Row ;\r
+  \r
+  Row = Line * FONT_HEIGHT;\r
+  \r
+  for (i = Row; i < Row + FONT_HEIGHT ; i++)\r
+    halLcdScrollRow(i);\r
+}\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.h b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.h
new file mode 100644 (file)
index 0000000..ab047b0
--- /dev/null
@@ -0,0 +1,122 @@
+/*******************************************************************************\r
+    Filename: hal_lcd.h\r
+\r
+    Copyright 2010 Texas Instruments, Inc.\r
+***************************************************************************/\r
+#ifndef HAL_LCD_H\r
+#define HAL_LCD_H\r
+\r
+#ifndef MIN\r
+#define MIN(n,m)   (((n) < (m)) ? (n) : (m))\r
+#endif\r
+\r
+#ifndef MAX\r
+#define MAX(n,m)   (((n) < (m)) ? (m) : (n))\r
+#endif\r
+\r
+#ifndef ABS\r
+#define ABS(n)     (((n) < 0) ? -(n) : (n))\r
+#endif\r
+\r
+#define LCD_BACKLT_OUT      P8OUT\r
+#define LCD_BACKLT_DIR      P8DIR\r
+#define LCD_BACKLT_SEL      P8SEL\r
+#define LCD_BACKLIGHT_PIN   BIT3\r
+#define LCD_CS_RST_DIR      P9DIR\r
+#define LCD_CS_RST_OUT      P9OUT  \r
+#define LCD_CS_PIN          BIT6 \r
+#define LCD_RESET_PIN       BIT7\r
+#define LCD_SPI_SEL                    P9SEL\r
+#define LCD_SPI_DIR                    P9DIR\r
+#define LCD_MOSI_PIN           BIT1\r
+#define        LCD_MISO_PIN            BIT2\r
+#define LCD_CLK_PIN            BIT3\r
+\r
+#define LCD_ROW                 110\r
+#define LCD_COL                 138\r
+#define LCD_Size                3505\r
+#define LCD_MEM_Size            110*17\r
+#define LCD_Max_Column_Offset   0x10  \r
\r
+#define LCD_Last_Pixel          3505\r
+\r
+#define LCD_MEM_Row             0x11\r
+#define LCD_Row                 0x20\r
+\r
+// Grayscale level definitions\r
+#define PIXEL_OFF               0\r
+#define PIXEL_LIGHT             1\r
+#define PIXEL_DARK              2\r
+#define PIXEL_ON                3\r
+\r
+#define INVERT_TEXT             BIT0\r
+#define OVERWRITE_TEXT          BIT2\r
+#define GRAYSCALE_TEXT                 BIT1\r
+\r
+/*-------------------------------------------------------------\r
+ *                  Function Prototypes \r
+ * ------------------------------------------------------------*/ \r
+extern void halLcdInit(void);                   \r
+extern void halLcdShutDown(void);\r
+extern void halLcdBackLightInit(void);\r
+extern void halLcdSetBackLight(unsigned char BackLightLevel);\r
+extern unsigned int halLcdGetBackLight(void);\r
+extern void halLcdShutDownBackLight(void);\r
+extern void halLcdSendCommand(unsigned char Data[]) ;\r
+extern void halLcdSetContrast(unsigned char ContrastLevel);\r
+extern unsigned char halLcdGetContrast(void);\r
+extern void halLcdStandby(void);\r
+extern void halLcdActive(void);\r
+\r
+//Move to specified LCD address\r
+extern void halLcdSetAddress(int Address);          \r
+\r
+//Draw at current segment location\r
+extern void halLcdDrawCurrentBlock(unsigned int Value);  \r
+extern void halLcdDrawCurrentLine(const unsigned int *value, int length);         \r
+\r
+//Draw at specified location by calling\r
+//LCD_Set_Address(Address) & LCD_Draw_Current_Block( value )\r
+extern void halLcdDrawBlock(unsigned int Address, unsigned int Value); \r
+\r
+//Read value from LCD CGRAM\r
+extern int halLcdReadBlock(unsigned int Address);\r
+\r
+//Clear LCD Screen  \r
+extern void halLcdClearScreen(void);                    \r
+\r
+//Invert black to white and vice versa\r
+extern void halLcdReverse(void);\r
+\r
+// Draw a Pixel @ (x,y) with GrayScale level\r
+extern void halLcdPixel(  int x,  int y, unsigned char GrayScale);\r
+//Draw Line from (x1,y1) to (x2,y2) with GrayScale level\r
+extern void halLcdLine(  int x1,  int y1,  int x2,  int y2, unsigned char GrayScale); \r
+extern void halLcdHLine( int x1, int x2, int y, unsigned char GrayScale);\r
+extern void halLcdVLine( int x1, int x2, int y, unsigned char GrayScale);\r
+\r
+extern void halLcdCircle(int x, int y, int Radius, int GrayScale);\r
+\r
+extern void halLcdImage(const unsigned int Image[], int Columns, int Rows, int x, int y);\r
+extern void halLcdClearImage(int Columns, int Rows,  int x, int y);\r
+\r
+//Print String of Length starting at current LCD location\r
+extern void halLcdPrint(char String[], unsigned char TextStyle) ;\r
+\r
+//Print String of Length starting at (x,y)\r
+extern void halLcdPrintXY(char String[], int x, int y, unsigned char TextStyle);  \r
+\r
+//Print String of Length starting at (x,y)\r
+extern void halLcdPrintLine(char String[], unsigned char Line, unsigned char TextStyle);  \r
+extern void halLcdPrintLineCol(char String[], unsigned char Line, unsigned char Col, unsigned char TextStyle);  \r
+\r
+extern void halLcdCursor(void);\r
+extern void halLcdCursorOff(void);\r
+//Scroll a single row of pixels\r
+extern void halLcdScrollRow(int y);\r
+//Scroll a number of consecutive rows from yStart to yEnd\r
+extern void halLcdHScroll(int yStart, int yEnd);\r
+//Scroll a line of text\r
+extern void halLcdScrollLine(int Line);\r
+\r
+#endif /* HAL_LCD_H */\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd_fonts.c b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd_fonts.c
new file mode 100644 (file)
index 0000000..06002ac
--- /dev/null
@@ -0,0 +1,323 @@
+/**********************************************************************//**\r
+ * @file UserExperienceGraphics.c\r
+ * \r
+ * Copyright 2010 Texas Instruments, Inc.\r
+***************************************************************************/\r
+\r
+const unsigned char fonts_lookup[]={\r
+          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,              \r
+          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,              \r
+          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,              \r
+          0x00,0x00,63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,              \r
+          64,65,0,69,0,68,67,0,0,1,         //'0' = 48 = 0x30\r
+          2,3,4,5,6,7,8,9,66,0,             //'9' = 57 = 0x39\r
+          0,70,0,62,0,10,11,12,13,14,       //'A' --> 'Z'\r
+          15,16,17,18,19,20,21,22,23,24,\r
+          25,26,27,28,29,30,31,32,33,34, \r
+          35,0,0,0,71,0,0,36,37,38,         //'a' = 97 \r
+          39,40,41,42,43,44,45,46,47,48,\r
+          49,50,51,52,53,54,55,56,57,58,\r
+          59,60,61,62,0 ,0, 0, 72,73,74,\r
+          75,76,77,78,79,80,81              //'z' = 122\r
+          };            \r
+\r
+const unsigned int fonts[]= {\r
+          0x0000, 0x0ffc, 0x3c0f, 0x3f0f, 0x3fcf, 0x3ccf, 0x3cff, 0x3c3f, \r
+                 0x3c0f, 0x0ffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c0, 0x00f0,        \r
+          0x00ff, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x0fff, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f00, 0x03c0, \r
+          0x00f0, 0x003c, 0x0f0f, 0x0fff, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x03fc, 0x0f0f, 0x0f00, 0x0f00, 0x03f0, 0x0f00, 0x0f00, 0x0f0f, \r
+          0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f00, 0x0fc0, 0x0ff0, \r
+          0x0f3c, 0x0f0f, 0x3fff, 0x0f00, 0x0f00, 0x3fc0, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0fff, 0x000f, 0x000f, 0x000f, 0x03ff, 0x0f00, \r
+          0x0f00, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, \r
+          0x003c, 0x000f, 0x000f, 0x03ff, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x3c0f, 0x3c0f, 0x3c00, \r
+          0x0f00, 0x03c0, 0x00f0, 0x00f0, 0x00f0, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f3f, 0x03fc, 0x0fcf, 0x0f0f, \r
+          0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, \r
+          0x0f0f, 0x0f0f, 0x0ffc, 0x03c0, 0x03c0, 0x00f0, 0x00fc, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x00f0, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, \r
+          0x0fff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0fff, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ffc, 0x3c3c, 0x3c3c, 0x3c3c, \r
+          0x0fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ff0, 0x3c3c, 0x3c0f, \r
+          0x000f, 0x000f, 0x000f, 0x3c0f, 0x3c3c, 0x0ff0, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x03ff, 0x0f3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, \r
+          0x3c3c, 0x0f3c, 0x03ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, \r
+          0x303c, 0x003c, 0x0c3c, 0x0ffc, 0x0c3c, 0x003c, 0x303c, 0x3fff, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x3c3c, 0x303c, 0x0c3c, \r
+          0x0ffc, 0x0c3c, 0x003c, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0ff0, 0x3c3c, 0x3c0f, 0x000f, 0x000f, 0x3f0f, 0x3c0f, \r
+          0x3c3c, 0x3ff0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, \r
+          0x0f0f, 0x0f0f, 0x0fff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x03fc, 0x00f0, 0x00f0, 0x00f0, 0x00f0, \r
+          0x00f0, 0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x3fc0, 0x0f00, 0x0f00, 0x0f00, 0x0f00, 0x0f0f, 0x0f0f, 0x0f0f, \r
+          0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c3f, 0x3c3c, 0x0f3c, \r
+          0x0f3c, 0x03fc, 0x0f3c, 0x0f3c, 0x3c3c, 0x3c3f, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x00ff, 0x003c, 0x003c, 0x003c, 0x003c, 0x303c, \r
+          0x3c3c, 0x3c3c, 0x3fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f, \r
+          0x3f3f, 0x3fff, 0x3fff, 0x3ccf, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f, 0x3c0f, 0x3c3f, 0x3cff, \r
+          0x3fff, 0x3fcf, 0x3f0f, 0x3c0f, 0x3c0f, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x03f0, 0x0f3c, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, \r
+          0x0f3c, 0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x3c3c, \r
+          0x3c3c, 0x3c3c, 0x0ffc, 0x003c, 0x003c, 0x003c, 0x00ff, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x03f0, 0x0f3c, 0x3c0f, 0x3c0f, 0x3c0f, \r
+          0x3f0f, 0x3fcf, 0x0ffc, 0x0f00, 0x3fc0, 0x0000, 0x0000, 0x0000, \r
+          0x0fff, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ffc, 0x0f3c, 0x3c3c, 0x3c3c, \r
+          0x3c3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f, \r
+          0x000f, 0x00fc, 0x03c0, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0fff, 0x0cf3, 0x00f0, 0x00f0, 0x00f0, 0x00f0, \r
+          0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, \r
+          0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, \r
+          0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x00f0, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3ccf, 0x3ccf, 0x0f3c, \r
+          0x0f3c, 0x0f3c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, \r
+          0x0f0f, 0x03fc, 0x00f0, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, \r
+          0x00f0, 0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x3fff, 0x3f0f, 0x03c3, 0x03c0, 0x00f0, 0x003c, 0x303c, 0x3c0f, \r
+          0x3fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x03fc, 0x0f00, 0x0ffc, 0x0f0f, 0x0f0f, 0x3cfc, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x003f, 0x003c, 0x003c, 0x0ffc, 0x3c3c, 0x3c3c, \r
+          0x3c3c, 0x3c3c, 0x0fcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x03fc, 0x0f0f, 0x000f, 0x000f, 0x0f0f, 0x03fc, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0fc0, 0x0f00, 0x0f00, 0x0ffc, \r
+          0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x3cfc, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0fff, 0x000f, \r
+          0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, 0x0f3c, \r
+          0x003c, 0x003c, 0x03ff, 0x003c, 0x003c, 0x003c, 0x00ff, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3cfc, 0x0f0f, \r
+          0x0f0f, 0x0f0f, 0x0ffc, 0x0f00, 0x0f0f, 0x03fc, 0x0000, 0x0000, \r
+          0x003f, 0x003c, 0x003c, 0x0f3c, 0x3cfc, 0x3c3c, 0x3c3c, 0x3c3c, \r
+          0x3c3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x03c0, 0x03c0, 0x0000, \r
+          0x03fc, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x3ffc, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0f00, 0x0f00, 0x0000, 0x0ff0, 0x0f00, 0x0f00, \r
+          0x0f00, 0x0f00, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x003f, \r
+          0x003c, 0x003c, 0x3c3c, 0x0f3c, 0x03fc, 0x0f3c, 0x3c3c, 0x3c3f, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x03c0, 0x03c0, 0x03c0, \r
+          0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x3ffc, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x3ccf, 0x3ccf, 0x3ccf, \r
+          0x3ccf, 0x3c0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x03ff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, \r
+          0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0fcf, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, \r
+          0x0ffc, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x3cfc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0ffc, 0x0f00, 0x3fc0, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f3f, 0x3f3c, 0x3cfc, \r
+          0x003c, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x03fc, 0x0f0f, 0x003c, 0x03c0, 0x0f0f, 0x03fc, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x003c, 0x0fff, \r
+          0x003c, 0x003c, 0x003c, 0x0f3c, 0x03f0, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, \r
+          0x0f0f, 0x3cfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x00f0, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f, 0x3c0f, \r
+          0x3ccf, 0x3ccf, 0x0f3c, 0x0f3c, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x3c0f, 0x0f3c, 0x03f0, 0x03f0, 0x0f3c, \r
+          0x3c0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ff0, 0x0f00, 0x03c0, 0x00ff, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x0f03, 0x03c0, \r
+          0x003c, 0x0c0f, 0x0fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, \r
+          0x0f0f, 0x0f00, 0x03c0, 0x00f0, 0x00f0, 0x0000, 0x00f0, 0x00f0, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0f00, 0x03c0, 0x00f0, 0x003c, 0x003c, 0x003c, 0x00f0, \r
+          0x03c0, 0x0f00, 0x0000, 0x0000, 0x0000, 0x0000, 0x003c, 0x00f0, \r
+          0x03c0, 0x0f00, 0x0f00, 0x0f00, 0x03c0, 0x00f0, 0x003c, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, 0x03f0, 0x0000, \r
+          0x0000, 0x03f0, 0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, \r
+          0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x3ffc, 0x3ffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x03c0, 0x03c0, 0x3ffc, 0x3ffc, \r
+          0x03c0, 0x03c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x3ffc, 0x0000, 0x0000, 0x3ffc, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, \r
+          0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+//0---------------------------\r
+          0x0000, 0x0ffc, 0x3c0f, 0x3f0f, 0x3fcf, 0x3ccf, 0x3cff, 0x3c3f, \r
+          0x3c0f, 0x0ffc, 0x0000, 0x0000, 0x0000, \r
+//1---------------------------        \r
+          0x0000, 0x00c0, 0x00f0, 0x00ff, 0x00f0, 0x00f0, 0x00f0, 0x00f0, \r
+          0x00f0, 0x0fff, 0x0000, 0x0000, 0x0000, \r
+//2---------------------------          \r
+          0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f00, 0x03c0, 0x00f0, 0x003c, \r
+          0x0f0f, 0x0fff, 0x0000, 0x0000, 0x0000, \r
+//3---------------------------        \r
+          0x0000, 0x03fc, 0x0f0f, 0x0f00, 0x0f00, 0x03f0, 0x0f00, 0x0f00, \r
+          0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, \r
+//4---------------------------\r
+          0x0000, 0x0f00, 0x0fc0, 0x0ff0, 0x0f3c, 0x0f0f, 0x3fff, 0x0f00, \r
+          0x0f00, 0x3fc0, 0x0000, 0x0000, 0x0000, \r
+//5---------------------------          \r
+          0x0000, 0x0fff, 0x000f, 0x000f, 0x000f, 0x03ff, 0x0f00, 0x0f00, \r
+          0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, \r
+//6---------------------------          \r
+          0x0000, 0x03f0, 0x003c, 0x000f, 0x000f, 0x03ff, 0x0f0f, 0x0f0f, \r
+          0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000,           \r
+//7---------------------------          \r
+          0x0000, 0x3fff, 0x3c0f, 0x3c0f, 0x3c00, 0x0f00, 0x03c0, 0x00f0, \r
+          0x00f0, 0x00f0, 0x0000, 0x0000, 0x0000, \r
+//8---------------------------          \r
+          0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f3f, 0x03fc, 0x0fcf, 0x0f0f, \r
+          0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, \r
+//9---------------------------          \r
+          0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0ffc, 0x03c0, 0x03c0, \r
+          0x00f0, 0x00fc, 0x0000, 0x0000, 0x0000,          \r
+} ;\r
+\r
+        \r
+const unsigned int GrayScale_fonts[]= {\r
+          0x0000, 0x0aa8, 0x280a, 0x2a0a, 0x2a8a, 0x288a, 0x28aa, 0x282a, \r
+                 0x280a, 0x0aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x00a0,        \r
+          0x00aa, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x0aaa, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a00, 0x0280, \r
+          0x00a0, 0x0028, 0x0a0a, 0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x02a8, 0x0a0a, 0x0a00, 0x0a00, 0x02a0, 0x0a00, 0x0a00, 0x0a0a, \r
+          0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a00, 0x0a80, 0x0aa0, \r
+          0x0a28, 0x0a0a, 0x2aaa, 0x0a00, 0x0a00, 0x2a80, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0aaa, 0x000a, 0x000a, 0x000a, 0x02aa, 0x0a00, \r
+          0x0a00, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, \r
+          0x0028, 0x000a, 0x000a, 0x02aa, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa, 0x280a, 0x280a, 0x2800, \r
+          0x0a00, 0x0280, 0x00a0, 0x00a0, 0x00a0, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a2a, 0x02a8, 0x0a8a, 0x0a0a, \r
+          0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, \r
+          0x0a0a, 0x0a0a, 0x0aa8, 0x0280, 0x0280, 0x00a0, 0x00a8, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x00a0, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, \r
+          0x0aaa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0aaa, 0x2828, 0x2828, 0x2828, 0x0aa8, 0x2828, 0x2828, 0x2828, \r
+          0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aa0, 0x2828, 0x280a, \r
+          0x000a, 0x000a, 0x000a, 0x280a, 0x2828, 0x0aa0, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x02aa, 0x0a28, 0x2828, 0x2828, 0x2828, 0x2828, \r
+          0x2828, 0x0a28, 0x02aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa, \r
+          0x2028, 0x0028, 0x0828, 0x0aa8, 0x0828, 0x0028, 0x2028, 0x2aaa, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa, 0x2828, 0x2028, 0x0828, \r
+          0x0aa8, 0x0828, 0x0028, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0aa0, 0x2828, 0x280a, 0x000a, 0x000a, 0x2a0a, 0x280a, \r
+          0x2828, 0x2aa0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, \r
+          0x0a0a, 0x0a0a, 0x0aaa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x02a8, 0x00a0, 0x00a0, 0x00a0, 0x00a0, \r
+          0x00a0, 0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x2a80, 0x0a00, 0x0a00, 0x0a00, 0x0a00, 0x0a0a, 0x0a0a, 0x0a0a, \r
+          0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x282a, 0x2828, 0x0a28, \r
+          0x0a28, 0x02a8, 0x0a28, 0x0a28, 0x2828, 0x282a, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x00aa, 0x0028, 0x0028, 0x0028, 0x0028, 0x2028, \r
+          0x2828, 0x2828, 0x2aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x280a, \r
+          0x2a2a, 0x2aaa, 0x2aaa, 0x288a, 0x280a, 0x280a, 0x280a, 0x280a, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x280a, 0x280a, 0x282a, 0x28aa, \r
+          0x2aaa, 0x2a8a, 0x2a0a, 0x280a, 0x280a, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x02a0, 0x0a28, 0x280a, 0x280a, 0x280a, 0x280a, 0x280a, \r
+          0x0a28, 0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x2828, \r
+          0x2828, 0x2828, 0x0aa8, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x02a0, 0x0a28, 0x280a, 0x280a, 0x280a, \r
+          0x2a0a, 0x2a8a, 0x0aa8, 0x0a00, 0x2a80, 0x0000, 0x0000, 0x0000, \r
+          0x0aaa, 0x2828, 0x2828, 0x2828, 0x0aa8, 0x0a28, 0x2828, 0x2828, \r
+          0x282a, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a, \r
+          0x000a, 0x00a8, 0x0280, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0aaa, 0x08a2, 0x00a0, 0x00a0, 0x00a0, 0x00a0, \r
+          0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, \r
+          0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, \r
+          0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x00a0, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x280a, 0x280a, 0x280a, 0x280a, 0x288a, 0x288a, 0x0a28, \r
+          0x0a28, 0x0a28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, \r
+          0x0a0a, 0x02a8, 0x00a0, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, \r
+          0x00a0, 0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x2aaa, 0x2a0a, 0x0282, 0x0280, 0x00a0, 0x0028, 0x2028, 0x280a, \r
+          0x2aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x02a8, 0x0a00, 0x0aa8, 0x0a0a, 0x0a0a, 0x28a8, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x002a, 0x0028, 0x0028, 0x0aa8, 0x2828, 0x2828, \r
+          0x2828, 0x2828, 0x0a8a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x02a8, 0x0a0a, 0x000a, 0x000a, 0x0a0a, 0x02a8, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0a80, 0x0a00, 0x0a00, 0x0aa8, \r
+          0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x28a8, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0aaa, 0x000a, \r
+          0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, 0x0a28, \r
+          0x0028, 0x0028, 0x02aa, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28a8, 0x0a0a, \r
+          0x0a0a, 0x0a0a, 0x0aa8, 0x0a00, 0x0a0a, 0x02a8, 0x0000, 0x0000, \r
+          0x002a, 0x0028, 0x0028, 0x0a28, 0x28a8, 0x2828, 0x2828, 0x2828, \r
+          0x282a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0280, 0x0280, 0x0000, \r
+          0x02a8, 0x0280, 0x0280, 0x0280, 0x0280, 0x2aa8, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0a00, 0x0a00, 0x0000, 0x0aa0, 0x0a00, 0x0a00, \r
+          0x0a00, 0x0a00, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x002a, \r
+          0x0028, 0x0028, 0x2828, 0x0a28, 0x02a8, 0x0a28, 0x2828, 0x282a, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0280, 0x0280, 0x0280, \r
+          0x0280, 0x0280, 0x0280, 0x0280, 0x2aa8, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x288a, 0x288a, 0x288a, \r
+          0x288a, 0x280a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x02aa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, \r
+          0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0a8a, 0x2828, 0x2828, 0x2828, 0x2828, \r
+          0x0aa8, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x28a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0aa8, 0x0a00, 0x2a80, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a2a, 0x2a28, 0x28a8, \r
+          0x0028, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0028, 0x0280, 0x0a0a, 0x02a8, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0028, 0x0aaa, \r
+          0x0028, 0x0028, 0x0028, 0x0a28, 0x02a0, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, \r
+          0x0a0a, 0x28a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x00a0, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x280a, 0x280a, \r
+          0x288a, 0x288a, 0x0a28, 0x0a28, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x280a, 0x0a28, 0x02a0, 0x02a0, 0x0a28, \r
+          0x280a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x2828, 0x2828, 0x2828, 0x2828, 0x0aa0, 0x0a00, 0x0280, 0x00aa, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x0a02, 0x0280, \r
+          0x0028, 0x080a, 0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, \r
+          0x0a0a, 0x0a00, 0x0280, 0x00a0, 0x00a0, 0x0000, 0x00a0, 0x00a0, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0a00, 0x0280, 0x00a0, 0x0028, 0x0028, 0x0028, 0x00a0, \r
+          0x0280, 0x0a00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x00a0, \r
+          0x0280, 0x0a00, 0x0a00, 0x0a00, 0x0280, 0x00a0, 0x0028, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, 0x02a0, 0x0000, \r
+          0x0000, 0x02a0, 0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, \r
+          0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x2aa8, 0x2aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x0280, 0x0280, 0x2aa8, 0x2aa8, \r
+          0x0280, 0x0280, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x2aa8, 0x0000, 0x0000, 0x2aa8, 0x0000, 0x0000, \r
+          0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, \r
+          0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+//0---------------------------\r
+          0x0000, 0x0aa8, 0x280a, 0x2a0a, 0x2a8a, 0x288a, 0x28aa, 0x282a, \r
+          0x280a, 0x0aa8, 0x0000, 0x0000, 0x0000, \r
+//1---------------------------        \r
+          0x0000, 0x0080, 0x00a0, 0x00aa, 0x00a0, 0x00a0, 0x00a0, 0x00a0, \r
+          0x00a0, 0x0aaa, 0x0000, 0x0000, 0x0000, \r
+//2---------------------------          \r
+          0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a00, 0x0280, 0x00a0, 0x0028, \r
+          0x0a0a, 0x0aaa, 0x0000, 0x0000, 0x0000, \r
+//2---------------------------        \r
+          0x0000, 0x02a8, 0x0a0a, 0x0a00, 0x0a00, 0x02a0, 0x0a00, 0x0a00, \r
+          0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, \r
+//4---------------------------\r
+          0x0000, 0x0a00, 0x0a80, 0x0aa0, 0x0a28, 0x0a0a, 0x2aaa, 0x0a00, \r
+          0x0a00, 0x2a80, 0x0000, 0x0000, 0x0000, \r
+//5---------------------------          \r
+          0x0000, 0x0aaa, 0x000a, 0x000a, 0x000a, 0x02aa, 0x0a00, 0x0a00, \r
+          0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, \r
+//6---------------------------          \r
+          0x0000, 0x02a0, 0x0028, 0x000a, 0x000a, 0x02aa, 0x0a0a, 0x0a0a, \r
+          0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000,           \r
+//7---------------------------          \r
+          0x0000, 0x2aaa, 0x280a, 0x280a, 0x2800, 0x0a00, 0x0280, 0x00a0, \r
+          0x00a0, 0x00a0, 0x0000, 0x0000, 0x0000, \r
+//8---------------------------          \r
+          0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a2a, 0x02a8, 0x0a8a, 0x0a0a, \r
+          0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, \r
+//9---------------------------          \r
+          0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0aa8, 0x0280, 0x0280, \r
+          0x00a0, 0x00a8, 0x0000, 0x0000, 0x0000,          \r
+} ;\r
diff --git a/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd_fonts.h b/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd_fonts.h
new file mode 100644 (file)
index 0000000..48239c9
--- /dev/null
@@ -0,0 +1,15 @@
+/*******************************************************************************\r
+    Filename: hal_lcd_fonts.h\r
+\r
+    Copyright 2010 Texas Instruments, Inc.\r
+***************************************************************************/\r
+#ifndef FONTS_H\r
+#define FONTS_H\r
+\r
+#define FONT_HEIGHT            12                    // Each character has 13 lines \r
+\r
+extern const unsigned char fonts_lookup[];\r
+extern const unsigned int fonts[];\r
+extern const unsigned int GrayScale_fonts[];\r
+\r
+#endif /* FONTS_H */\r
index 0ee93deb105d4fc14a3c0430c79c8a621739165c..d9fd0a34f7d9a7fc2102655cce28c058fab758b1 100644 (file)
     </file>\r
     <file>\r
       <name>$PROJ_DIR$\MSP-EXP430F5438_HAL\hal_lcd.c</name>\r
-      <excluded>\r
-        <configuration>Debug</configuration>\r
-      </excluded>\r
     </file>\r
     <file>\r
       <name>$PROJ_DIR$\MSP-EXP430F5438_HAL\hal_lcd.h</name>\r
     </file>\r
     <file>\r
       <name>$PROJ_DIR$\MSP-EXP430F5438_HAL\hal_lcd_fonts.c</name>\r
-      <excluded>\r
-        <configuration>Debug</configuration>\r
-      </excluded>\r
     </file>\r
     <file>\r
       <name>$PROJ_DIR$\MSP-EXP430F5438_HAL\hal_lcd_fonts.h</name>\r
     <file>\r
       <name>$PROJ_DIR$\..\Common\Minimal\comtest.c</name>\r
     </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\..\Common\Minimal\dynamic.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\..\Common\Minimal\GenQTest.c</name>\r
+    </file>\r
   </group>\r
   <group>\r
     <name>UserExperienceDemo</name>\r
index 600e1f81ff0d5fc3657cd093bfccbb684660fb1c..802bf53e42a83fd8053f9f42009b2a756e2af6e6 100644 (file)
@@ -65,7 +65,9 @@
 \r
 /* Standard demo includes. */\r
 #include "ParTest.h"\r
+#include "dynamic.h"\r
 #include "comtest2.h"\r
+#include "GenQTest.h"\r
 \r
 /* Codes sent within messages to the LCD task so the LCD task can interpret\r
 exactly what the message it just received was.  These are sent in the\r
@@ -88,13 +90,15 @@ to send messages from tasks and interrupts the the LCD task. */
 \r
 #define mainLCD_TASK_PRIORITY                  ( tskIDLE_PRIORITY + 1 )\r
 #define mainCOM_TEST_PRIORITY                  ( tskIDLE_PRIORITY + 2 )\r
+#define mainGENERIC_QUEUE_TEST_PRIORITY        ( tskIDLE_PRIORITY )\r
 \r
 /* The LED used by the comtest tasks. See the comtest.c file for more\r
 information.  In this case it is deliberately out of range as there are only\r
 two LEDs, and they are both already in use. */\r
-#define mainCOM_TEST_LED                       ( 3 )\r
-\r
+#define mainCOM_TEST_LED                               ( 3 )\r
 \r
+/* The baud rate used by the comtest tasks described at the top of this file. */\r
+#define mainCOM_TEST_BAUD_RATE                 ( 9600 )\r
 /*-----------------------------------------------------------*/\r
 \r
 extern void vRegTest1Task( void *pvParameters );\r
@@ -137,13 +141,16 @@ void main( void )
                vQueueAddToRegistry( xLCDQueue, "LCDQueue" );\r
 \r
                /* Create the standard demo tasks. */\r
-               vAltStartComTestTasks( mainCOM_TEST_PRIORITY, 9600, mainCOM_TEST_LED );\r
+               vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );\r
+               vStartDynamicPriorityTasks();\r
+               vStartGenericQueueTasks( mainGENERIC_QUEUE_TEST_PRIORITY );\r
                \r
                /* Create the terminal IO and button poll tasks, as described at the top\r
                of this file. */\r
                xTaskCreate( prvTerminalIOTask, ( signed char * ) "IO", configMINIMAL_STACK_SIZE * 2, NULL, mainLCD_TASK_PRIORITY, NULL );\r
                xTaskCreate( prvButtonPollTask, ( signed char * ) "BPoll", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );\r
 \r
+               /* Create the register test tasks as described at the top of this file. */\r
                xTaskCreate( vRegTest1Task, "Reg1", configMINIMAL_STACK_SIZE, NULL, 0, NULL );\r
                xTaskCreate( vRegTest2Task, "Reg2", configMINIMAL_STACK_SIZE, NULL, 0, NULL );\r
                vTaskStartScheduler();\r
@@ -161,6 +168,8 @@ LCD.  Note this is a static variable to prevent it being allocated on the task
 stack, which is too small to hold such a variable.  The stack size is configured\r
 when the task is created. */\r
 static char cBuffer[ 512 ];\r
+unsigned char ucLine = 1;\r
+\r
 \r
        /* This function is the only function that uses printf().  If printf() is\r
        used from any other function then some sort of mutual exclusion on stdout\r
@@ -181,6 +190,13 @@ static char cBuffer[ 512 ];
                has been received. */\r
                xQueueReceive( xLCDQueue, &xReceivedMessage, portMAX_DELAY );\r
 \r
+               /* Clear the LCD if no room remains for any more text output. */\r
+               if( ucLine > 8 )\r
+               {\r
+                       halLcdClearScreen();\r
+                       ucLine = 0;\r
+               }\r
+               \r
                /* What is this message?  What does it contain? */\r
                switch( xReceivedMessage.cMessageID )\r
                {\r
@@ -201,7 +217,18 @@ static char cBuffer[ 512 ];
                                                                                                printf( "\nTask\t     Abs Time\t     %%Time\n*****************************************" );\r
                                                                                                fflush( stdout );\r
                                                                                                vTaskGetRunTimeStats( ( signed char * ) cBuffer );\r
-//                                                                                             printf( cBuffer );\r
+                                                                                               printf( cBuffer );\r
+                                                                                               fflush( stdout );\r
+                                                                                               \r
+                                                                                               /* Also print out a message to\r
+                                                                                               the LCD - in this case the\r
+                                                                                               pointer to the string to print\r
+                                                                                               is sent directly in the\r
+                                                                                               lMessageValue member of the\r
+                                                                                               message.  This just demonstrates\r
+                                                                                               a different communication\r
+                                                                                               technique. */\r
+                                                                                               sprintf( cBuffer, "%s", ( char * ) xReceivedMessage.ulMessageValue );\r
                                                                                                break;\r
                                                                                                \r
                        case mainMESSAGE_STATUS                 :       /* The tick interrupt hook\r
@@ -216,10 +243,8 @@ static char cBuffer[ 512 ];
                                                                                                break;\r
                }\r
                \r
-               /* Output the message that was placed into the cBuffer array within the\r
-               switch statement above. */\r
-               printf( "%s : %u\n", cBuffer, ( unsigned int ) xTaskGetTickCount() );\r
-               fflush( stdout );\r
+               halLcdPrintLine( cBuffer, ucLine,  OVERWRITE_TEXT );\r
+               ucLine++;\r
        }\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -230,9 +255,9 @@ static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue )
        string for output onto the LCD. */\r
        switch( lStatusValue )\r
        {\r
-               case pdPASS                                             :       sprintf( pcBuffer, "Task status = PASS" );\r
+               case pdPASS                                             :       sprintf( pcBuffer, "Status = PASS" );\r
                                                                                        break;\r
-               case mainERROR_DYNAMIC_TASKS    :       sprintf( pcBuffer, "Error: Dynamic tasks" );\r
+               case mainERROR_DYNAMIC_TASKS    :       sprintf( pcBuffer, "Err: Dynamic tsks" );\r
                                                                                        break;\r
                case mainERROR_COM_TEST                 :       sprintf( pcBuffer, "Err: COM test" ); /* Error in COM test - is the Loopback connector connected? */                                                                                                            \r
                                                                                        break;\r
@@ -284,10 +309,19 @@ static void prvSetupHardware( void )
 unsigned long ulCPU_Clock_KHz = ( configCPU_CLOCK_HZ / 1000UL );\r
 \r
        halBoardInit();\r
-       halButtonsInit( BUTTON_ALL );\r
-       halButtonsInterruptEnable( BUTTON_SELECT );\r
+\r
        LFXT_Start( XT1DRIVE_0 );\r
        Init_FLL_Settle( ( unsigned short ) ulCPU_Clock_KHz, 488 );\r
+\r
+       halButtonsInit( BUTTON_ALL );\r
+       halButtonsInterruptEnable( BUTTON_SELECT );\r
+       halLcdInit();\r
+       halLcdBackLightInit();\r
+       halLcdSetBackLight( 0 );\r
+       halLcdSetContrast( 100 );\r
+       halLcdClearScreen();\r
+       \r
+       halLcdPrintLine( " www.FreeRTOS.org", 0,  OVERWRITE_TEXT );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -358,44 +392,38 @@ static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
        ulCounter++;\r
        if( ulCounter >= ulCheckFrequency )\r
        {\r
-               #ifdef LEFT_OVER_FROM_CUT_AND_PASTE\r
-                       /* See if the standard demo tasks are executing as expected, changing\r
-                       the message that is sent to the LCD task from PASS to an error code if\r
-                       any tasks set reports an error. */\r
-                       if( xAreDynamicPriorityTasksStillRunning() != pdPASS )\r
-                       {\r
-                               xStatusMessage.lMessageValue = mainERROR_DYNAMIC_TASKS;\r
-                       }\r
-                       \r
-                       if( xAreGenericQueueTasksStillRunning() != pdPASS )\r
-                       {\r
-                               xStatusMessage.lMessageValue = mainERROR_GEN_QUEUE_TEST;\r
-                       }\r
-               #else\r
-                       /* See if the standard demo tasks are executing as expected, changing\r
-                       the message that is sent to the LCD task from PASS to an error code if\r
-                       any tasks set reports an error. */\r
-                       if( xAreComTestTasksStillRunning() != pdPASS )\r
-                       {\r
-                               xStatusMessage.ulMessageValue = mainERROR_COM_TEST;\r
-                       }\r
-\r
-\r
-                       /* Check the reg test tasks are still cycling.  They will stop incrementing\r
-                       their loop counters if they encounter an error. */\r
-                       if( usRegTest1Counter == usLastRegTest1Counter )\r
-                       {\r
-                               xStatusMessage.ulMessageValue = mainERROR_REG_TEST;\r
-                       }\r
-       \r
-                       if( usRegTest2Counter == usLastRegTest2Counter )\r
-                       {\r
-                               xStatusMessage.ulMessageValue = mainERROR_REG_TEST;\r
-                       }\r
-       \r
-                       usLastRegTest1Counter = usRegTest1Counter;\r
-                       usLastRegTest2Counter = usRegTest2Counter;\r
-               #endif\r
+               /* See if the standard demo tasks are executing as expected, changing\r
+               the message that is sent to the LCD task from PASS to an error code if\r
+               any tasks set reports an error. */\r
+               if( xAreComTestTasksStillRunning() != pdPASS )\r
+               {\r
+                       xStatusMessage.ulMessageValue = mainERROR_COM_TEST;\r
+               }\r
+\r
+               if( xAreDynamicPriorityTasksStillRunning() != pdPASS )\r
+               {\r
+                       xStatusMessage.ulMessageValue = mainERROR_DYNAMIC_TASKS;\r
+               }\r
+               \r
+               if( xAreGenericQueueTasksStillRunning() != pdPASS )\r
+               {\r
+                       xStatusMessage.ulMessageValue = mainERROR_GEN_QUEUE_TEST;\r
+               }                       \r
+\r
+               /* Check the reg test tasks are still cycling.  They will stop incrementing\r
+               their loop counters if they encounter an error. */\r
+               if( usRegTest1Counter == usLastRegTest1Counter )\r
+               {\r
+                       xStatusMessage.ulMessageValue = mainERROR_REG_TEST;\r
+               }\r
+\r
+               if( usRegTest2Counter == usLastRegTest2Counter )\r
+               {\r
+                       xStatusMessage.ulMessageValue = mainERROR_REG_TEST;\r
+               }\r
+\r
+               usLastRegTest1Counter = usRegTest1Counter;\r
+               usLastRegTest2Counter = usRegTest2Counter;\r
                \r
                /* As this is the tick hook the lHigherPriorityTaskWoken parameter is not\r
                needed (a context switch is going to be performed anyway), but it must\r
@@ -424,7 +452,7 @@ static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
 __interrupt static void prvSelectButtonInterrupt(void)\r
 {\r
 /* Define the message sent to the LCD task from this interrupt. */\r
-static const xQueueMessage xMessage = { mainMESSAGE_BUTTON_SEL, ( unsigned long ) "Select Interrupt!" };\r
+static const xQueueMessage xMessage = { mainMESSAGE_BUTTON_SEL, ( unsigned long ) "Select Interrupt" };\r
 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
 \r
        /* This is the interrupt handler for the joystick select button input.\r