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

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

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

  1. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  2. delay_short(1);
  3. dig_hc595_sh_dr=1;
  4. delay_short(1);
  5. ucTempData=ucTempData<1;
  6. }
  7. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  8. delay_short(1);
  9. dig_hc595_st_dr=1;
  10. delay_short(1);
  11. dig_hc595_sh_dr=0; //拉低,抗干扰就增强
  12. dig_hc595_st_dr=0;
  13. dig_hc595_ds_dr=0;
  14. }
  15. //LED灯的74HC595驱动函数
  16. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
  17. {
  18. unsigned char i;
  19. unsigned char ucTempData;
  20. hc595_sh_dr=0;
  21. hc595_st_dr=0;
  22. ucTempData=ucLedStatusTemp16_09;//先送高8位
  23. for(i=0;i<8;i++)
  24. {
  25. if(ucTempData>=0x80)hc595_ds_dr=1;
  26. else hc595_ds_dr=0;
  27. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  28. delay_short(1);
  29. hc595_sh_dr=1;
  30. delay_short(1);
  31. ucTempData=ucTempData<1;
  32. }
  33. ucTempData=ucLedStatusTemp08_01;//再先送低8位
  34. for(i=0;i<8;i++)
  35. {
  36. if(ucTempData>=0x80)hc595_ds_dr=1;
  37. else hc595_ds_dr=0;
  38. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  39. delay_short(1);
  40. hc595_sh_dr=1;
  41. delay_short(1);
  42. ucTempData=ucTempData<1;
  43. }
  44. hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  45. delay_short(1);
  46. hc595_st_dr=1;
  47. delay_short(1);
  48. hc595_sh_dr=0; //拉低,抗干扰就增强
  49. hc595_st_dr=0;
  50. hc595_ds_dr=0;
  51. }
  52. void key_scan()//按键扫描函数 放在定时中断里
  53. {
  54. switch(ucKeyStep)
  55. {
  56. case 1: //按键扫描输出第ucRowRecord列低电平
  57. if(ucRowRecord==1)//第一列输出低电平
  58. {
  59. key_dr1=0;
  60. key_dr2=1;
  61. key_dr3=1;
  62. key_dr4=1;
  63. }
  64. else if(ucRowRecord==2)//第二列输出低电平
  65. {
  66. key_dr1=1;
  67. key_dr2=0;
  68. key_dr3=1;
  69. key_dr4=1;
  70. }
  71. else if(ucRowRecord==3)//第三列输出低电平
  72. {
  73. key_dr1=1;
  74. key_dr2=1;
  75. key_dr3=0;
  76. key_dr4=1;
  77. }
  78. else //第四列输出低电平
  79. {
  80. key_dr1=1;
  81. key_dr2=1;
  82. key_dr3=1;
  83. key_dr4=0;
  84. }
  85. uiKeyTimeCnt=0;//延时计数器清零
  86. ucKeyStep++; //切换到下一个运行步骤
  87. break;
  88. case 2: //此处的小延时用来等待刚才列输出信号稳定,再判断输入信号。不是去抖动延时。
  89. uiKeyTimeCnt++;
  90. if(uiKeyTimeCnt>1)
  91. {
  92. uiKeyTimeCnt=0;
  93. ucKeyStep++; //切换到下一个运行步骤
  94. }
  95. break;
  96. case 3:
  97. if(key_sr1==1&&key_sr2==1&&key_sr3==1&&key_sr4==1)
  98. {
  99. ucKeyStep=1;//如果没有按键按下,返回到第一个运行步骤重新开始扫描
  100. ucKeyLock=0;//按键自锁标志清零
  101. uiKeyTimeCnt=0; //按键去抖动延时计数器清零,此行非常巧妙
  102. ucRowRecord++;//输出下一列
  103. if(ucRowRecord>4)
  104. {
  105. ucRowRecord=1; //依次输出完四列之后,继续从第一列开始输出低电平
  106. }
  107. }
  108. else if(ucKeyLock==0)//有按键按下,且是第一次触发
  109. {
  110. if(key_sr1==0&&key_sr2==1&&key_sr3==1&&key_sr4==1)
  111. {
  112. uiKeyTimeCnt++;//去抖动延时计数器
  113. if(uiKeyTimeCnt>const_key_time)
  114. {
  115. uiKeyTimeCnt=0;
  116. ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零
  117. if(ucRowRecord==1)//第一列输出低电平
  118. {
  119. ucKeySec=1;//触发1号键 对应朱兆祺学习板的S1键
  120. }
  121. else if(ucRowRecord==2)//第二列输出低电平
  122. {
  123. ucKeySec=2;//触发2号键 对应朱兆祺学习板的S2键
  124. }
  125. else if(ucRowRecord==3)//第三列输出低电平
  126. {
  127. ucKeySec=3;//触发3号键 对应朱兆祺学习板的S3键
  128. }
  129. else //第四列输出低电平
  130. {
  131. ucKeySec=4;//触发4号键 对应朱兆祺学习板的S4键
  132. }
  133. }
  134. }
  135. else if(key_sr1==1&&key_sr2==0&&key_sr3==1&&key_sr4==1)
  136. {
  137. uiKeyTimeCnt++;//去抖动延时计数器
  138. if(uiKeyTimeCnt>const_key_time)
  139. {
  140. uiKeyTimeCnt=0;
  141. ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零

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

网站地图

Top