home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 September / pcwk_09_96.iso / demo / wgelectr / pk51demo / files.2 / EXAMPLES / TDP / CLOCK.C next >
C/C++ Source or Header  |  1995-06-08  |  6KB  |  224 lines

  1. /*------------------------------------------------------------------------------
  2. CLOCK.C:  Routines to maintain a TOD clock.
  3.  
  4. Copyright 1995 KEIL Software, Inc.
  5. ------------------------------------------------------------------------------*/
  6.  
  7. #include <ctype.h>
  8. #include <string.h>
  9. #include <stdio.h>
  10. #include "tdp.h"
  11.  
  12. /*------------------------------------------------------------------------------
  13.               Global Variable Declarations
  14. ------------------------------------------------------------------------------*/
  15. static xdata unsigned long dayhsecs;
  16. static xdata unsigned last_tick;
  17. static xdata unsigned char scan_flag;
  18. static xdata unsigned char alm_flag;
  19. static xdata unsigned almmins;
  20.  
  21. #define MAX_HSEC_DAY    (100 * 60 * 60 * 24)
  22.  
  23. /*------------------------------------------------------------------------------
  24. ------------------------------------------------------------------------------*/
  25. void clock_init (void)
  26. {
  27. scan_flag = 0;
  28. alm_flag = 0;
  29. dayhsecs = 0L;
  30. last_tick = timer0_count ();
  31. }
  32.  
  33. /*------------------------------------------------------------------------------
  34. ------------------------------------------------------------------------------*/
  35. void clock_update (void)
  36. {
  37. static xdata unsigned long last_daysecs;
  38.  
  39. dayhsecs += timer0_elapsed_count (last_tick);
  40. last_tick = timer0_count ();
  41.  
  42. while (dayhsecs >= MAX_HSEC_DAY)
  43.   dayhsecs -= MAX_HSEC_DAY;
  44.  
  45. if ((dayhsecs / 100) == last_daysecs)
  46.   return;
  47.  
  48. last_daysecs = dayhsecs / 100;
  49.  
  50. if (alm_flag != 0)
  51.   if ((dayhsecs / (100 * 60)) == almmins)
  52.     com_putchar ('\x7');
  53.  
  54. if (scan_flag != 0)
  55.   {
  56.   clock_out_time ();
  57.   cmdb_prompt ();
  58.   }
  59. }
  60.  
  61. /*------------------------------------------------------------------------------
  62. ------------------------------------------------------------------------------*/
  63. void clock_set (
  64.   unsigned long sethsec)
  65. {
  66. dayhsecs = sethsec;
  67. last_tick = timer0_count ();
  68. clock_update ();
  69. }
  70.  
  71. /*------------------------------------------------------------------------------
  72. ------------------------------------------------------------------------------*/
  73. void clock_scan (
  74.   unsigned char flag)
  75. {
  76. scan_flag = flag;
  77. }
  78.  
  79. /*------------------------------------------------------------------------------
  80. ------------------------------------------------------------------------------*/
  81. void clock_out_time (void)
  82. {
  83. xdata char buf [21];
  84. unsigned hsecs;
  85. unsigned secs;
  86. unsigned mins;
  87. unsigned hours;
  88. unsigned long t;
  89.  
  90. t = dayhsecs;
  91.  
  92. hsecs = t % 100;
  93. t /= 100;
  94. secs  = t % 60;
  95. t /= 60;
  96. mins  = t % 60;
  97. t /= 60;
  98. hours = t % 24;
  99.  
  100. buf [0]  = (hours / 10) + '0';
  101. buf [1]  = (hours % 10) + '0';
  102. buf [2]  = ':';
  103. buf [3]  = (mins / 10) + '0';
  104. buf [4]  = (mins % 10) + '0';
  105. buf [5]  = ':';
  106. buf [6]  = (secs / 10) + '0';
  107. buf [7]  = (secs % 10) + '0';
  108. buf [8]  = '.';
  109. buf [9]  = (hsecs / 10) + '0';
  110. buf [10] = (hsecs % 10) + '0';
  111. buf [11] = '\0';
  112.  
  113. com_puts ("\r\n");
  114. com_puts (buf);
  115. com_puts ("\r\n");
  116. }
  117.  
  118. /*------------------------------------------------------------------------------
  119. TIME STR: HHMMSS
  120. ------------------------------------------------------------------------------*/
  121. char strtotm (
  122.   unsigned long *t,
  123.   char *s)
  124. {
  125. char *s2;
  126. unsigned char tmp;
  127.  
  128. /*-------------------------------------------------
  129. ------------------------------------------------*/
  130. if (strlen (s) != 6)
  131.   return (-1);
  132.  
  133. for (s2 = s; *s2 != '\0'; s2++)
  134.   {
  135.   if (!isdigit (*s2))
  136.     return (-1);
  137.   }
  138.  
  139. /*-------------------------------------------------
  140. ------------------------------------------------*/
  141. tmp = ((s[0] - '0') * 10) + (s[1] - '0');
  142. if (tmp >= 24)
  143.   return (-1);
  144. *t = tmp;
  145.  
  146. /*-------------------------------------------------
  147. ------------------------------------------------*/
  148. tmp = ((s[0] - '0') * 10) + (s[1] - '0');
  149. if (tmp >= 24)
  150.   return (-1);
  151. *t = tmp;
  152.  
  153. /*-------------------------------------------------
  154. ------------------------------------------------*/
  155. tmp = ((s[2] - '0') * 10) + (s[3] - '0');
  156. if (tmp >= 60)
  157.   return (-1);
  158. *t = (60 * *t) + tmp;
  159.  
  160. /*-------------------------------------------------
  161. ------------------------------------------------*/
  162. tmp = ((s[4] - '0') * 10) + (s[5] - '0');
  163. if (tmp >= 60)
  164.   return (-1);
  165. *t = (60 * *t) + tmp;
  166.  
  167. /*-------------------------------------------------
  168. ------------------------------------------------*/
  169. return (0);
  170. }
  171.  
  172. /*------------------------------------------------------------------------------
  173. ------------------------------------------------------------------------------*/
  174. void alarm_set (
  175.   unsigned setmins)
  176. {
  177. almmins = setmins;
  178. alm_flag = 1;
  179. }
  180.  
  181. /*------------------------------------------------------------------------------
  182. ------------------------------------------------------------------------------*/
  183. void alarm_clr (void)
  184. {
  185. alm_flag = 0;
  186. }
  187.  
  188. /*------------------------------------------------------------------------------
  189. ------------------------------------------------------------------------------*/
  190. void alarm_out_time (void)
  191. {
  192. xdata char buf [21];
  193. unsigned mins;
  194. unsigned hours;
  195. unsigned t;
  196.  
  197. if (alm_flag == 0)
  198.   {
  199.   com_puts ("\r\nNone\r\n");
  200.   return;
  201.   }
  202.  
  203. t = almmins;
  204.  
  205. mins  = t % 60;
  206. t /= 60;
  207. hours = t % 24;
  208.  
  209. buf [0] = (hours / 10) + '0';
  210. buf [1] = (hours % 10) + '0';
  211. buf [2] = ':';
  212. buf [3] = (mins / 10) + '0';
  213. buf [4] = (mins % 10) + '0';
  214. buf [5] = '\0';
  215.  
  216. com_puts ("\r\n");
  217. com_puts (buf);
  218. com_puts ("\r\n");
  219. }
  220.  
  221. /*------------------------------------------------------------------------------
  222. ------------------------------------------------------------------------------*/
  223.  
  224.