drv_hd44780.c
上传用户:sourcesun
上传日期:2013-09-23
资源大小:362k
文件大小:22k
源码类别:

DNA

开发平台:

Asm

  1. /*************************************************************************
  2.  *
  3.  *    Used with ICCARM and AARM.
  4.  *
  5.  *    (c) Copyright IAR Systems 2005
  6.  *
  7.  *    File name   : drv_hd44780.c
  8.  *    Description : HD44780 driver
  9.  *
  10.  *    History :
  11.  *    1. Data        : Feb 12, 2005
  12.  *       Author      : Stanimir Bonev
  13.  *       Description : Create
  14.  *    2. Data        : Nov 3, 2005
  15.  *       Author      : Stanimir Bonev
  16.  *       Description : Modify
  17.  *                      Corect some functions -
  18.  *                     HD44780_StrShow, HD44780_CheckVisual,
  19.  *                     HD44780_DisplayShift, HD44780_GetDDRamAdd
  20.  *
  21.  *    $Revision: 1.1.2.1 $
  22. **************************************************************************/
  23. #include "drv_hd44780.h"
  24. #include "drv_hd44780_cnfg.h"
  25. #include "drv_hd44780_l.c"
  26. /* delay definition */
  27. #define HD44780_POWER_UP_DLY          400     /* 40 ms (tick 100us) */
  28. #define HD44780_FIRST_COMM_DLY        41      /* 4.1 ms (tick 100us) */
  29. #define HD44780_SECOND_COMM_DLY       1       /* 100 us (tick 100us) */
  30. #define HD44780_MAX_COMM_DLY          30      /* 3ms (tick 100us) */
  31. /* HD44780 command set */
  32. #define HD44780_CLEAR                 0x01    /* Clear dislplay */
  33. #define HD44780_RETURN                0x02    /* Return dispaly to home */
  34. #define HD44780_ENTRY_MODE            0x04    /* Set Cursor, Display move and direction */
  35. #define HD44780_ENTRY_MODE_CURSOR_S   0x00
  36. #define HD44780_ENTRY_MODE_BOTH_S     0x01
  37. #define HD44780_ENTRY_MODE_DEC        0x00
  38. #define HD44780_ENTRY_MODE_INC        0x02
  39. #define HD44780_DISPLAY_CTRL          0x08    /* Set dispaly and cursor mode */
  40. #define HD44780_DISPLAY_CTRL_C_NORM   0x00
  41. #define HD44780_DISPLAY_CTRL_C_BLINK  0x01
  42. #define HD44780_DISPLAY_CTRL_C_OFF    0x00
  43. #define HD44780_DISPLAY_CTRL_C_ON     0x02
  44. #define HD44780_DISPLAY_CTRL_D_OFF    0x00
  45. #define HD44780_DISPLAY_CTRL_D_ON     0x04
  46. #define HD44780_DISPLAY_MOVE          0x10    /* Dispaly and cursor move */
  47. #define HD44780_DISPLAY_MOVE_LEFT     0x00
  48. #define HD44780_DISPLAY_MOVE_RIGHT    0x04
  49. #define HD44780_DISPLAY_MOVE_C        0x00
  50. #define HD44780_DISPLAY_MOVE_D        0x08
  51. #define HD44780_FUNCTION_SET          0x20    /* Set diplay function */
  52. #define HD44780_FUNCTION_SET_DOT_5_8  0x00
  53. #define HD44780_FUNCTION_SET_DOT_5_10 0x04
  54. #define HD44780_FUNCTION_SET_1_LINE   0x00
  55. #define HD44780_FUNCTION_SET_2_LINE   0x08
  56. #define HD44780_FUNCTION_SET_4_BIT    0x00
  57. #define HD44780_FUNCTION_SET_8_BIT    0x10
  58. #define HD44780_SET_CGRAM_ADD         0x40    /* Set AC point to CGRAM */
  59. #define HD44780_SET_DDRAM_ADD         0x80    /* Set AC point to DDRAM */
  60. // HD44780 Read Status
  61. #define HD44780_STATUS_AC_MASK        0x7F    /* AC Mask */
  62. #define HD44780_STATUS_BUSY_MASK      0x80    /* Busy Mask */
  63. #define HD44780_BUSY_CHECK            TRUE
  64. #define HD44780_NOT_BUSY_CHECK        FALSE
  65. HD44780_CTRL_DEF HD4478_Ctrl =
  66. {
  67.   0,                    /* Dispaly Position */
  68.   HD44780_AC_DIR,       /* Address counter direction */
  69.   HD44780_MOVE,         /* Cursor or dispaly move */
  70.   HD44780_LINE,         /* Number of line */
  71.   HD44780_DOT_MATRIX,   /* Character Dot matrix */
  72.   HD44780_DISPLAY_STATE,/* Dispaly state On or Off */
  73.   HD44780_CURSOR_STATE, /* Cursor state On or Off */
  74.   HD44780_CURSOR_MODE,  /* Cursor mode Blink or not */
  75. };
  76. #if HD4780_WR == 0
  77. Int8S DataRamAddHold = 0;
  78. #endif
  79. /*************************************************************************
  80.  * Function Name: HD44780WrData
  81.  * Parameters: Int8U Data
  82.  * Return: none
  83.  * Description: Write data to HD44780
  84.  *
  85.  *************************************************************************/
  86. void HD44780WrData (Int8U Data)
  87. {
  88.   HD44780SetRS(1);
  89. #if HD44780_BUS_WIDTH == 8
  90.   HD44780WrIO(Data);
  91. #else
  92.   HD44780WrIO((Data>>4) & 0xF);
  93.   HD44780WrIO(Data & 0xF);
  94. #endif
  95. }
  96. #if HD4780_WR > 0
  97. /*************************************************************************
  98.  * Function Name: HD44780RdData
  99.  * Parameters: none
  100.  * Return: Int8U
  101.  * Description: Read data from HD44780
  102.  *
  103.  *************************************************************************/
  104. Int8U HD44780RdData (void)
  105. {
  106. Int8U Data;
  107.   HD44780SetRS(1);
  108. #if HD44780_BUS_WIDTH == 8
  109.   Data = HD44780RrIO();
  110. #else
  111.   Data = (HD44780RdIO() << 4) & 0xF0;
  112.   Data |= HD44780RdIO() & 0xF0;
  113. #endif
  114.   return Data;
  115. }
  116. #endif
  117. /*************************************************************************
  118.  * Function Name: HD44780WrComm
  119.  * Parameters: Int8U Command
  120.  * Return: none
  121.  * Description: Send comand to HD44780
  122.  *
  123.  *************************************************************************/
  124. void HD44780WrComm (Int8U Command)
  125. {
  126.   HD44780SetRS(0);
  127. #if HD44780_BUS_WIDTH == 8
  128.   HD44780WrIO(Command);
  129. #else
  130.   HD44780WrIO((Command >> 4) & 0xF);
  131.   HD44780WrIO(Command & 0xF);
  132. #endif
  133. }
  134. #if HD4780_WR > 0
  135. /*************************************************************************
  136.  * Function Name: HD44780RdStatus
  137.  * Parameters: none
  138.  * Return: Int8U
  139.  * Description: Read status of HD44780
  140.  *
  141.  *************************************************************************/
  142. Int8U HD44780RdStatus (void)
  143. {
  144. Int8U Data;
  145.   HD44780SetRS(0);
  146. #if HD44780_BUS_WIDTH == 8
  147.   Data = HD44780RrIO();
  148. #else
  149.   Data = (HD44780RdIO() << 4) & 0xF0;
  150.   Data |= HD44780RdIO() & 0xF0;
  151. #endif
  152.   return Data;
  153. }
  154. #endif
  155. /*************************************************************************
  156.  * Function Name: HD44780_GetDDRamAdd
  157.  * Parameters: HD44780_XY_DEF X,
  158.  *             HD44780_XY_DEF Y,
  159.  *             LPC_INT8U * DDAdd
  160.  * Return: HD44780_ERROR_CODE_DEF
  161.  *         HD44780_OK  0: Pass
  162.  *      HD44780_ERROR 2: Out of boundary
  163.  * Description: Calculate DDRAM address by X,Y cooardinate
  164.  *
  165.  *************************************************************************/
  166. HD44780_ERROR_CODE_DEF HD44780_GetDDRamAdd (HD44780_XY_DEF X, HD44780_XY_DEF Y,Int8U * DDAdd)
  167. {
  168.   /* Find Addres by coordinate */
  169.   if (Y > 2)
  170.   {
  171.     return HD44780_ERROR;
  172.   }
  173.   if (X > HD44780_MAX_LINE1_ADD)
  174.   {
  175.     return HD44780_ERROR;
  176.   }
  177.   *DDAdd = X-1;
  178.   if (Y == 2)
  179.   {
  180.     * DDAdd += HD44780_MIN_LINE2_ADD;
  181.   }
  182.   return HD44780_OK;
  183. }
  184. /*************************************************************************
  185.  * Function Name: HD44780_CheckVisual
  186.  * Parameters: Int8U DDRamAdd
  187.  * Return: HD44780_ERROR_CODE_DEF
  188.  *         HD44780_OK           : Pass
  189.  *         HD44780_ERROR        : Out of address boundary
  190.  *        HD44780_OUT_OF_VISUAL: Out of visual boundary
  191.  * Description: Whether current DDRAM address is into visual area
  192.  *
  193.  *************************************************************************/
  194. HD44780_ERROR_CODE_DEF HD44780_CheckVisual(Int8U DDRamAdd)
  195. {
  196. Int8U LastPos = 0;
  197.   if (DDRamAdd > HD44780_MAX_LINE2_ADD)
  198.   {
  199.     return HD44780_ERROR;
  200.   }
  201.   if((DDRamAdd > HD44780_MAX_LINE1_ADD) && (DDRamAdd < HD44780_MIN_LINE2_ADD))
  202.   {
  203.     return HD44780_ERROR;
  204.   }
  205.   if (DDRamAdd >= HD44780_MIN_LINE2_ADD)
  206.   {
  207.     /* Convert address to line 1 address */
  208.     DDRamAdd -= 0x40;
  209.   }
  210.   LastPos = HD4478_Ctrl.DiplayPos+HD44780_HORIZONTAL_SIZE;
  211.   if(LastPos > HD44780_MAX_LINE1_ADD)
  212.   {
  213.     if((DDRamAdd > HD44780_MAX_LINE1_ADD - HD4478_Ctrl.DiplayPos) && (DDRamAdd < HD4478_Ctrl.DiplayPos))
  214.     {
  215.       return HD44780_OUT_OF_VISUAL;
  216.     }
  217.     LastPos = HD44780_MAX_LINE1_ADD;
  218.   }
  219.   if ((DDRamAdd < HD4478_Ctrl.DiplayPos) || (DDRamAdd > LastPos))
  220.   {
  221.     return HD44780_OUT_OF_VISUAL;
  222.   }
  223.   return HD44780_OK;
  224. }
  225. /*************************************************************************
  226.  * Function Name: HD44780_BusyCheck
  227.  * Parameters: Int8U * AddCount, Int32U MaxDly
  228.  * Return: HD44780_ERROR_CODE_DEF
  229.  *         HD44780_OK  0: Pass
  230.  *    HD44780_ERROR 1: Busy check Time Out
  231.  * Description: Wait MaxDly *100u or until the busy flag is clear
  232.  *
  233.  *************************************************************************/
  234. HD44780_ERROR_CODE_DEF HD44780_BusyCheck (Int8U * AddCount, Int32U MaxDly)
  235. {
  236. #if HD4780_WR > 0
  237. Int8U AddHold;
  238. #endif
  239.   for (;MaxDly;--MaxDly)
  240.   {
  241. #if HD4780_WR > 0
  242.     AddHold = HD44780RdStatus();
  243.     if ((AddHold & HD44780_STATUS_BUSY_MASK) == 0)
  244.     {
  245.       /* Wait 1.5 * Tlcd */
  246.       HD44780_BUS_DLY();
  247.       HD44780_BUS_DLY();
  248.       /* Get current AC */
  249.       AddHold = HD44780RdStatus();
  250.       AddHold &= HD44780_STATUS_AC_MASK;
  251.       if(AddCount != NULL)
  252.       {
  253.         *AddCount = AddHold;
  254.       }
  255.       return HD44780_OK;
  256.     }
  257. #endif
  258.     Dly100us((void *)1);
  259.   }
  260. #if HD4780_WR > 0
  261.   return HD44780_BUSY_TO_ERROR;
  262. #else
  263.   if(AddCount != NULL)
  264.   {
  265.     *AddCount = DataRamAddHold;
  266.   }
  267.   return HD44780_OK;
  268. #endif
  269. }
  270. /*************************************************************************
  271.  * Function Name: HD44780_Init
  272.  * Parameters: none
  273.  * Return: HD44780_ERROR_CODE_DEF
  274.  *         HD44780_OK  0: Pass
  275.  *    HD44780_ERROR 1: Busy check Time Out
  276.  * Description: Init HD44780 after power-up
  277.  *
  278.  *************************************************************************/
  279. HD44780_ERROR_CODE_DEF HD44780_PowerUpInit (void)
  280. {
  281. Int8U Command;
  282.   HD4478_Ctrl.DiplayPos = 0;
  283.   /* Init MCU IO */
  284.   HD44780_IO_Init();
  285.   /* Power up init sequence */
  286.   Dly100us((void *)HD44780_POWER_UP_DLY);
  287.   HD44780WrComm(HD44780_FUNCTION_SET+HD44780_FUNCTION_SET_8_BIT);
  288.   Dly100us((void *)HD44780_FIRST_COMM_DLY);
  289.   HD44780WrComm(HD44780_FUNCTION_SET+HD44780_FUNCTION_SET_8_BIT);
  290.   Dly100us((void *)HD44780_SECOND_COMM_DLY);
  291.   HD44780WrComm(HD44780_FUNCTION_SET+HD44780_FUNCTION_SET_8_BIT);
  292.   if (HD44780_BusyCheck(NULL,2) != HD44780_OK)
  293.   {
  294.     return HD44780_ERROR;
  295.   }
  296.   /* Dispalay Function set */
  297.   Command = HD44780_FUNCTION_SET;
  298.   if (HD4478_Ctrl.Line)
  299.   {
  300.     Command |= HD44780_FUNCTION_SET_2_LINE;
  301.   }
  302.   if (HD4478_Ctrl.DotMode)
  303.   {
  304.     Command |= HD44780_FUNCTION_SET_DOT_5_10;
  305.   }
  306.   HD44780WrComm(Command);
  307.   if (HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  308.   {
  309.     return HD44780_ERROR;
  310.   }
  311.   /* Display off */
  312.   HD44780WrComm(HD44780_DISPLAY_CTRL);
  313.   if (HD44780_BusyCheck(NULL,HD44780_MAX_COMM_DLY) != HD44780_OK)
  314.   {
  315.     return HD44780_ERROR;
  316.   }
  317.   /* Display clear */
  318.   if (HD44780_ClearDisplay() != HD44780_OK)
  319.   {
  320.     return HD44780_ERROR;
  321.   }
  322. #if HD4780_WR == 0
  323.   DataRamAddHold = 0;
  324. #endif
  325.   /* Set entry mode */
  326.   Command = HD44780_ENTRY_MODE;
  327.   if (HD4478_Ctrl.AC_Direction)
  328.   {
  329.     Command |= HD44780_ENTRY_MODE_INC;
  330.   }
  331.   if (HD4478_Ctrl.DisplayShift)
  332.   {
  333.     Command |= HD44780_ENTRY_MODE_BOTH_S;
  334.   }
  335.   /* Set Display and cursor mode */
  336.   if (HD44780_SetMode() != HD44780_OK)
  337.   {
  338.     return HD44780_ERROR;
  339.   }
  340.   return HD44780_OK;
  341. }
  342. /*************************************************************************
  343.  * Function Name: HD44780_GetSetting
  344.  * Parameters: none
  345.  * Return: HD44780_CTRL_DEF *
  346.  * Description: Return pointer to Driver settings structure
  347.  *
  348.  *************************************************************************/
  349. HD44780_CTRL_DEF * HD44780_GetSetting(void)
  350. {
  351.   return &HD4478_Ctrl;
  352. }
  353. /*************************************************************************
  354.  * Function Name: HD44780_SetMode
  355.  * Parameters: none
  356.  * Return: HD44780_ERROR_CODE_DEF
  357.  *         HD44780_OK  0: Pass
  358.  *    HD44780_ERROR 1: Busy check Time Out
  359.  * Description: Set diplay mode: Display On/Off; Cursor On/Off
  360.  *  Cursor blink On/Off
  361.  *************************************************************************/
  362. HD44780_ERROR_CODE_DEF HD44780_SetMode (void)
  363. {
  364. Int8U Command = HD44780_DISPLAY_CTRL;
  365.   if (HD4478_Ctrl.DisplayOn)
  366.   {
  367.     Command |= HD44780_DISPLAY_CTRL_D_ON;
  368.   }
  369.   if (HD4478_Ctrl.CursorOn)
  370.   {
  371.     Command |= HD44780_DISPLAY_CTRL_C_ON;
  372.   }
  373.   if (HD4478_Ctrl.CursorBlink)
  374.   {
  375.     Command |= HD44780_DISPLAY_CTRL_C_BLINK;
  376.   }
  377.   HD44780WrComm(Command);
  378.   return HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY);
  379. }
  380. /*************************************************************************
  381.  * Function Name: HD44780_ClearDisplay
  382.  * Parameters: none
  383.  * Return: HD44780_ERROR_CODE_DEF
  384.  *         HD44780_OK  0: Pass
  385.  *    HD44780_ERROR 1: Busy check Time Out
  386.  * Description: Clear dispaly and set position to home
  387.  *
  388.  *************************************************************************/
  389. HD44780_ERROR_CODE_DEF HD44780_ClearDisplay (void)
  390. {
  391. #if HD4780_WR == 0
  392.   DataRamAddHold = 0;
  393. #endif
  394.   HD4478_Ctrl.DiplayPos = 0;
  395.   HD44780WrComm(HD44780_CLEAR);
  396.   return HD44780_BusyCheck(NULL,HD44780_MAX_COMM_DLY);
  397. }
  398. /*************************************************************************
  399.  * Function Name: HD44780_ReturnToHome
  400.  * Parameters: none
  401.  * Return: HD44780_ERROR_CODE_DEF
  402.  *         HD44780_OK  0: Pass
  403.  *    HD44780_ERROR 1: Busy check Time Out
  404.  * Description: Set display position to home
  405.  *
  406.  *************************************************************************/
  407. HD44780_ERROR_CODE_DEF HD44780_ReturnToHome (void)
  408. {
  409. #if HD4780_WR == 0
  410.   DataRamAddHold = 0;
  411. #endif
  412.   HD4478_Ctrl.DiplayPos = 0;
  413.   HD44780WrComm(HD44780_RETURN);
  414.   return HD44780_BusyCheck(NULL,HD44780_MAX_COMM_DLY);
  415. }
  416. /*************************************************************************
  417.  * Function Name: HD44780_GetDisplayPosition
  418.  * Parameters: none
  419.  * Return: Int8U
  420.  *
  421.  * Description: Return X ccordinate of visual part
  422.  *
  423.  *************************************************************************/
  424. Int8U HD44780_GetDisplayPosition (void)
  425. {
  426.   return HD4478_Ctrl.DiplayPos;
  427. }
  428. /*************************************************************************
  429.  * Function Name: HD44780_DisplayShift
  430.  * Parameters: Boolean DisplayOn, Int8S DiplayShift
  431.  * Return: HD44780_ERROR_CODE_DEF
  432.  *         HD44780_OK  0: Pass
  433.  *      HD44780_ERROR 1: Busy check Time Out
  434.  * Description: Shift display
  435.  *
  436.  *************************************************************************/
  437. HD44780_ERROR_CODE_DEF HD44780_DisplayShift (Boolean DisplayOn, Int8S DiplayShift)
  438. {
  439. Int8U ShiftDir;
  440.   if (DiplayShift >= 0)
  441.   {
  442.     if(DiplayShift > HD44780_MAX_LINE1_ADD)
  443.     {
  444.       return HD44780_ERROR;
  445.     }
  446.     ShiftDir = HD44780_DISPLAY_MOVE_RIGHT;
  447.   }
  448.   else
  449.   {
  450.     if(DiplayShift < -HD44780_MAX_LINE2_ADD)
  451.     {
  452.       return HD44780_ERROR;
  453.     }
  454.     ShiftDir = HD44780_DISPLAY_MOVE_LEFT;
  455.     DiplayShift = 0 - DiplayShift;  /* DiplayShift = -DiplayShift */
  456.   }
  457.   for (int i = 0; i < DiplayShift; ++i)
  458.   {
  459.     HD44780WrComm(HD44780_DISPLAY_MOVE + HD44780_DISPLAY_MOVE_D + ShiftDir);
  460.     if (HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  461.     {
  462.       return HD44780_ERROR;
  463.     }
  464.     if (ShiftDir == HD44780_DISPLAY_MOVE_LEFT)
  465.     {
  466.       if(++HD4478_Ctrl.DiplayPos > HD44780_MAX_LINE1_ADD)
  467.       {
  468.         HD4478_Ctrl.DiplayPos = 0;
  469.       }
  470.     }
  471.     else
  472.     {
  473.       if(--HD4478_Ctrl.DiplayPos > HD44780_MAX_LINE1_ADD) /* --0 = 0xFF > 39 */
  474.       {
  475.         HD4478_Ctrl.DiplayPos = HD44780_MAX_LINE1_ADD;
  476.       }
  477.     }
  478.   }
  479.   return HD44780_OK;
  480. }
  481. /*************************************************************************
  482.  * Function Name: HD44780_CursorPosSet
  483.  * Parameters: Boolean CursorOn,Boolean CursorBlink,
  484.  *             HD44780_XY_DEF X, HD44780_XY_DEF Y
  485.  * Return: HD44780_ERROR_CODE_DEF
  486.  *         HD44780_OK  0: Pass
  487.  *      HD44780_ERROR 1: Busy check Time Out
  488.  * Description: Set position of cursor
  489.  *
  490.  *************************************************************************/
  491. HD44780_ERROR_CODE_DEF HD44780_CursorPosSet (Boolean CursorOn,Boolean CursorBlink, HD44780_XY_DEF X, HD44780_XY_DEF Y)
  492. {
  493. Int8U CursorPos;
  494.   /* Find Addres by coordinate */
  495.   if (HD44780_GetDDRamAdd(X,Y,&CursorPos) != HD44780_OK)
  496.   {
  497.     return HD44780_ERROR;
  498.   }
  499.   /* Cursor off */
  500.   HD4478_Ctrl.CursorOn = HD44780_CURSOR_OFF;
  501.   if (HD44780_SetMode() != HD44780_OK)
  502.   {
  503.     return HD44780_ERROR;
  504.   }
  505.   /* Set Address to DDRAM */
  506.   HD44780WrComm(HD44780_SET_DDRAM_ADD + CursorPos);
  507. #if HD4780_WR == 0
  508.   DataRamAddHold = CursorPos;
  509. #endif
  510.   if (HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  511.   {
  512.     return HD44780_ERROR;
  513.   }
  514.   /* Set Cursor dependence of CursorOn */
  515.   HD4478_Ctrl.CursorOn = CursorOn;
  516.   HD4478_Ctrl.CursorBlink = CursorBlink;
  517.   return HD44780_SetMode();
  518. }
  519. #if HD4780_WR > 0
  520. /*************************************************************************
  521.  * Function Name: HD44780_RdCGRAM
  522.  * Parameters: HD44780_STRING_DEF * CG_Data,
  523.  *             Int8U CGRAM_Add
  524.  * Return: HD44780_ERROR_CODE_DEF
  525.  *        HD44780_OK  0: Pass
  526.  *     HD44780_ERROR  1: Busy check Time Out
  527.  * Description: Read Character patern from CGRAM
  528.  *
  529.  *************************************************************************/
  530. HD44780_ERROR_CODE_DEF HD44780_RdCGRAM (HD44780_STRING_DEF * CG_Data, Int8U CGRAM_Add)
  531. {
  532. Int8U Counter = 8;
  533. Int8U DDRAM_AddHold;
  534.   if (CGRAM_Add > HD44780_MAX_CGRAM)
  535.   {
  536.     return HD44780_ERROR;
  537.   }
  538.   /* Get current DDRAM address */
  539.   if (HD44780_BusyCheck(&DDRAM_AddHold,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  540.   {
  541.     return HD44780_ERROR;
  542.   }
  543.   if (HD4478_Ctrl.DotMode)
  544.   {
  545.     Counter = 10;
  546.     /* Address aling to chracter space */
  547.     CGRAM_Add &= 0xF;
  548.   }
  549.   else
  550.   {
  551.     Counter = 8;
  552.     /* Address aling to chracter space */
  553.     CGRAM_Add &= 0x7;
  554.   }
  555.   /* Set CGRAM Address */
  556.   HD44780WrComm(HD44780_SET_CGRAM_ADD + CGRAM_Add);
  557.   if (HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  558.   {
  559.     return HD44780_ERROR;
  560.   }
  561.   for ( ;Counter; --Counter)
  562.   {
  563.     *CG_Data = HD44780RdData();
  564.     if (HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  565.     {
  566.       break;
  567.     }
  568.     ++CG_Data;
  569.   }
  570.   HD44780WrComm(HD44780_SET_DDRAM_ADD + DDRAM_AddHold);
  571.   return((HD44780_ERROR_CODE_DEF)(HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) || (Counter?HD44780_ERROR:HD44780_OK)));
  572. }
  573. #endif
  574. /*************************************************************************
  575.  * Function Name: HD44780_WrCGRAM
  576.  * Parameters: const HD44780_STRING_DEF * CG_Data,
  577.  *             Int8U CGRAM_Add
  578.  * Return: HD44780_ERROR_CODE_DEF
  579.  *        HD44780_OK  0: Pass
  580.  *     HD44780_ERROR  1: Busy check Time Out
  581.  * Description: Write Charcter patern into CGRAM
  582.  *
  583.  *************************************************************************/
  584. HD44780_ERROR_CODE_DEF HD44780_WrCGRAM (const HD44780_STRING_DEF * CG_Data, Int8U CGRAM_Add)
  585. {
  586. Int8U Counter = 8;
  587. Int8U DDRAM_AddHold;
  588.   /* Get current DDRAM address */
  589.   if (HD44780_BusyCheck(&DDRAM_AddHold,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  590.   {
  591.     return HD44780_ERROR;
  592.   }
  593.   if (HD4478_Ctrl.DotMode)
  594.   {
  595.     Counter = 10;
  596.     /* Address aling to chracter space */
  597.     CGRAM_Add &= 0xF;
  598.   }
  599.   else
  600.   {
  601.     Counter = 8;
  602.     /* Address aling to chracter space */
  603.     CGRAM_Add &= 0x7;
  604.   }
  605.   CGRAM_Add *= Counter;
  606.   if (CGRAM_Add > HD44780_MAX_CGRAM)
  607.   {
  608.     return HD44780_ERROR;
  609.   }
  610.   /* Set CGRAM Address */
  611.   HD44780WrComm(HD44780_SET_CGRAM_ADD + CGRAM_Add);
  612.   if (HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  613.   {
  614.     return HD44780_ERROR;
  615.   }
  616.   for ( ;Counter; --Counter)
  617.   {
  618.     HD44780WrData(*CG_Data);
  619.     if (HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  620.     {
  621.       break;
  622.     }
  623.     ++CG_Data;
  624.   }
  625.   HD44780WrComm(HD44780_SET_DDRAM_ADD + DDRAM_AddHold);
  626.   return((HD44780_ERROR_CODE_DEF)(HD44780_BusyCheck(NULL,HD44780_FIRST_COMM_DLY) || (Counter?HD44780_ERROR:HD44780_OK)));
  627. }
  628. /*************************************************************************
  629.  * Function Name: HD44780_StrShow
  630.  * Parameters: none
  631.  * Return: MENU_ERROR_CODE_DEF
  632.  *        HD44780_OK  0: Pass
  633.  *     HD44780_ERROR  1: Busy check TimeOut
  634.  * Description: Show zero terminate string into LCD
  635.  *
  636.  *************************************************************************/
  637. HD44780_ERROR_CODE_DEF HD44780_StrShow(HD44780_XY_DEF X, HD44780_XY_DEF Y, const HD44780_STRING_DEF * DataStr)
  638. {
  639. Int8U DDRamAdd;
  640. HD44780_ERROR_CODE_DEF ErrorRes = HD44780_OK;
  641.   if(HD44780_GetDDRamAdd(X,Y,&DDRamAdd) != HD44780_OK)
  642.   {
  643.     return HD44780_ERROR;
  644.   }
  645.   /* Set Address to DDRAM */
  646.   HD44780WrComm(HD44780_SET_DDRAM_ADD + DDRamAdd);
  647. #if HD4780_WR == 0
  648.   DataRamAddHold = DDRamAdd;
  649. #endif
  650.   if (HD44780_BusyCheck(&DDRamAdd,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  651.   {
  652.     return HD44780_ERROR;
  653.   }
  654.   /* Write zero terminate string int LCD */
  655.   while (*DataStr)
  656.   {
  657.     ErrorRes |= HD44780_CheckVisual(DDRamAdd);
  658.     HD44780WrData(*DataStr);
  659. #if HD4780_WR == 0
  660.     if(HD4478_Ctrl.AC_Direction)
  661.     {
  662.       if((++DataRamAddHold > HD44780_MAX_LINE1_ADD) && (Y == 1))
  663.       {
  664.         DataRamAddHold = HD44780_MIN_LINE2_ADD;
  665.       }
  666.       else if ((Y == 2) && (DataRamAddHold > HD44780_MAX_LINE2_ADD))
  667.       {
  668.         DataRamAddHold = HD44780_MIN_LINE1_ADD;
  669.       }
  670.     }
  671.     else
  672.     {
  673.       if((--DataRamAddHold < 0) && (Y == 1))
  674.       {
  675.         DataRamAddHold = HD44780_MAX_LINE2_ADD;
  676.       }
  677.       else if ((Y == 2) && (DataRamAddHold < HD44780_MIN_LINE2_ADD))
  678.       {
  679.         DataRamAddHold = HD44780_MAX_LINE1_ADD;
  680.       }
  681.     }
  682. #endif
  683.     if (HD44780_BusyCheck(&DDRamAdd,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  684.     {
  685.       return HD44780_ERROR;
  686.     }
  687.     ++DataStr;
  688.     if((Y == 1) && DDRamAdd > HD44780_MAX_LINE1_ADD)
  689.     {
  690.       HD44780WrComm(HD44780_SET_DDRAM_ADD+HD44780_MIN_LINE1_ADD);
  691.     #if HD4780_WR == 0
  692.       DataRamAddHold = HD44780_MIN_LINE1_ADD;
  693.     #endif
  694.       if (HD44780_BusyCheck(&DDRamAdd,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  695.       {
  696.         return HD44780_ERROR;
  697.       }
  698.     }
  699.     else if ((Y == 2) && DDRamAdd < HD44780_MIN_LINE2_ADD)
  700.     {
  701.       HD44780WrComm(HD44780_SET_DDRAM_ADD+HD44780_MIN_LINE2_ADD);
  702.     #if HD4780_WR == 0
  703.       DataRamAddHold = HD44780_MIN_LINE2_ADD;
  704.     #endif
  705.       if (HD44780_BusyCheck(&DDRamAdd,HD44780_FIRST_COMM_DLY) != HD44780_OK)
  706.       {
  707.         return HD44780_ERROR;
  708.       }
  709.     }
  710.   }
  711.   return ErrorRes;
  712. }