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

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

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

  1. r=1;
  2. delay_short(15);
  3. eeprom_sda_dr_sr=1;
  4. }
  5. unsigned char read24(void)//读取一个字节的时序
  6. {
  7. unsigned char outdata,tempdata;
  8. outdata=0;
  9. eeprom_sda_dr_sr=1; //51单片机的IO口在读取数据之前要先置一,表示数据输入
  10. delay_short(2);
  11. for(tempdata=0;tempdata<8;tempdata++)
  12. {
  13. eeprom_scl_dr=0;
  14. delay_short(2);
  15. eeprom_scl_dr=1;
  16. delay_short(2);
  17. outdata<=1;
  18. if(eeprom_sda_dr_sr==1)outdata++;
  19. eeprom_sda_dr_sr=1; //51单片机的IO口在读取数据之前要先置一,表示数据输入
  20. delay_short(2);
  21. }
  22. return(outdata);
  23. }
  24. void write24(unsigned char dd) //发送一个字节的时序
  25. {
  26. unsigned char tempdata;
  27. for(tempdata=0;tempdata<8;tempdata++)
  28. {
  29. if(dd>=0x80)eeprom_sda_dr_sr=1;
  30. else eeprom_sda_dr_sr=0;
  31. dd<=1;
  32. delay_short(2);
  33. eeprom_scl_dr=1;
  34. delay_short(4);
  35. eeprom_scl_dr=0;
  36. }
  37. }
  38. unsigned char read_eeprom(unsigned int address) //从一个地址读取出一个字节数据
  39. {
  40. unsigned char dd,cAddress;
  41. cAddress=address; //把低字节地址传递给一个字节变量。
  42. EA=0; //禁止中断
  43. start24(); //IIC通讯开始
  44. write24(0xA0); //此字节包含读写指令和芯片地址两方面的内容。
  45. //指令为写指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
  46. ack24(); //发送应答信号
  47. write24(cAddress); //发送读取的存储地址(范围是0至255)
  48. ack24(); //发送应答信号
  49. start24(); //开始
  50. write24(0xA1); //此字节包含读写指令和芯片地址两方面的内容。
  51. //指令为读指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
  52. ack24(); //发送应答信号
  53. dd=read24(); //读取一个字节
  54. ack24(); //发送应答信号
  55. stop24();//停止
  56. EA=1; //允许中断
  57. delay_timer(2); //一气呵成的定时器延时方式,在延时的时候还可以动态扫描数码管
  58. return(dd);
  59. }
  60. void write_eeprom(unsigned int address,unsigned char dd) //往一个地址存入一个字节数据
  61. {
  62. unsigned char cAddress;
  63. cAddress=address; //把低字节地址传递给一个字节变量。
  64. EA=0; //禁止中断
  65. start24(); //IIC通讯开始
  66. write24(0xA0); //此字节包含读写指令和芯片地址两方面的内容。
  67. //指令为写指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
  68. ack24(); //发送应答信号
  69. write24(cAddress); //发送写入的存储地址(范围是0至255)
  70. ack24(); //发送应答信号
  71. write24(dd);//写入存储的数据
  72. ack24(); //发送应答信号
  73. stop24();//停止
  74. EA=1; //允许中断
  75. delay_timer(4); //一气呵成的定时器延时方式,在延时的时候还可以动态扫描数码管
  76. }
  77. unsigned int read_eeprom_int(unsigned int address) //从一个地址读取出一个int类型的数据
  78. {
  79. unsigned char ucReadDataH;
  80. unsigned char ucReadDataL;
  81. unsigned intuiReadDate;
  82. ucReadDataH=read_eeprom(address); //读取高字节
  83. ucReadDataL=read_eeprom(address+1);//读取低字节
  84. uiReadDate=ucReadDataH;//把两个字节合并成一个int类型数据
  85. uiReadDate=uiReadDate<8;
  86. uiReadDate=uiReadDate+ucReadDataL;
  87. return uiReadDate;
  88. }
  89. void write_eeprom_int(unsigned int address,unsigned int uiWriteData) //往一个地址存入一个int类型的数据
  90. {
  91. unsigned char ucWriteDataH;
  92. unsigned char ucWriteDataL;
  93. ucWriteDataH=uiWriteData>>8;
  94. ucWriteDataL=uiWriteData;
  95. write_eeprom(address,ucWriteDataH); //存入高字节
  96. write_eeprom(address+1,ucWriteDataL); //存入低字节
  97. }
  98. void display_service(void) //显示的窗口菜单服务程序
  99. {
  100. switch(ucWd)//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
  101. {
  102. case 1: //显示P--1窗口的数据
  103. if(ucWd1Update==1)//窗口1要全部更新显示
  104. {
  105. ucWd1Update=0;//及时清零标志,避免一直进来扫描
  106. ucDigShow8=12;//第8位数码管显示P
  107. ucDigShow7=11;//第7位数码管显示-
  108. ucDigShow6=1; //第6位数码管显示1
  109. ucDigShow5=10;//第5位数码管显示无
  110. //先分解数据
  111. ucTemp4=uiSetData1/1000;
  112. ucTemp3=uiSetData1%1000/100;
  113. ucTemp2=uiSetData1%100/10;
  114. ucTemp1=uiSetData1%10;
  115. //再过渡需要显示的数据到缓冲变量里,让过渡的时间越短越好
  116. if(uiSetData1<1000)
  117. {
  118. ucDigShow4=10;//如果小于1000,千位显示无
  119. }
  120. else
  121. {

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

网站地图

Top