📄 sd2000.lst
字号:
C51 COMPILER V8.02 SD2000 03/14/2009 10:38:56 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SD2000
OBJECT MODULE PLACED IN sd2000.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sd2000.c OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <intrins.h>
2 #include"sd2000.h"
3
4 unsigned char date[7]; //日期数组
5 /*date[0]=year,date[1]=month,date[2]=day,date[3]=week,
6 date[4]=hour,date[5]=minute,date[6]=second*/
7 /*********I2C延时***********/
8 void I2CWait(void)
9 {
10 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();
11 1 }
12
13
14 /********开启SD2000的I2C总线********/
15 bit I2CStart(void)
16 {
17 1 SDA=1;
18 1 SCL=1;
19 1 I2CWait();
20 1 if(!SDA)return false;//SDA线为低电平则总线忙,退出
21 1 SDA=0;
22 1 I2CWait();
23 1 while(SDA)return false;//SDA线为高电平则总线出错,退出
24 1 SCL=0;
25 1 I2CWait();
26 1 return true;
27 1 }
28
29
30 /********关闭SD2000的I2C总线*******/
31 void I2CStop(void)
32 {
33 1 SDA=0;
34 1 SCL=0;
35 1 I2CWait();
36 1 SCL=1;
37 1 I2CWait();
38 1 SDA=1;
39 1 }
40
41
42 /*********发送 ACK*********/
43 void I2CAck(void)
44 {
45 1 SDA=0;
46 1 SCL=0;
47 1 I2CWait();
48 1 SCL=1;
49 1 I2CWait();
50 1 SCL=0;
51 1 }
52
53
54 /*********发送NO ACK*********/
55 void I2CNoAck(void)
C51 COMPILER V8.02 SD2000 03/14/2009 10:38:56 PAGE 2
56 {
57 1 SDA=1;
58 1 SCL=0;
59 1 I2CWait();
60 1 SCL=1;
61 1 I2CWait();
62 1 SCL=0;
63 1 }
64
65
66 /*********读取ACK信号*********/
67 bit I2CWaitAck(void) //返回为:1=有ACK,0=无ACK
68 {
69 1 uchar errtime=255;
70 1 SCL=0;
71 1 SDA=1;
72 1 I2CWait();
73 1 SCL=1;
74 1 I2CWait();
75 1 while(SDA)
76 1 {
77 2 errtime--;
78 2 if(!errtime)
79 2 SCL=0;
80 2 return false;
81 2 }
82 1 SCL=0;
83 1 return true;
84 1 }
85
86
87 /************从SD2000发送一个字节*************/
88 void I2CSendByte(uchar demand,bit order) //order=1,H_L;order=0,L_H
89 {
90 1 uchar i=8; //order=1,从HI-->LO发送8bit数据
91 1 //order=0,从LO-->HI发送8bit数据
92 1 if(order)
93 1 {
94 2 while(i--)
95 2 {
96 3 SCL=0;
97 3 _nop_();
98 3 _nop_();
99 3 SDA=(bit)(demand&0x80);
100 3 demand<<=1;
101 3 I2CWait();
102 3 SCL=1;
103 3 I2CWait();
104 3 }
105 2 SCL=0;
106 2 }
107 1 else
108 1 {
109 2 while(i--)
110 2 {
111 3 SCL=0;
112 3 _nop_();
113 3 _nop_();
114 3 SDA=(bit)(demand&0x01);
115 3 demand>>=1;
116 3 I2CWait();
117 3 SCL=1;
C51 COMPILER V8.02 SD2000 03/14/2009 10:38:56 PAGE 3
118 3 I2CWait();
119 3 }
120 2 SCL=0;
121 2 }
122 1 }
123
124
125 /*********MCU从SD2000读入一字节*********/
126 uchar I2CReceiveByte(void)
127 {
128 1 uchar i=8;
129 1 uchar ddata=0;
130 1 SDA=1;
131 1 while(i--)
132 1 {
133 2 ddata>>=1; //数据从低位开始读取
134 2 SCL=0;
135 2 I2CWait();
136 2 SCL=1;
137 2 I2CWait(); //从低位开始 ddata|=SDA;ddata>>=1
138 2 if(SDA)
139 2 {
140 3 ddata|=0x80;
141 3 }
142 2 }
143 1 SCL=0;
144 1 return ddata;
145 1 }
146
147
148 /******读SD2000实时数据寄存器******/
149 void I2CReadDate(void)
150 {
151 1 uchar n;
152 1 I2CStart();
153 1 I2CSendByte(0x65,1); //从年开始读取数据
154 1 I2CWaitAck();
155 1 for(n=0;n<7;n++)
156 1 {
157 2 date[n]=I2CReceiveByte();
158 2 if (n!=6) //最后一个数据不应答
159 2 {
160 3 I2CAck();
161 3 }
162 2 }
163 1 I2CNoAck();
164 1 I2CStop();
165 1 }
166
167
168 /*写SD2000状态寄存器命令*/
169 void I2CWriteStatus(void)
170 {
171 1 I2CStart();
172 1 I2CSendByte(0x62,1); //发送SD2000状态寄存器命令,
173 1 I2CWaitAck();
174 1 I2CSendByte(0x7f,0); //24小时制,开所有中断
175 1 I2CWaitAck();
176 1 I2CStop();
177 1 }
178
179 /*写SD2000时间寄存器命令*/
C51 COMPILER V8.02 SD2000 03/14/2009 10:38:56 PAGE 4
180 void I2CWriteTime(void)
181 {
182 1
183 1 uchar n;
184 1 date[0]=0x06;//year;06/11/15/06/13/14/50
185 1 date[1]=0x12;//month
186 1 date[2]=0x15;//day
187 1 date[3]=0x05;//week
188 1 date[4]=0x09;//hour
189 1 date[5]=0x19;//minute
190 1 date[6]=0x00;//second
191 1 I2CStart();
192 1 I2CSendByte(0x64,1); //发送SD2000写时间寄存器命令,
193 1 I2CWaitAck();
194 1 for(n=0;n<7;n++)
195 1 {
196 2 I2CSendByte(date[n],0);
197 2 I2CWaitAck();
198 2 }
199 1 I2CStop();
200 1
201 1 }
202
203 /*********延时子程序*********
204 void Delay(uint nn)
205 {
206 while(nn--);
207 }
208 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 393 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -