📄 iic_io.lst
字号:
C51 COMPILER V7.06 IIC_IO 11/03/2008 16:34:29 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE IIC_IO
OBJECT MODULE PLACED IN IIC_IO.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.exe IIC_IO.C DB OE
stmt level source
1 #include <c8051f040.h>
2 #include "intrins.h"
3
4 /**********************另外相关的定义*********************************/
5 #define HIGH 1
6 #define LOW 0
7 #define TURE 1
8 #define FALSE 0
9 #define uchar unsigned char
10 #define uint unsigned int
11
12 void delay_ms(uint n);
13
14 /*********************结束***********************************************/
15 /***************************DS1307开始*****************************************************************/
16 #define Wait1us _nop_();
17 #define Wait2us {_nop_();_nop_();}
18 #define Wait4us {Wait2us;Wait2us;}
19 #define Wait8us {Wait4us;Wait4us;}
20 #define Wait10us {Wait8us;Wait2us;}
21 #define WRITEDS1307 0xD0
22 #define READDS1307 0xD1
23
24 sbit SDA=P0^2; //DS1307 Serial-Data Input pin 5
25 sbit SCL=P0^3; //DS1307 Serial-Clock Input pin 6
26 /************************************************************/
27 void I2C_start(void);//I2C start function
28 void I2C_stop(void);//I2C stop function
29 //void I2C_send_ack(void);//I2C send responsion function
30 void I2C_send_noack(void);
31 void I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function
32 unsigned char I2C_read_byte(void);//I2C bus read byte function
33 /***********************************************************************/
34 void Write1307(unsigned char add,unsigned char dat);//write information to ds1307
35 unsigned char Read1307(unsigned char add);//read information from ds1307
36 void Read_RTC(void);//read RTC
37 void Set_RTC(void);//set RTC
38 void OSCILLATOR_Init (void);
39 void PORT_Init (void);
40 /***********************************************************************/
41 code unsigned char set_rtc_code[7]={0x00,0x34,0x16,0x1,0x03,0x11,0x08};
42 code unsigned char rtc_address[7]={0x02,0x03,0x04,0x05,0x06,0x07,0x08};//DS1307
43 code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
44 unsigned char read_rtc_code[7];
45 /***********************************************************************/
46 void Initial(void);//system initize function
47 /***********************************************************************/
48 /***********************************************************************/
49 void main(void)
50 {
51 1
52 1 WDTCN = 0xde; /*关看门狗*/
53 1 WDTCN = 0xad;
54 1 OSCILLATOR_Init ();
55 1
C51 COMPILER V7.06 IIC_IO 11/03/2008 16:34:29 PAGE 2
56 1 PORT_Init (); // Initialize crossbar and GPIO
57 1 Set_RTC();
58 1
59 1 while(1)
60 1 {
61 2 Write1307(0x00,0x01);
62 2 Read_RTC();
63 2 Write1307(0x00,0x00);
64 2 }
65 1 }
66
67
68
69 void OSCILLATOR_Init (void)
70 {
71 1 int i = 0;
72 1 SFRPAGE = CONFIG_PAGE;
73 1 OSCXCN = 0x77;
74 1 for (i = 0; i < 256; i++); // Wait 1ms for initialization
75 1 while ((OSCXCN & 0x80) == 0);
76 1 CLKSEL = 0x01;
77 1 }
78
79 void PORT_Init (void)
80 {
81 1 SFRPAGE = CONFIG_PAGE; // Switch to configuration page
82 1 XBR2 = 0x40; // Enable crossbar and weak pull-ups
83 1 P0MDOUT |= 0xff; // enable P0 (LED) as push-pull output
84 1 P1MDOUT |= 0xff; // enable P1 (LED) as push-pull output
85 1 P4MDOUT |= 0xff; // enable P5 (LED) as push-pull output
86 1 P5MDOUT |= 0xff; // enable P5 (LED) as push-pull output
87 1 P6MDOUT |= 0xff; // enable P5 (LED) as push-pull output
88 1 P7MDOUT |= 0xff; // enable P5 (LED) as push-pull output
89 1
90 1 P4 = 0;
91 1 P5 = 0;
92 1 P6 = 0;
93 1 P7 = 0;
94 1 }
95
96
97 /***********************************************************************/
98 void I2C_start(void)
99 {
100 1 SDA=1;
101 1 SCL=1;
102 1 Wait8us;
103 1 SDA=0;
104 1 Wait8us;
105 1 SCL=0;
106 1
107 1 }
108 /***********************************************************************/
109 void I2C_stop(void)
110 {
111 1 SDA=0;
112 1 SCL=1;
113 1 Wait8us;
114 1 SDA=1;
115 1 Wait4us;
116 1 SCL=0;
117 1 }
C51 COMPILER V7.06 IIC_IO 11/03/2008 16:34:29 PAGE 3
118 /***********************************************************************/
119 void I2C_send_ack(void)
120 {
121 1 SDA=0;
122 1 Wait2us;
123 1 SCL=1;
124 1 Wait4us;
125 1 SCL=0;
126 1 Wait2us;
127 1 }
128 /*************************************************************************/
129 void I2C_send_noack(void)
130 {
131 1 SDA=1;
132 1 Wait2us;
133 1 SCL=1;
134 1 Wait4us;
135 1 SCL=0;
136 1 Wait2us;
137 1 }
138
139 unsigned char IICCheckAcknowledge() /*IIC总线检测从机应答位*/
140 {
141 1 unsigned char IICAckFlag;
142 1
143 1 SDA=1; /*SDA=1; 线与吗?应为SDA=0?*/
144 1 Wait2us;
145 1 SCL=1;
146 1 Wait2us;
147 1 IICAckFlag=0;
148 1
149 1 if(SDA==0) /*应答正常*/
150 1 {
151 2 Wait2us;
152 2 SCL=0;
153 2 return(IICAckFlag);
154 2 }
155 1 else
156 1 {
157 2 IICAckFlag=1; /*应答不正常*/
158 2 Wait2us;
159 2 SCL=0;
160 2 return(IICAckFlag);
161 2 }
162 1 }
163 /***********************************************************************/
164 void I2C_write_byte(unsigned char IIC_data)
165 {
166 1 unsigned char i;
167 1 for(i=0;i<8;i++)
168 1 {
169 2 SCL=0;
170 2 if((IIC_data<<i) & 0x80)
171 2 SDA=1; //判断发送位
172 2 else SDA=0;
173 2 Wait2us;
174 2 SCL=1;
175 2 Wait4us;
176 2 SCL=0;
177 2 }
178 1 Wait4us;
179 1 SDA=1; //发送完8bit,释放总线准备接收应答位
C51 COMPILER V7.06 IIC_IO 11/03/2008 16:34:29 PAGE 4
180 1 Wait2us;
181 1 SCL=1;
182 1 Wait4us; //sda上数据即是从应答位
183 1 SCL=0; //不考虑从应答位|但要控制好时序
184 1 }
185 /***********************************************************************/
186 unsigned char I2C_read_byte(void)
187 {
188 1 unsigned char i,dat;
189 1 dat=0;
190 1 SDA=1;
191 1 for (i=0;i<8;i++)
192 1 {
193 2 dat=dat<<1;
194 2 SCL=1;
195 2 Wait2us;
196 2 if(SDA==1)
197 2 {
198 3 dat++;
199 3 }
200 2 SCL=0;
201 2 }
202 1 return (dat);
203 1 }
204 /***********************************************************************/
205 /******************************** DS1307 PART START ****************/
206 void Write1307(unsigned char add,unsigned char dat)
207 {
208 1 I2C_start();
209 1 I2C_write_byte(WRITEDS1307);
210 1 I2C_write_byte(add);
211 1 I2C_write_byte(dat);
212 1 I2C_stop();
213 1 }
214
215 /***********************************************************************/
216 unsigned char Read1307(unsigned char add)
217 {
218 1 unsigned char dat;
219 1 I2C_start();
220 1 I2C_write_byte(WRITEDS1307);
221 1 I2C_write_byte(add);
222 1 I2C_start();
223 1 I2C_write_byte(READDS1307);
224 1 dat=I2C_read_byte();
225 1 I2C_send_noack();
226 1 I2C_stop();
227 1 return (dat);
228 1 }
229 /****************************读DS1307的寄存器*******************************************/
230 void Read_RTC(void)
231 {
232 1 unsigned char i,*p;
233 1 p=rtc_address;
234 1 for(i=0;i<7;i++)
235 1 {
236 2 read_rtc_code[i]=Read1307(*p);
237 2 p++;
238 2 }
239 1 }
240 /***************************DS1307的初始化********************************************/
241 void Set_RTC(void)
C51 COMPILER V7.06 IIC_IO 11/03/2008 16:34:29 PAGE 5
242 {
243 1 unsigned char i,*p;
244 1
245 1 p=rtc_address;
246 1 Write1307(0x00,0x02);
247 1 for(i=0;i<7;i++)
248 1 {
249 2 Write1307(*p,set_rtc_code[i]);
250 2 p++;
251 2 }
252 1 Write1307(0x00,0x00);
253 1 Write1307(0x01,0x00);
254 1
255 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 420 ----
CONSTANT SIZE = 63 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 1
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -