微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第89节:用单片机内部定时器做一个时钟

第89节:用单片机内部定时器做一个时钟

时间:11-22 来源:互联网 点击:

  1. 新显示
  2. {
  3. ucWd2Part2Update=0;
  4. ucTemp5=ucMinute/10;//分
  5. ucTemp4=ucMinute%10;
  6. ucDigShow5=ucTemp5; //数码管显示实际内容
  7. ucDigShow4=ucTemp4;
  8. }
  9. if(ucWd2Part3Update==1) //局部秒更新显示
  10. {
  11. ucWd2Part3Update=0;
  12. ucTemp2=ucSecond/10;//秒
  13. ucTemp1=ucSecond%10;
  14. ucDigShow2=ucTemp2; //数码管显示实际内容
  15. ucDigShow1=ucTemp1;
  16. }
  17. //数码管闪烁
  18. switch(ucPart)//相当于二级菜单,根据局部变量的值,使对应的参数产生闪烁的动态效果。
  19. {
  20. case 0://都不闪烁
  21. break;
  22. case 1://时参数闪烁
  23. if(uiDpyTimeCnt==const_dpy_time_half)
  24. {
  25. ucDigShow8=ucTemp8; //数码管显示实际内容
  26. ucDigShow7=ucTemp7;
  27. }
  28. else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  29. {
  30. ucDpyTimeLock=1; //原子锁加锁
  31. uiDpyTimeCnt=0; //及时把闪烁记时器清零
  32. ucDpyTimeLock=0;//原子锁解锁
  33. ucDigShow8=10; //数码管显示空,什么都不显示
  34. ucDigShow7=10;
  35. }
  36. break;
  37. case 2: //分参数闪烁
  38. if(uiDpyTimeCnt==const_dpy_time_half)
  39. {
  40. ucDigShow5=ucTemp5; //数码管显示实际内容
  41. ucDigShow4=ucTemp4;
  42. }
  43. else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  44. {
  45. ucDpyTimeLock=1; //原子锁加锁
  46. uiDpyTimeCnt=0; //及时把闪烁记时器清零
  47. ucDpyTimeLock=0;//原子锁解锁
  48. ucDigShow5=10; //数码管显示空,什么都不显示
  49. ucDigShow4=10;
  50. }
  51. break;
  52. case 3: //秒参数闪烁
  53. if(uiDpyTimeCnt==const_dpy_time_half)
  54. {
  55. ucDigShow2=ucTemp2; //数码管显示实际内容
  56. ucDigShow1=ucTemp1;
  57. }
  58. else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  59. {
  60. ucDpyTimeLock=1; //原子锁加锁
  61. uiDpyTimeCnt=0; //及时把闪烁记时器清零
  62. ucDpyTimeLock=0;//原子锁解锁
  63. ucDigShow2=10; //数码管显示空,什么都不显示
  64. ucDigShow1=10;
  65. }
  66. break;
  67. }
  68. break;
  69. }
  70. }
  71. void key_scan(void)//按键扫描函数 放在定时中断里
  72. {
  73. if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  74. {
  75. ucKeyLock1=0; //按键自锁标志清零
  76. uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  77. }
  78. else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
  79. {
  80. uiKeyTimeCnt1++; //累加定时中断次数
  81. if(uiKeyTimeCnt1>const_key_time1)
  82. {
  83. uiKeyTimeCnt1=0;
  84. ucKeyLock1=1;//自锁按键置位,避免一直触发
  85. ucKeySec=1; //触发1号键
  86. }
  87. }
  88. if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  89. {
  90. ucKeyLock2=0; //按键自锁标志清零
  91. uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  92. }
  93. else if(ucKeyLock2==0)//有按键按下,且是第一次被按下
  94. {
  95. uiKeyTimeCnt2++; //累加定时中断次数
  96. if(uiKeyTimeCnt2>const_key_time2)
  97. {
  98. uiKeyTimeCnt2=0;
  99. ucKeyLock2=1;//自锁按键置位,避免一直触发
  100. ucKeySec=2; //触发2号键
  101. }
  102. }
  103. /* 注释四:
  104. * 注意,此处把一个按键的短按和长按的功能都实现了。
  105. */
  106. if(key_sr3==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  107. {
  108. ucKeyLock3=0; //按键自锁标志清零
  109. uiKeyTimeCnt3=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  110. }
  111. else if(ucKeyLock3==0)//有按键按下,且是第一次被按下
  112. {
  113. uiKeyTimeCnt3++; //累加定时中断次数
  114. if(uiKeyTimeCnt3>const_key_time3)
  115. {
  116. uiKeyTimeCnt3=0;
  117. ucKeyLock3=1;//自锁按键置位,避免一直触发
  118. ucKeySec=3; //短按触发3号键
  119. }
  120. }
  121. else if(uiKeyTimeCnt3
  122. {
  123. uiKeyTimeCnt3++; //累加定时中断次数
  124. if(uiKeyTimeCnt3==const_key_time17)//等于3秒钟,触发17号长按按键
  125. {
  126. ucKeySec=17; //长按3秒触发17号键
  127. }
  128. }
  129. /* 注释五:
  130. * 注意,此处是电平按键的滤波抗干扰处理
  131. */
  132. if(key_sr4==1)//对应朱兆祺学习板的S13键
  133. {
  134. uiKey

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top