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

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

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

  1. //按键去抖动延时计数器
  2. unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志
  3. unsigned intuiKeyTimeCnt3=0; //按键去抖动延时计数器
  4. unsigned char ucKeyLock3=0; //按键触发后自锁的变量标志
  5. unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
  6. unsigned charucVoiceLock=0;//蜂鸣器鸣叫的原子锁
  7. unsigned char ucDigShow8;//第8位数码管要显示的内容
  8. unsigned char ucDigShow7;//第7位数码管要显示的内容
  9. unsigned char ucDigShow6;//第6位数码管要显示的内容
  10. unsigned char ucDigShow5;//第5位数码管要显示的内容
  11. unsigned char ucDigShow4;//第4位数码管要显示的内容
  12. unsigned char ucDigShow3;//第3位数码管要显示的内容
  13. unsigned char ucDigShow2;//第2位数码管要显示的内容
  14. unsigned char ucDigShow1;//第1位数码管要显示的内容
  15. unsigned char ucDigDot8;//数码管8的小数点是否显示的标志
  16. unsigned char ucDigDot7;//数码管7的小数点是否显示的标志
  17. unsigned char ucDigDot6;//数码管6的小数点是否显示的标志
  18. unsigned char ucDigDot5;//数码管5的小数点是否显示的标志
  19. unsigned char ucDigDot4;//数码管4的小数点是否显示的标志
  20. unsigned char ucDigDot3;//数码管3的小数点是否显示的标志
  21. unsigned char ucDigDot2;//数码管2的小数点是否显示的标志
  22. unsigned char ucDigDot1;//数码管1的小数点是否显示的标志
  23. unsigned char ucDigShowTemp=0; //临时中间变量
  24. unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
  25. unsigned char ucWd1Update=1; //窗口1更新显示标志
  26. unsigned char ucWd2Update=0; //窗口2更新显示标志
  27. unsigned char ucWd3Update=0; //窗口3更新显示标志
  28. unsigned char ucWd4Update=0; //窗口4更新显示标志
  29. unsigned char ucWd=1;//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
  30. unsigned intuiSetData1=0;//本程序中需要被设置的参数1
  31. unsigned intuiSetData2=0;//本程序中需要被设置的参数2
  32. unsigned intuiSetData3=0;//本程序中需要被设置的参数3
  33. unsigned intuiSetData4=0;//本程序中需要被设置的参数4
  34. unsigned char ucTemp1=0;//中间过渡变量
  35. unsigned char ucTemp2=0;//中间过渡变量
  36. unsigned char ucTemp3=0;//中间过渡变量
  37. unsigned char ucTemp4=0;//中间过渡变量
  38. unsigned char ucDelayTimerLock=0; //原子锁
  39. unsigned intuiDelayTimer=0;
  40. unsigned char ucCheckEeprom=0;//检查EEPROM芯片是否正常
  41. unsigned char ucEepromError=0; //EEPROM芯片是否正常的标志
  42. unsigned char ucEepromLock=0;//原子锁
  43. unsigned intuiEepromCnt=0; //间歇性蜂鸣器报警的计时器
  44. //根据原理图得出的共阴数码管字模表
  45. code unsigned char dig_table[]=
  46. {
  47. 0x3f,//0 序号0
  48. 0x06,//1 序号1
  49. 0x5b,//2 序号2
  50. 0x4f,//3 序号3
  51. 0x66,//4 序号4
  52. 0x6d,//5 序号5
  53. 0x7d,//6 序号6
  54. 0x07,//7 序号7
  55. 0x7f,//8 序号8
  56. 0x6f,//9 序号9
  57. 0x00,//无 序号10
  58. 0x40,//- 序号11
  59. 0x73,//P 序号12
  60. };
  61. void main()
  62. {
  63. initial_myself();
  64. delay_long(100);
  65. initial_peripheral();
  66. while(1)
  67. {
  68. key_service(); //按键服务的应用程序
  69. display_service(); //显示的窗口菜单服务程序
  70. eeprom_alarm_service(); //EEPROM出错报警
  71. }
  72. }
  73. void eeprom_alarm_service(void) //EEPROM出错报警
  74. {
  75. if(ucEepromError==1) //EEPROM出错
  76. {
  77. if(uiEepromCnt
  78. {
  79. ucEepromLock=1;//原子锁加锁
  80. uiEepromCnt=0; //计时器清零
  81. ucEepromLock=0;//原子锁解锁
  82. ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
  83. uiVoiceCnt=const_voice_short; //蜂鸣器声音触发,滴一声就停。
  84. ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
  85. }
  86. }
  87. }
  88. //AT24C02驱动程序
  89. void start24(void)//开始位
  90. {
  91. eeprom_sda_dr_sr=1;
  92. eeprom_scl_dr=1;
  93. delay_short(15);
  94. eeprom_sda_dr_sr=0;
  95. delay_short(15);
  96. eeprom_scl_dr=0;
  97. }
  98. void ack24(void)//确认位时序
  99. {
  100. eeprom_sda_dr_sr=1; //51单片机在读取数据之前要先置一,表示数据输入
  101. eeprom_scl_dr=1;
  102. delay_short(15);
  103. eeprom_scl_dr=0;
  104. delay_short(15);
  105. //在本驱动程序中,我没有对ACK信号进行出错判断,因为我这么多年一直都是这样用也没出现过什么问题。
  106. //有兴趣的朋友可以自己增加出错判断,不一定非要按我的方式去做。
  107. }
  108. void stop24(void)//停止位
  109. {
  110. eeprom_sda_dr_sr=0;
  111. eeprom_scl_d

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

网站地图

Top