微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第35节:带数码管显示的象棋比赛专用计时器

第35节:带数码管显示的象棋比赛专用计时器

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

  1. 停的状态
  2. //红棋全部不显示
  3. ucDigShow8=10;
  4. ucDigShow7=10;
  5. ucDigShow6=10;
  6. ucDigShow5=10;
  7. ucDigDot7=0;//数码管7的小数点不显示
  8. //黑棋分解出分
  9. ucDigShowTemp=uiBlackTotal/60;
  10. ucDigShow4=ucDigShowTemp/10;
  11. ucDigShow3=ucDigShowTemp%10;
  12. //黑棋分解出秒
  13. ucDigShowTemp=uiBlackTotal%60;
  14. ucDigShow2=ucDigShowTemp/10;
  15. ucDigShow1=ucDigShowTemp%10;
  16. ucDigDot3=1;//数码管3的小数点显示
  17. led_dr=1;//计时器处于暂停状态,LED亮
  18. break;
  19. case 4://窗口4,代表红棋正在运行中的状态
  20. //红棋分解出分
  21. ucDigShowTemp=uiRedTotal/60;
  22. ucDigShow8=ucDigShowTemp/10;
  23. ucDigShow7=ucDigShowTemp%10;
  24. //红棋分解出秒
  25. ucDigShowTemp=uiRedTotal%60;
  26. ucDigShow6=ucDigShowTemp/10;
  27. ucDigShow5=ucDigShowTemp%10;
  28. ucDigDot7=1;//数码管7的小数点显示
  29. //黑棋全部不显示
  30. ucDigShow4=10;
  31. ucDigShow3=10;
  32. ucDigShow2=10;
  33. ucDigShow1=10;
  34. ucDigDot3=0;//数码管3的小数点不显示
  35. led_dr=0;//计时器处于倒计时状态,LED灭
  36. break;
  37. case 5://窗口5,代表红棋在中途暂停的状态
  38. //红棋分解出分
  39. ucDigShowTemp=uiRedTotal/60;
  40. ucDigShow8=ucDigShowTemp/10;
  41. ucDigShow7=ucDigShowTemp%10;
  42. //红棋分解出秒
  43. ucDigShowTemp=uiRedTotal%60;
  44. ucDigShow6=ucDigShowTemp/10;
  45. ucDigShow5=ucDigShowTemp%10;
  46. ucDigDot7=1;//数码管7的小数点显示
  47. //黑棋全部不显示
  48. ucDigShow4=10;
  49. ucDigShow3=10;
  50. ucDigShow2=10;
  51. ucDigShow1=10;
  52. ucDigDot3=0;//数码管3的小数点不显示
  53. led_dr=1;//计时器处于暂停状态,LED亮
  54. break;
  55. }
  56. }
  57. }
  58. void display_drive()//放在定时中断里的数码管驱动函数
  59. {
  60. //以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路
  61. switch(ucDisplayDriveStep)
  62. {
  63. case 1://显示第1位
  64. ucDigShowTemp=dig_table[ucDigShow1];
  65. dig_hc595_drive(ucDigShowTemp,0xfe);
  66. break;
  67. case 2://显示第2位
  68. ucDigShowTemp=dig_table[ucDigShow2];
  69. dig_hc595_drive(ucDigShowTemp,0xfd);
  70. break;
  71. case 3://显示第3位
  72. ucDigShowTemp=dig_table[ucDigShow3];
  73. if(ucDigDot3==1)
  74. {
  75. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  76. }
  77. dig_hc595_drive(ucDigShowTemp,0xfb);
  78. break;
  79. case 4://显示第4位
  80. ucDigShowTemp=dig_table[ucDigShow4];
  81. dig_hc595_drive(ucDigShowTemp,0xf7);
  82. break;
  83. case 5://显示第5位
  84. ucDigShowTemp=dig_table[ucDigShow5];
  85. dig_hc595_drive(ucDigShowTemp,0xef);
  86. break;
  87. case 6://显示第6位
  88. ucDigShowTemp=dig_table[ucDigShow6];
  89. dig_hc595_drive(ucDigShowTemp,0xdf);
  90. break;
  91. case 7://显示第7位
  92. ucDigShowTemp=dig_table[ucDigShow7];
  93. if(ucDigDot7==1)
  94. {
  95. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  96. }
  97. dig_hc595_drive(ucDigShowTemp,0xbf);
  98. break;
  99. case 8://显示第8位
  100. ucDigShowTemp=dig_table[ucDigShow8];
  101. dig_hc595_drive(ucDigShowTemp,0x7f);
  102. break;
  103. }
  104. ucDisplayDriveStep++;
  105. if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描
  106. {
  107. ucDisplayDriveStep=1;
  108. }
  109. }
  110. //数码管的74HC595驱动函数
  111. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
  112. {
  113. unsigned char i;
  114. unsigned char ucTempData;
  115. dig_hc595_sh_dr=0;
  116. dig_hc595_st_dr=0;
  117. ucTempData=ucDigStatusTemp16_09;//先送高8位
  118. for(i=0;i<8;i++)
  119. {
  120. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  121. else dig_hc595_ds_dr=0;
  122. /* 注释二:
  123. *注意,此处的延时delay_short必须尽可能小,否则动态扫描数码管的速度就不够。
  124. */
  125. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  126. delay_short(1);
  127. dig_hc595_sh_dr=1;
  128. delay_short(1);
  129. ucTempData=ucTempData<1;
  130. }
  131. ucTempData=ucDigStatusTemp08_01;//再先送低8位
  132. for(i=0;i<8;i++)
  133. {
  134. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  135. else dig_hc595_ds_dr=0;

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

网站地图

Top