微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第37节:数码管作为仪表盘显示跑马灯的方向,速度和状态

第37节:数码管作为仪表盘显示跑马灯的方向,速度和状态

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

  1. (ucDigShowTemp,0xef);
  2. break;
  3. case 6://显示第6位
  4. ucDigShowTemp=dig_table[ucDigShow6];
  5. if(ucDigDot6==1)
  6. {
  7. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  8. }
  9. dig_hc595_drive(ucDigShowTemp,0xdf);
  10. break;
  11. case 7://显示第7位
  12. ucDigShowTemp=dig_table[ucDigShow7];
  13. if(ucDigDot7==1)
  14. {
  15. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  16. }
  17. dig_hc595_drive(ucDigShowTemp,0xbf);
  18. break;
  19. case 8://显示第8位
  20. ucDigShowTemp=dig_table[ucDigShow8];
  21. if(ucDigDot8==1)
  22. {
  23. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  24. }
  25. dig_hc595_drive(ucDigShowTemp,0x7f);
  26. break;
  27. }
  28. ucDisplayDriveStep++;
  29. if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描
  30. {
  31. ucDisplayDriveStep=1;
  32. }
  33. }
  34. //数码管的74HC595驱动函数
  35. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
  36. {
  37. unsigned char i;
  38. unsigned char ucTempData;
  39. dig_hc595_sh_dr=0;
  40. dig_hc595_st_dr=0;
  41. ucTempData=ucDigStatusTemp16_09;//先送高8位
  42. for(i=0;i<8;i++)
  43. {
  44. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  45. else dig_hc595_ds_dr=0;
  46. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  47. delay_short(1);
  48. dig_hc595_sh_dr=1;
  49. delay_short(1);
  50. ucTempData=ucTempData<1;
  51. }
  52. ucTempData=ucDigStatusTemp08_01;//再先送低8位
  53. for(i=0;i<8;i++)
  54. {
  55. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  56. else dig_hc595_ds_dr=0;
  57. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  58. delay_short(1);
  59. dig_hc595_sh_dr=1;
  60. delay_short(1);
  61. ucTempData=ucTempData<1;
  62. }
  63. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  64. delay_short(1);
  65. dig_hc595_st_dr=1;
  66. delay_short(1);
  67. dig_hc595_sh_dr=0; //拉低,抗干扰就增强
  68. dig_hc595_st_dr=0;
  69. dig_hc595_ds_dr=0;
  70. }
  71. //LED灯的74HC595驱动函数
  72. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
  73. {
  74. unsigned char i;
  75. unsigned char ucTempData;
  76. hc595_sh_dr=0;
  77. hc595_st_dr=0;
  78. ucTempData=ucLedStatusTemp16_09;//先送高8位
  79. for(i=0;i<8;i++)
  80. {
  81. if(ucTempData>=0x80)hc595_ds_dr=1;
  82. else hc595_ds_dr=0;
  83. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  84. delay_short(1);
  85. hc595_sh_dr=1;
  86. delay_short(1);
  87. ucTempData=ucTempData<1;
  88. }
  89. ucTempData=ucLedStatusTemp08_01;//再先送低8位
  90. for(i=0;i<8;i++)
  91. {
  92. if(ucTempData>=0x80)hc595_ds_dr=1;
  93. else hc595_ds_dr=0;
  94. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  95. delay_short(1);
  96. hc595_sh_dr=1;
  97. delay_short(1);
  98. ucTempData=ucTempData<1;
  99. }
  100. hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  101. delay_short(1);
  102. hc595_st_dr=1;
  103. delay_short(1);
  104. hc595_sh_dr=0; //拉低,抗干扰就增强
  105. hc595_st_dr=0;
  106. hc595_ds_dr=0;
  107. }
  108. void led_flicker_09_16() //第9个至第16个LED的跑马灯程序,逐个亮并且每次只能亮一个.
  109. {
  110. if(ucLedStartFlag==1)//此变量为1时代表启动
  111. {
  112. switch(ucLedStep_09_16)
  113. {
  114. case 0:
  115. if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到
  116. {
  117. uiTimeCnt_09_16=0; //时间计数器清零
  118. if(ucLedDirFlag==0)//正方向
  119. {
  120. ucLed_dr16=0;//第16个灭
  121. ucLed_dr9=1;//第9个亮
  122. ucLed_update=1;//更新显示
  123. ucLedStep_09_16=1; //切换到下一个步骤
  124. }
  125. else//反方向
  126. {
  127. ucLed_dr15=1;//第15个亮
  128. ucLed_dr16=0;//第16个灭
  129. ucLed_update=1;//更新显示
  130. ucLedStep_09_16=7; //返回上一个步骤
  131. }
  132. }
  133. break;
  134. case 1:
  135. if(uiTimeCnt_09_16>=uiSetTimeLevel_09_16) //时间到
  136. {
  137. uiTimeCnt_09_16=0; //时间计数器清零
  138. if(ucLedDirFlag==0)//正方向
  139. {
  140. ucLed_dr9=0;//第9个灭
  141. ucLed_dr10=1;//第10个亮
  142. ucLed_update=1;//更新显示
  143. ucLedStep_09_16=2; //切换到下一个步骤
  144. }
  145. else//反方向
  146. {
  147. ucLed_dr16=1;//第16个亮
  148. ucLed_dr

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

网站地图

Top