微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第44节:从机的串口收发综合程序框架

第44节:从机的串口收发综合程序框架

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

  1. 数与中断函数的共享变量uiVoiceCnt
  2. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  3. ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
  4. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  5. break;
  6. case 4:// 复位按键 对应朱兆祺学习板的S13键
  7. switch(ucStatus)//在不同的状态下,进行不同的操作
  8. {
  9. case 0://处于待机状态
  10. break;
  11. case 1://处于正在通讯的过程
  12. break;
  13. case 2: //发送数据出错,比如中间超时没有接收到数据
  14. ucStatus=0; //切换回待机的状态
  15. break;
  16. }
  17. ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
  18. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  19. ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
  20. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  21. break;
  22. }
  23. }
  24. void display_drive(void)
  25. {
  26. //以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路
  27. switch(ucDisplayDriveStep)
  28. {
  29. case 1://显示第1位
  30. ucDigShowTemp=dig_table[ucDigShow1];
  31. if(ucDigDot1==1)
  32. {
  33. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  34. }
  35. dig_hc595_drive(ucDigShowTemp,0xfe);
  36. break;
  37. case 2://显示第2位
  38. ucDigShowTemp=dig_table[ucDigShow2];
  39. if(ucDigDot2==1)
  40. {
  41. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  42. }
  43. dig_hc595_drive(ucDigShowTemp,0xfd);
  44. break;
  45. case 3://显示第3位
  46. ucDigShowTemp=dig_table[ucDigShow3];
  47. if(ucDigDot3==1)
  48. {
  49. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  50. }
  51. dig_hc595_drive(ucDigShowTemp,0xfb);
  52. break;
  53. case 4://显示第4位
  54. ucDigShowTemp=dig_table[ucDigShow4];
  55. if(ucDigDot4==1)
  56. {
  57. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  58. }
  59. dig_hc595_drive(ucDigShowTemp,0xf7);
  60. break;
  61. case 5://显示第5位
  62. ucDigShowTemp=dig_table[ucDigShow5];
  63. if(ucDigDot5==1)
  64. {
  65. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  66. }
  67. dig_hc595_drive(ucDigShowTemp,0xef);
  68. break;
  69. case 6://显示第6位
  70. ucDigShowTemp=dig_table[ucDigShow6];
  71. if(ucDigDot6==1)
  72. {
  73. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  74. }
  75. dig_hc595_drive(ucDigShowTemp,0xdf);
  76. break;
  77. case 7://显示第7位
  78. ucDigShowTemp=dig_table[ucDigShow7];
  79. if(ucDigDot7==1)
  80. {
  81. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  82. }
  83. dig_hc595_drive(ucDigShowTemp,0xbf);
  84. break;
  85. case 8://显示第8位
  86. ucDigShowTemp=dig_table[ucDigShow8];
  87. if(ucDigDot8==1)
  88. {
  89. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  90. }
  91. dig_hc595_drive(ucDigShowTemp,0x7f);
  92. break;
  93. }
  94. ucDisplayDriveStep++;
  95. if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描
  96. {
  97. ucDisplayDriveStep=1;
  98. }
  99. }
  100. //数码管的74HC595驱动函数
  101. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
  102. {
  103. unsigned char i;
  104. unsigned char ucTempData;
  105. dig_hc595_sh_dr=0;
  106. dig_hc595_st_dr=0;
  107. ucTempData=ucDigStatusTemp16_09;//先送高8位
  108. for(i=0;i<8;i++)
  109. {
  110. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  111. else dig_hc595_ds_dr=0;
  112. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  113. delay_short(1);
  114. dig_hc595_sh_dr=1;
  115. delay_short(1);
  116. ucTempData=ucTempData<1;
  117. }
  118. ucTempData=ucDigStatusTemp08_01;//再先送低8位
  119. for(i=0;i<8;i++)
  120. {
  121. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  122. else dig_hc595_ds_dr=0;
  123. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  124. delay_short(1);
  125. dig_hc595_sh_dr=1;
  126. delay_short(1);
  127. ucTempData=ucTempData<1;
  128. }
  129. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  130. delay_short(1);
  131. dig_hc595_st_dr=1;
  132. delay_short(1);
  133. dig_hc595_sh_dr=0; //拉低,抗干扰

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

网站地图

Top