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

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

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

  1. ned char ucDigShow6=0;//第6位数码管要显示的内容
  2. unsigned char ucDigShow5=0;//第5位数码管要显示的内容
  3. unsigned char ucDigShow4=0;//第4位数码管要显示的内容
  4. unsigned char ucDigShow3=0;//第3位数码管要显示的内容
  5. unsigned char ucDigShow2=0;//第2位数码管要显示的内容
  6. unsigned char ucDigShow1=0;//第1位数码管要显示的内容
  7. unsigned char ucDigDot3=1;//数码管3的小数点是否显示的标志
  8. unsigned char ucDigDot7=1;//数码管7的小数点是否显示的标志
  9. unsigned char ucDigShowTemp=0; //临时中间变量
  10. unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
  11. unsigned int uiRedTimeCnt=0; //红棋产生秒基准的时间计时器
  12. unsigned int uiBlackTimeCnt=0;//黑棋产生秒基准的时间计时器
  13. unsigned int uiRedTotal=1200; //红棋的总时间
  14. unsigned int uiBlackTotal=1200;//黑棋的总时间
  15. unsigned char ucRedFlag=0;//红棋是否开始计时的标志
  16. unsigned char ucBlackFlag=0;//黑棋是否开始计时的标志
  17. unsigned char ucDisplayUpdate=1; //更新显示标志
  18. /* 注释一:
  19. *ucWd变量是本程序最核心的变量,代表显示哪一个窗口和系统处于当前哪种状态
  20. */
  21. unsigned char ucWd=1;
  22. code unsigned char dig_table[]=
  23. {
  24. 0x3f,//0 序号0
  25. 0x06,//1 序号1
  26. 0x5b,//2 序号2
  27. 0x4f,//3 序号3
  28. 0x66,//4 序号4
  29. 0x6d,//5 序号5
  30. 0x7d,//6 序号6
  31. 0x07,//7 序号7
  32. 0x7f,//8 序号8
  33. 0x6f,//9 序号9
  34. 0x00,//不显示序号10
  35. };
  36. void main()
  37. {
  38. initial_myself();
  39. delay_long(100);
  40. initial_peripheral();
  41. while(1)
  42. {
  43. key_service();
  44. display_service();
  45. }
  46. }
  47. void time_service()//放在定时中断里的时间应用程序
  48. {
  49. if(ucRedFlag==1)//1代表红棋在运行中
  50. {
  51. uiRedTimeCnt++;
  52. if(uiRedTimeCnt>const_1s)
  53. {
  54. uiRedTimeCnt=0;
  55. if(uiRedTotal>0)
  56. {
  57. uiRedTotal--;
  58. }
  59. else//时间到
  60. {
  61. ucRedFlag=0; //红棋和黑棋同时停止计时
  62. ucBlackFlag=0;
  63. ucWd=1;//切换到第一个窗口的状态
  64. uiVoiceCnt=const_voice_long; //报警声音触发
  65. }
  66. ucDisplayUpdate=1;//更新显示
  67. }
  68. }
  69. if(ucBlackFlag==1)//1代表黑棋在运行中
  70. {
  71. uiBlackTimeCnt++;
  72. if(uiBlackTimeCnt>const_1s)
  73. {
  74. uiBlackTimeCnt=0;
  75. if(uiBlackTotal>0)
  76. {
  77. uiBlackTotal--;
  78. }
  79. else//时间到
  80. {
  81. ucRedFlag=0;//红棋和黑棋同时停止计时
  82. ucBlackFlag=0;
  83. ucWd=1;//切换到第一个窗口的状态
  84. uiVoiceCnt=const_voice_long; //报警声音触发
  85. }
  86. ucDisplayUpdate=1;//更新显示
  87. }
  88. }
  89. }
  90. void display_service()//放在定时中断里的显示应用程序
  91. {
  92. if(ucDisplayUpdate==1)//有数据更新显示
  93. {
  94. ucDisplayUpdate=0;
  95. switch(ucWd) //本程序最核心的变量ucWd
  96. {
  97. case 1://窗口1,代表刚上电或者复位后的状态
  98. //红棋分解出分
  99. ucDigShowTemp=uiRedTotal/60;
  100. ucDigShow8=ucDigShowTemp/10;
  101. ucDigShow7=ucDigShowTemp%10;
  102. //红棋分解出秒
  103. ucDigShowTemp=uiRedTotal%60;
  104. ucDigShow6=ucDigShowTemp/10;
  105. ucDigShow5=ucDigShowTemp%10;
  106. ucDigDot7=1;//数码管7的小数点显示
  107. //黑棋分解出分
  108. ucDigShowTemp=uiBlackTotal/60;
  109. ucDigShow4=ucDigShowTemp/10;
  110. ucDigShow3=ucDigShowTemp%10;
  111. //黑棋分解出秒
  112. ucDigShowTemp=uiBlackTotal%60;
  113. ucDigShow2=ucDigShowTemp/10;
  114. ucDigShow1=ucDigShowTemp%10;
  115. ucDigDot3=1;//数码管3的小数点显示
  116. led_dr=1;//计时器处于停止状态,LED亮
  117. break;
  118. case 2://窗口2,代表黑棋正在运行中的状态
  119. //红棋全部不显示
  120. ucDigShow8=10;
  121. ucDigShow7=10;
  122. ucDigShow6=10;
  123. ucDigShow5=10;
  124. ucDigDot7=0;//数码管7的小数点不显示
  125. //黑棋分解出分
  126. ucDigShowTemp=uiBlackTotal/60;
  127. ucDigShow4=ucDigShowTemp/10;
  128. ucDigShow3=ucDigShowTemp%10;
  129. //黑棋分解出秒
  130. ucDigShowTemp=uiBlackTotal%60;
  131. ucDigShow2=ucDigShowTemp/10;
  132. ucDigShow1=ucDigShowTemp%10;
  133. ucDigDot3=1;//数码管3的小数点显示
  134. led_dr=0;//计时器处于计时状态,LED灭
  135. break;
  136. case 3://窗口3,代表黑棋在中途暂

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

网站地图

Top