📄 sd2300api.lst
字号:
C51 COMPILER V6.12 SD2300API 11/29/2007 10:34:25 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE SD2300API
OBJECT MODULE PLACED IN F:\YUN\安全牌\安全牌C\SD2300API.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE F:\YUN\安全牌\安全牌C\SD2300API.C DB SB OE
stmt level source
1 #include "fun.h"
2 #include "var.h"
3 //SD2300API.C
4 /*功能:提供I2C总线工作时序中的起始位*/
5 void I2C_start(void)
6 {SCLK=1;
7 1 delay(1);
8 1 SDAT=0;
9 1 delay(1);
10 1 SCLK=0;
11 1 delay(1);}
12
13 /*功能:提供I2C总线工作时序中的停止位*/
14 void I2C_stop(void)
15 {SDAT=0;
16 1 delay(1);
17 1 SCLK=1;
18 1 delay(1);
19 1 SDAT=1;
20 1 delay(1);
21 1 SCLK=0;
22 1 delay(1);
23 1 }
24
25 /*功能:I2C总线初始化。在MAIN()函数中应先调用本函数,然后再调用其他函数。*/
26 void I2C_init(void)
27 {SCLK=0;
28 1 I2C_stop();}
29
30 /*功能:提供I2C的时钟信号,并返回在时钟电平为高期间SDAT信号线上状态。
31 *本函数可用于数据接收。*/
32 bit I2C_clock(void)
33 {bit sample;
34 1 SCLK=1;
35 1 delay(1);
36 1 sample=SDAT;
37 1 SCLK=0;
38 1 delay(1);
39 1 return(sample);}
40
41 /*功能:向I2C总线发送8位数据,并请求一个应答信号ACK。
42 *如果收到ACK应答则返回1,否则返回0*/
43 bit I2C_send(uchar I_data)
44 {uchar i;
45 1 /*发送8位数据*/
46 1 for (i=0;i<8;i++)
47 1 {SDAT=(bit)(I_data&0x80);
48 2 I_data=I_data<<1;
49 2 I2C_clock();}
50 1 /*请求应答信号ACK*/
51 1 SDAT=1;
52 1 return(~I2C_clock());}
53
54 /*功能:从I2C总线上接收8位数据信号,并将接收到8位数据作为一个
55 *字节返回,不回送应答信号ACK。主函数在调用本函数之前应保证SDA
C51 COMPILER V6.12 SD2300API 11/29/2007 10:34:25 PAGE 2
56 *信号线处于浮置状态,即SDA置1。*/
57 uchar I2C_receive(void)
58 {uchar I_data=0;
59 1 uchar i;
60 1 for(i=0;i<8;i++)
61 1 {I_data<<=1;
62 2 if(I2C_clock())I_data++;}
63 1 return(I_data);
64 1 }
65
66 /*功能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。*/
67 void I2C_Ack(void)
68 {SDAT=0;
69 1 I2C_clock();
70 1 SDAT=1;}
71
72
73
74 /*功能:向SD2300API写入器件地址和一个指定的字节地址*/
75 bit wr_address(uchar Address)
76 {I2C_start();
77 1 if(I2C_send(I2C_SD2300API_WR))return(I2C_send(Address));
78 1 else return(FALSE);
79 1 }
80
81 //初始化SD2300API
82 bit init_sd2300api(void)
83 {I2C_init();
84 1 if(wr_address(ADDR_ADJUST)) //从时间调整寄存器地址开始
85 1 {//时间调整寄存器
86 2 if(!I2C_send(ADJUST)){I2C_stop();return(FALSE);}
87 2 //ALARM-A定时:每天18点00分
88 2 if(!I2C_send(MINUTE_A)){I2C_stop();return(FALSE);}
89 2 if(!I2C_send(HOUR_A)){I2C_stop();return(FALSE);}
90 2 if(!I2C_send(WEEK_A)){I2C_stop();return(FALSE);}
91 2 //ALARM-B定时:每天18点00分
92 2 if(!I2C_send(MINUTE_B)){I2C_stop();return(FALSE);}
93 2 if(!I2C_send(HOUR_B)){I2C_stop();return(FALSE);}
94 2 if(!I2C_send(WEEK_B)){I2C_stop();return(FALSE);}
95 2 //控制寄存器1设置
96 2 if(!I2C_send(CONTROL1)){I2C_stop();return(FALSE);}
97 2 //控制寄存器2设置
98 2 if(!I2C_send(CONTROL2)){I2C_stop();return(FALSE);}
99 2 I2C_stop();delay(600); return(TRUE);
100 2 }
101 1 else {I2C_stop();return(FALSE);}
102 1 }
103
104 //读时间日期
105 bit rd_date(void)
106 {EA=0;
107 1 I2C_init();
108 1 if(wr_address(ADDR_SECOND))/*发送重复启动信号*/
109 1 {I2C_start();
110 2 if(I2C_send(I2C_SD2300API_RD))
111 2 {bcd1_realtime.second=I2C_receive();I2C_Ack();
112 3 bcd1_realtime.minute=I2C_receive();I2C_Ack();
113 3 bcd1_realtime.hour =I2C_receive();I2C_Ack();
114 3 bcd1_realtime.week =I2C_receive();I2C_Ack();
115 3 bcd1_realtime.day =I2C_receive();I2C_Ack();
116 3 bcd1_realtime.month =I2C_receive();I2C_Ack();
117 3 bcd1_realtime.year =I2C_receive();I2C_Ack();
C51 COMPILER V6.12 SD2300API 11/29/2007 10:34:25 PAGE 3
118 3 I2C_stop();EA=1;return(TRUE);
119 3 }
120 2 else{I2C_stop();EA=1;return(FALSE);}
121 2 }
122 1 else {I2C_stop();EA=1;return(FALSE);}
123 1 EA=1;
124 1 }
125
126 //写时间日期
127 bit wr_date(void)
128 {EA=0;
129 1 I2C_init();
130 1 if(wr_address(ADDR_SECOND)) //从秒地址开始
131 1 {//秒,分,时,周,日,月,年
132 2 if(!I2C_send(bcd1_realtime.second)){I2C_stop();EA=1;return(FALSE);}
133 2 if(!I2C_send(bcd1_realtime.minute)){I2C_stop();EA=1;return(FALSE);}
134 2 if(!I2C_send(bcd1_realtime.hour)) {I2C_stop();EA=1;return(FALSE);}
135 2 if(!I2C_send(bcd1_realtime.week)) {I2C_stop();EA=1;return(FALSE);}
136 2 if(!I2C_send(bcd1_realtime.day)) {I2C_stop();EA=1;return(FALSE);}
137 2 if(!I2C_send(bcd1_realtime.month)) {I2C_stop();EA=1;return(FALSE);}
138 2 if(!I2C_send(bcd1_realtime.year)) {I2C_stop();EA=1;return(FALSE);}
139 2 //时间调整寄存器
140 2 if(!I2C_send(ADJUST)){I2C_stop();EA=1;return(FALSE);}
141 2 I2C_stop();delay(600);EA=1;return(TRUE);
142 2 }
143 1 else {I2C_stop();EA=1;return(FALSE);}
144 1 }
145 /*
146 //查中断标记,返回
147 uchar rd_control2(void)
148 {uchar i;
149 I2C_init();
150 if(wr_address(ADDR_CONTROL2))//发送重复启动信号
151 {I2C_start();
152 if(I2C_send(I2C_SD2300API_RD))
153 {i=I2C_receive();
154 I2C_Ack();
155 I2C_stop();
156 return(i);
157 }
158 else{I2C_stop();return(FALSE);}
159 }
160 else {I2C_stop();return(FALSE);}
161 } */
162
163 //清中断标记
164 uchar wr_control2(void)
165 {I2C_init();
166 1 if(wr_address(ADDR_CONTROL2))
167 1 {//清除中断标记
168 2 if(!I2C_send(CONTROL2)){I2C_stop();return(FALSE);}
169 2 I2C_stop();delay(600); return(TRUE);
170 2 }
171 1 else {I2C_stop();return(FALSE);}
172 1 }
173 /********************中断************************/
174 /*外部中断INT0初始化函数*/
175 /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -