24c02.lst
来自「C8051ucos源码」· LST 代码 · 共 201 行
LST
201 行
C51 COMPILER V8.01 24C02 12/24/2006 10:57:23 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE 24C02
OBJECT MODULE PLACED IN 24c02.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE program\24c02.c BROWSE DEBUG OBJECTEXTEND PRINT(.\24c02.lst) OBJECT(24c02.o
-bj)
line level source
1 /*=======================================================================================================
2 IIC_是面向IIC_芯片的驱动程序
3
4 建立于:2005.08.01
5 编写人:杨术轩
6 =======================================================================================================*/
7 //移植部分
8 #include "C8051F020.h"
9 #include <intrins.h>
10 #include "24c02.h"
11
12 #define IIC_CLK_DELAY() _nop_();_nop_();_nop_();_nop_();_nop_();
13
14 #define IIC_GET_SDA P1_7
15 #define IIC_SET_SDA P1_7=1
16 #define IIC_CLR_SDA P1_7=0
17 #define IIC_SET_SCL P1_6=1
18 #define IIC_CLR_SCL P1_6=0
19
20 //=======================================================================================================
21 //IIC_总线的开始状态
22 void IIC_Start(void)
23 {
24 1 IIC_SET_SDA;
25 1 IIC_SET_SCL;
26 1 IIC_CLK_DELAY();
27 1 IIC_CLR_SDA;
28 1 IIC_CLK_DELAY();
29 1 IIC_CLR_SCL;
30 1 IIC_CLK_DELAY();
31 1 }
32 //------------------------------------------------------------------------------------------------------
33 //IIC_总线的停止状态
34 void IIC_Stop(void)
35 {
36 1 IIC_CLR_SCL;
37 1 IIC_CLR_SDA;
38 1 IIC_CLK_DELAY();
39 1 IIC_SET_SCL;
40 1 IIC_CLK_DELAY();
41 1 IIC_SET_SDA;
42 1 IIC_CLK_DELAY();
43 1 }
44 //------------------------------------------------------------------------------------------------------
45 //向从器件写入一个字节 ch,同时判断ack返回
46 //返回:ack的状态
47 unsigned char IIC_ByteWr(unsigned char ch)
48 {
49 1 unsigned char i;
50 1 for (i=0; i<8; i++)
51 1 {
52 2 if(ch&0x80)
53 2 IIC_SET_SDA;
54 2 else
C51 COMPILER V8.01 24C02 12/24/2006 10:57:23 PAGE 2
55 2 IIC_CLR_SDA;
56 2 ch<<=1;
57 2 IIC_CLK_DELAY();
58 2 IIC_SET_SCL;
59 2 IIC_CLK_DELAY();
60 2 IIC_CLR_SCL;
61 2 IIC_CLK_DELAY();
62 2 }
63 1 IIC_SET_SDA;
64 1 IIC_CLK_DELAY();
65 1 IIC_SET_SCL;
66 1 if(IIC_GET_SDA)
67 1 i=1;
68 1 else
69 1 i=0;
70 1 IIC_CLK_DELAY();
71 1 IIC_CLR_SCL;
72 1 return i;
73 1 }
74 //------------------------------------------------------------------------------------------------------
75 //从从器件读出一个字节
76 //reack:是反给从器件的应答信号
77 //返回:读入的字节
78 unsigned char IIC_ByteRd(unsigned char reack)
79 {
80 1 unsigned char i,val;
81 1
82 1 IIC_SET_SDA;
83 1 for (i=0; i<8; i++)
84 1 {
85 2 IIC_CLK_DELAY();
86 2 IIC_SET_SCL;
87 2 val<<=1;
88 2 if(IIC_GET_SDA) val|=1;
89 2 IIC_CLK_DELAY();
90 2 IIC_CLR_SCL;
91 2 }
92 1
93 1 if (reack!=0)
94 1 IIC_SET_SDA;
95 1 else
96 1 IIC_CLR_SDA;
97 1 IIC_CLK_DELAY();
98 1 IIC_SET_SCL;
99 1 IIC_CLK_DELAY();
100 1 IIC_CLR_SCL;
101 1 return val;
102 1 }
103 //========================================================================================================
-===
104
105 // 对24C02的读、写
106
107 #define WriteDeviceAddress 0xa0
108 #define ReadDviceAddress 0xa1
109
110 /*
111 延时子程序,延时时间单位为1毫秒,晶振使用22.1184兆赫,芯片使用mcs51兼容芯片
112 ms_number为需要延时的毫秒数,最大为255毫秒 误差小于1 %
113 */
114 void Delay1msOf24c02(unsigned char ms_number)
115 {
C51 COMPILER V8.01 24C02 12/24/2006 10:57:23 PAGE 3
116 1 unsigned int i;
117 1 unsigned char j;
118 1 for(j=0;j<ms_number;j++)
119 1 for(i=0;i<229;i++);
120 1 }
121
122 //--------------------------------------------------------------------------------------------------------
----
123 void Write24c02Page(unsigned char *Wdata,unsigned char RomAddress,unsigned char cnt)
124 {
125 1 IIC_Start();
126 1 IIC_ByteWr(WriteDeviceAddress);
127 1 IIC_ByteWr(RomAddress);
128 1 while(cnt--){
129 2 IIC_ByteWr(*Wdata++);
130 2 }
131 1 IIC_Stop();
132 1 Delay1msOf24c02(10);
133 1 }
134 //--------------------------------------------------------------------------------------------------------
----
135 void Write24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char Len)
136 {
137 1 unsigned char i,j;
138 1 j=Len/8;
139 1 for(i=0;i<j;i++)
140 1 {
141 2 Write24c02Page(RamAddress,RomAddress,8);
142 2 RamAddress+=8;
143 2 RomAddress+=8;
144 2 }
145 1 i=Len%8;
146 1 if(i!=0){Write24c02Page(RamAddress,RomAddress,i);}
147 1 }
148 //--------------------------------------------------------------------------------------------------------
----
149 void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char len)
150 {
151 1 if(len==0)return;
152 1 IIC_Start();
153 1 IIC_ByteWr(WriteDeviceAddress);
154 1 IIC_ByteWr(RomAddress);
155 1 IIC_Start();
156 1 IIC_ByteWr(ReadDviceAddress);
157 1 while(len--)
158 1 {
159 2 if(len!=0) *RamAddress++ = IIC_ByteRd(0);
160 2 else *RamAddress++ = IIC_ByteRd(1);
161 2 }
162 1 IIC_Stop();
163 1 }
164 //========================================================================================================
-===
165
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 428 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 17
C51 COMPILER V8.01 24C02 12/24/2006 10:57:23 PAGE 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?