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

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

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

  1. e[ucDigShow3];
  2. if(ucDigDot3==1)
  3. {
  4. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  5. }
  6. dig_hc595_drive(ucDigShowTemp,0xfb);
  7. break;
  8. case 4://显示第4位
  9. ucDigShowTemp=dig_table[ucDigShow4];
  10. if(ucDigDot4==1)
  11. {
  12. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  13. }
  14. dig_hc595_drive(ucDigShowTemp,0xf7);
  15. break;
  16. case 5://显示第5位
  17. ucDigShowTemp=dig_table[ucDigShow5];
  18. if(ucDigDot5==1)
  19. {
  20. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  21. }
  22. dig_hc595_drive(ucDigShowTemp,0xef);
  23. break;
  24. case 6://显示第6位
  25. ucDigShowTemp=dig_table[ucDigShow6];
  26. if(ucDigDot6==1)
  27. {
  28. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  29. }
  30. dig_hc595_drive(ucDigShowTemp,0xdf);
  31. break;
  32. case 7://显示第7位
  33. ucDigShowTemp=dig_table[ucDigShow7];
  34. if(ucDigDot7==1)
  35. {
  36. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  37. }
  38. dig_hc595_drive(ucDigShowTemp,0xbf);
  39. break;
  40. case 8://显示第8位
  41. ucDigShowTemp=dig_table[ucDigShow8];
  42. if(ucDigDot8==1)
  43. {
  44. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  45. }
  46. dig_hc595_drive(ucDigShowTemp,0x7f);
  47. break;
  48. }
  49. ucDisplayDriveStep++;
  50. if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描
  51. {
  52. ucDisplayDriveStep=1;
  53. }
  54. }
  55. //数码管的74HC595驱动函数
  56. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
  57. {
  58. unsigned char i;
  59. unsigned char ucTempData;
  60. dig_hc595_sh_dr=0;
  61. dig_hc595_st_dr=0;
  62. ucTempData=ucDigStatusTemp16_09;//先送高8位
  63. for(i=0;i<8;i++)
  64. {
  65. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  66. else dig_hc595_ds_dr=0;
  67. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  68. delay_short(1);
  69. dig_hc595_sh_dr=1;
  70. delay_short(1);
  71. ucTempData=ucTempData<1;
  72. }
  73. ucTempData=ucDigStatusTemp08_01;//再先送低8位
  74. for(i=0;i<8;i++)
  75. {
  76. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  77. else dig_hc595_ds_dr=0;
  78. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  79. delay_short(1);
  80. dig_hc595_sh_dr=1;
  81. delay_short(1);
  82. ucTempData=ucTempData<1;
  83. }
  84. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  85. delay_short(1);
  86. dig_hc595_st_dr=1;
  87. delay_short(1);
  88. dig_hc595_sh_dr=0; //拉低,抗干扰就增强
  89. dig_hc595_st_dr=0;
  90. dig_hc595_ds_dr=0;
  91. }
  92. //LED灯的74HC595驱动函数
  93. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
  94. {
  95. unsigned char i;
  96. unsigned char ucTempData;
  97. hc595_sh_dr=0;
  98. hc595_st_dr=0;
  99. ucTempData=ucLedStatusTemp16_09;//先送高8位
  100. for(i=0;i<8;i++)
  101. {
  102. if(ucTempData>=0x80)hc595_ds_dr=1;
  103. else hc595_ds_dr=0;
  104. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  105. delay_short(1);
  106. hc595_sh_dr=1;
  107. delay_short(1);
  108. ucTempData=ucTempData<1;
  109. }
  110. ucTempData=ucLedStatusTemp08_01;//再先送低8位
  111. for(i=0;i<8;i++)
  112. {
  113. if(ucTempData>=0x80)hc595_ds_dr=1;
  114. else hc595_ds_dr=0;
  115. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  116. delay_short(1);
  117. hc595_sh_dr=1;
  118. delay_short(1);
  119. ucTempData=ucTempData<1;
  120. }
  121. hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  122. delay_short(1);
  123. hc595_st_dr=1;
  124. delay_short(1);
  125. hc595_sh_dr=0; //拉低,抗干扰就增强
  126. hc595_st_dr=0;
  127. hc595_ds_dr=0;
  128. }
  129. void T0_time(void) interrupt 1 //定时中断
  130. {
  131. TF0=0;//清除中断标志
  132. TR0=0; //关中断
  133. /* 注释八:
  134. * 以下是本节内容的核心程序,是定时器内部产生的时间。const_timer_1s这个是产生多少次定时中断才
  135. * 算1秒钟的标准。这个标准决定了时钟的精度。这个标准最后是需要校验的。
  136. */
  137. if(ucTimerStart==1)//定时器的时间已经打开
  138. {
  139. uiTimerCnt++;//产生1秒钟的时基
  140. if(uiTimerCnt>=const_timer_1s) //一秒钟的时间到。这个const_timer_1s具体数值最后需要校验得出。
  141. {
  142. uiTimerCnt=0; //清零为产生下一个1秒钟准备
  143. ucTimerUpdate=1; //定时器每1秒钟所产生的标志,通

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

网站地图

Top