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

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

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

  1. 的共享变量uiVoiceCnt
  2. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  3. break;
  4. case 3://短按设置按键 对应朱兆祺学习板的S9键
  5. switch(ucWd)//在不同的窗口下,设置不同的参数
  6. {
  7. case 1:
  8. ucPart++;
  9. if(ucPart>3)
  10. {
  11. ucPart=1;
  12. ucWd=2; //切换到第二个窗口,设置时分秒
  13. ucWd2Update=1;//窗口2更新显示
  14. }
  15. ucWd1Update=1;//窗口1更新显示
  16. break;
  17. case 2:
  18. if(ucPart>0) //在窗口2的时候,要第一次激活设置时间,必须是长按3秒才可以,这里短按激活不了第一次
  19. {
  20. ucPart++;
  21. if(ucPart>3)//设置时间结束
  22. {
  23. ucPart=0;
  24. /* 注释六:
  25. * 每个月份的天数最大值是不一样的,在写入ds1302时钟芯片内部数据前,应该做一次调整。
  26. * 有的月份最大28天,有的月份最大29天,有的月份最大30天,有的月份最大31天,
  27. */
  28. ucDate=date_adjust(ucYear,ucMonth,ucDate); //日调整 避免日的数值在某个月份超范围
  29. ucTimerStart=0;//关闭定时器的时间。在更改定时器内部时间数据时,先关闭它,相当于原子锁的加锁作用。
  30. ucTimerYear=ucYear;//把设置和显示的数据更改到定时器内部的时间变量
  31. ucTimerMonth=ucMonth;
  32. ucTimerDate=ucDate;
  33. ucTimerHour=ucHour;
  34. ucTimerMinute=ucMinute;
  35. ucTimerSecond=ucSecond;
  36. ucTimerStart=1;//打开定时器的时间。在更改定时器内部时间数据后,再打开它,相当于原子锁的解锁作用。
  37. }
  38. ucWd2Update=1;//窗口2更新显示
  39. }
  40. break;
  41. }
  42. ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
  43. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  44. ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
  45. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  46. break;
  47. case 17://长按3秒设置按键 对应朱兆祺学习板的S9键
  48. switch(ucWd)//在不同的窗口下,设置不同的参数
  49. {
  50. case 2:
  51. if(ucPart==0) //处于非设置时间的状态下,要第一次激活设置时间,必须是长按3秒才可以
  52. {
  53. ucWd=1;
  54. ucPart=1;//进入到设置日期的状态下
  55. ucWd1Update=1;//窗口1更新显示
  56. }
  57. break;
  58. }
  59. ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
  60. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  61. ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
  62. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  63. break;
  64. }
  65. /* 注释七:
  66. * 注意,此处就是第一次出现的电平按键程序,跟以往的下降沿按键不一样。
  67. * ucKey4Sr是经过软件滤波处理后,直接反应IO口电平状态的变量.当电平发生
  68. * 变化时,就会切换到不同的显示界面,这里多用了一个ucKey4SrRecord变量
  69. * 记录上一次的电平状态,是为了避免一直刷新显示。
  70. */
  71. if(ucKey4Sr!=ucKey4SrRecord)//说明S13的切换按键电平状态发生变化
  72. {
  73. ucKey4SrRecord=ucKey4Sr;//及时记录当前最新的按键电平状态避免一直进来触发
  74. if(ucKey4Sr==1) //松手后切换到显示时间的窗口
  75. {
  76. ucWd=2; //显示时分秒的窗口
  77. ucPart=0;//进入到非设置时间的状态下
  78. ucWd2Update=1;//窗口2更新显示
  79. }
  80. else//按下去切换到显示日期的窗口
  81. {
  82. ucWd=1; //显示年月日的窗口
  83. ucPart=0;//进入到非设置时间的状态下
  84. ucWd1Update=1;//窗口1更新显示
  85. }
  86. }
  87. }
  88. void display_drive(void)
  89. {
  90. //以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路
  91. switch(ucDisplayDriveStep)
  92. {
  93. case 1://显示第1位
  94. ucDigShowTemp=dig_table[ucDigShow1];
  95. if(ucDigDot1==1)
  96. {
  97. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  98. }
  99. dig_hc595_drive(ucDigShowTemp,0xfe);
  100. break;
  101. case 2://显示第2位
  102. ucDigShowTemp=dig_table[ucDigShow2];
  103. if(ucDigDot2==1)
  104. {
  105. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  106. }
  107. dig_hc595_drive(ucDigShowTemp,0xfd);
  108. break;
  109. case 3://显示第3位
  110. ucDigShowTemp=dig_tabl

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

网站地图

Top