微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第36节:带数码管显示的加法简易计算器

第36节:带数码管显示的加法简易计算器

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

  1. igShowTemp=dig_table[ucDigShow1];
  2. dig_hc595_drive(ucDigShowTemp,0xfe);
  3. break;
  4. case 2://显示第2位
  5. ucDigShowTemp=dig_table[ucDigShow2];
  6. dig_hc595_drive(ucDigShowTemp,0xfd);
  7. break;
  8. case 3://显示第3位
  9. ucDigShowTemp=dig_table[ucDigShow3];
  10. dig_hc595_drive(ucDigShowTemp,0xfb);
  11. break;
  12. case 4://显示第4位
  13. ucDigShowTemp=dig_table[ucDigShow4];
  14. dig_hc595_drive(ucDigShowTemp,0xf7);
  15. break;
  16. case 5://显示第5位
  17. ucDigShowTemp=dig_table[ucDigShow5];
  18. dig_hc595_drive(ucDigShowTemp,0xef);
  19. break;
  20. case 6://显示第6位
  21. ucDigShowTemp=dig_table[ucDigShow6];
  22. dig_hc595_drive(ucDigShowTemp,0xdf);
  23. break;
  24. case 7://显示第7位
  25. ucDigShowTemp=dig_table[ucDigShow7];
  26. dig_hc595_drive(ucDigShowTemp,0xbf);
  27. break;
  28. case 8://显示第8位
  29. ucDigShowTemp=dig_table[ucDigShow8];
  30. dig_hc595_drive(ucDigShowTemp,0x7f);
  31. break;
  32. }
  33. ucDisplayDriveStep++;
  34. if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描
  35. {
  36. ucDisplayDriveStep=1;
  37. }
  38. }
  39. //数码管的74HC595驱动函数
  40. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
  41. {
  42. unsigned char i;
  43. unsigned char ucTempData;
  44. dig_hc595_sh_dr=0;
  45. dig_hc595_st_dr=0;
  46. ucTempData=ucDigStatusTemp16_09;//先送高8位
  47. for(i=0;i<8;i++)
  48. {
  49. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  50. else dig_hc595_ds_dr=0;
  51. /* 注释二:
  52. *注意,此处的延时delay_short必须尽可能小,否则动态扫描数码管的速度就不够。
  53. */
  54. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  55. delay_short(1);
  56. dig_hc595_sh_dr=1;
  57. delay_short(1);
  58. ucTempData=ucTempData<1;
  59. }
  60. ucTempData=ucDigStatusTemp08_01;//再先送低8位
  61. for(i=0;i<8;i++)
  62. {
  63. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  64. else dig_hc595_ds_dr=0;
  65. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  66. delay_short(1);
  67. dig_hc595_sh_dr=1;
  68. delay_short(1);
  69. ucTempData=ucTempData<1;
  70. }
  71. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  72. delay_short(1);
  73. dig_hc595_st_dr=1;
  74. delay_short(1);
  75. dig_hc595_sh_dr=0; //拉低,抗干扰就增强
  76. dig_hc595_st_dr=0;
  77. dig_hc595_ds_dr=0;
  78. }
  79. //LED灯的74HC595驱动函数
  80. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
  81. {
  82. unsigned char i;
  83. unsigned char ucTempData;
  84. hc595_sh_dr=0;
  85. hc595_st_dr=0;
  86. ucTempData=ucLedStatusTemp16_09;//先送高8位
  87. for(i=0;i<8;i++)
  88. {
  89. if(ucTempData>=0x80)hc595_ds_dr=1;
  90. else hc595_ds_dr=0;
  91. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  92. delay_short(1);
  93. hc595_sh_dr=1;
  94. delay_short(1);
  95. ucTempData=ucTempData<1;
  96. }
  97. ucTempData=ucLedStatusTemp08_01;//再先送低8位
  98. for(i=0;i<8;i++)
  99. {
  100. if(ucTempData>=0x80)hc595_ds_dr=1;
  101. else hc595_ds_dr=0;
  102. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  103. delay_short(1);
  104. hc595_sh_dr=1;
  105. delay_short(1);
  106. ucTempData=ucTempData<1;
  107. }
  108. hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  109. delay_short(1);
  110. hc595_st_dr=1;
  111. delay_short(1);
  112. hc595_sh_dr=0; //拉低,抗干扰就增强
  113. hc595_st_dr=0;
  114. hc595_ds_dr=0;
  115. }
  116. void key_scan()//按键扫描函数 放在定时中断里
  117. {
  118. switch(ucKeyStep)
  119. {
  120. case 1: //按键扫描输出第ucRowRecord列低电平
  121. if(ucRowRecord==1)//第一列输出低电平
  122. {
  123. key_dr1=0;
  124. key_dr2=1;
  125. key_dr3=1;
  126. key_dr4=1;
  127. }
  128. else if(ucRowRecord==2)//第二列输出低电平
  129. {
  130. key_dr1=1;
  131. key_dr2=0;
  132. key_dr3=1;
  133. key_dr4=1;
  134. }
  135. else if(ucRowRecord==3)//第三列输出低电平
  136. {
  137. key_dr1=1;
  138. key_dr2=1;
  139. key_dr3=0;
  140. key_dr4=1;
  141. }
  142. else //第四列输出低电平
  143. {
  144. key_dr1=1;
  145. key_dr2=1;
  146. key_dr3=1;
  147. key_dr4=0;
  148. }
  149. uiKeyTimeCnt=0;//延时计数器清零
  150. ucKeyStep++; //切换到下一个运行步骤
  151. break;
  152. case 2: //此处的小延时用来等待刚才列输出信号稳定,再判断输入信号。不是去抖动延时。

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

网站地图

Top