GUI_AddDec.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:3k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : GUIVAL.C
  16. Purpose     : Routines to display values as dec, binary or hex
  17. ----------------------------------------------------------------------
  18. */
  19. #include "GUI_Protected.H"
  20. #include "GUIDebug.h"
  21. #include "string.h"
  22. /*********************************************************************
  23. *
  24. *       Public data
  25. *
  26. **********************************************************************
  27. */
  28. const U32 GUI_Pow10[10] = {
  29.   1 , 10, 100, 1000, 10000,
  30.   100000, 1000000, 10000000, 100000000, 1000000000
  31. };
  32. /*********************************************************************
  33. *
  34. *       Static routines
  35. *
  36. **********************************************************************
  37. */
  38. static int _Check_NegLong(I32 *pv, char**ps) {
  39.   if (*pv<0) {
  40.     *(*ps)++ = '-';
  41.     *pv = -*pv;
  42.     return 1;
  43.   }
  44.   return 0;
  45. }
  46. /*********************************************************************
  47. *
  48. *       Module internal routines
  49. *
  50. **********************************************************************
  51. */
  52. int GUI_Long2Len(I32 vSign) {
  53.   int Len = 1;
  54.   I32 v = (vSign>0) ? vSign : -vSign;
  55.   while (( ((U32)v) >= GUI_Pow10[Len]) && (Len <9))
  56.     Len++;
  57.   if (vSign<0)
  58. Len++;
  59.   return Len;
  60. }
  61. long GUI_AddSign(long v, char**ps) {
  62.   char c;
  63.   if (v<0) {
  64.     c = '-';
  65.     v = -v;
  66.   } else {
  67.     c = '+';
  68.   }
  69.   *(*ps)++ = c;
  70.   **ps     = '';
  71.   return v;
  72. }
  73. /*********************************************************************
  74. *
  75. *       Public routines
  76. *
  77. **********************************************************************
  78. */
  79. /*********************************************************************
  80. *
  81. *       Decimal GUI_Add...  routines
  82. */
  83. void GUI_AddDecShift(I32 v, U8 Len, U8 Shift, char**ps) {
  84.   char c;
  85.   long d;
  86.   #ifndef _CM16C
  87.     Len -= _Check_NegLong(&v, ps); /* TASKING: Tool internal error S003: asertion failed - please report */
  88.   #else
  89.     if (v<0) {
  90.       *(*ps)++ = '-';
  91.       v = -v;
  92.     }
  93.   #endif
  94.   if (Shift) Len--;
  95. #if GUI_DEBUG_LEVEL >1
  96.   if (Len>9) {
  97.     Len=9;
  98.     GUI_DEBUG_ERROROUT("Can not display more than 9 dec. digits");
  99.   }
  100. #endif
  101.   if ((U32)v >= GUI_Pow10[Len])
  102. v = GUI_Pow10[Len]-1;
  103.   while (Len) {
  104.     if (Len--==Shift)
  105.       *(*ps)++ = GUI_DecChar;
  106.     d = GUI_Pow10[Len];
  107.     c = (char) (v/d);
  108.     v -= c*d;
  109.     *(*ps)++ = c+'0';
  110.   }
  111.   **ps = 0;
  112. }
  113. void GUI_AddDec(I32 v, U8 Len, char**ps) {
  114.   GUI_AddDecShift(v, Len, 0, ps);
  115. }
  116. void GUI_AddDecMin(I32 v, char**ps) {
  117.   U8 Len = GUI_Long2Len(v);
  118.   GUI_AddDecShift(v, Len, 0, ps);
  119. }