微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第47节:操作AT24C02利用定时器延时改善数码管的闪烁

第47节:操作AT24C02利用定时器延时改善数码管的闪烁

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

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

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

网站地图

Top