📄 sd2kdrv.lst
字号:
C51 COMPILER V6.12 SD2KDRV 09/23/2005 17:32:57 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE SD2KDRV
OBJECT MODULE PLACED IN G:\C51PRJ\SD2KDRV\SD2KDRV.OBJ
COMPILER INVOKED BY: e:\keil\c51\BIN\C51.EXE G:\C51PRJ\SD2KDRV\SD2KDRV.C DB SB OE
stmt level source
1 /****************************************************************************/
2 /* */
3 /* Copyright (c) 2005, 老树工作室 */
4 /* All rights reserved. */
5 /* */
6 /* http://www.saintone.net Email:hxm0902@163.com */
7 /* QQ:112431149 Tel:010-62966630 */
8 /* */
9 /****************************************************************************/
10 /****************************************************************************/
11 /* 文件名:sd2000drv.c */
12 /* 版 本:Version 1.0 */
13 /* 描 述:sd2000驱动代码 */
14 /* 作 者:spot */
15 /* 函 数: */
16 /* sd2000_wait */
17 /* sd2000_start */
18 /* sd2000_stop */
19 /* sd2000_ack */
20 /* sd2000_no_ack */
21 /* sd2000_wait_ack */
22 /* sd2000_send_byte */
23 /* sd2000_receive_byte */
24 /* sd2000_read_date */
25 /* sd2000_write_date */
26 /* sd2000_write_status */
27 /* */
28 /* 历史记录: */
29 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
30 /****************************************************************************/
31 #include <reg52.h>
32 #include <absacc.h>
33 #include <intrins.h>
34 #include "../includes/types.h"
35
36 sbit SDA = P0^6; /* sd2000数据传送位 */
37 sbit SCL = P0^7; /* sd2000时钟控制位 */
38
39 /* 函数声明 */
40 void sd2000_wait(void); /* sd2000延时 */
41 void sd2000_start(void); /* 开启sd2000总线 */
42 void sd2000_stop(void); /* 关闭sd2000总线 */
43 void sd2000_ack(void); /* 发送ACK信号 */
44 void sd2000_no_ack(void); /* 发送NOACK信号 */
45 bit sd2000_wait_ack(void); /* 等待ACK信号 */
46 void sd2000_send_byte(u_char demand, bit order); /* MCU向sd2000发送一个字节 */
47 u_char sd2000_receive_byte(void); /* MCU从sd2000接收一个字节 */
48 void sd2000_read_date(void); /* 读取sd2000时钟数据 */
49 void sd2000_write_date(void); /* 写入sd2000时钟数据 */
50 void sd2000_write_status(void); /* 写sd2000状态寄存器 */
51
52 /* 声明结束 */
53
54 u_char read_date[7];
55 u_char write_date1[7] = {0x05, 0x09, 0x11, 0x00, 0x12, 0x00, 0x00};
C51 COMPILER V6.12 SD2KDRV 09/23/2005 17:32:57 PAGE 2
56 u_char write_date[7] = {0x05, 0x08, 0x08, 0x01, 0x16, 0x12, 0x00};
57 /* sd2000延时 */
58 void sd2000_wait(void)
59 {
60 1 _nop_();
61 1 _nop_();
62 1 _nop_();
63 1 _nop_();
64 1 }
65
66 /* 开启sd2000总线 */
67 void sd2000_start(void)
68 {
69 1 SDA = 1;
70 1 SCL = 1;
71 1 sd2000_wait();
72 1 SDA = 0;
73 1 sd2000_wait();
74 1 SCL = 0;
75 1 }
76
77 /* 关闭sd2000总线 */
78 void sd2000_stop(void)
79 {
80 1 SDA=0;
81 1 SCL=0;
82 1 sd2000_wait();
83 1 SCL=1;
84 1 sd2000_wait();
85 1 SDA=1;
86 1 }
87
88 /* 发送ACK信号 */
89 void sd2000_ack(void)
90 {
91 1 SDA=0;
92 1 sd2000_wait();
93 1 SCL=1;
94 1 sd2000_wait();
95 1 SCL=0;
96 1 }
97
98 /* 发送NOACK信号 */
99 void sd2000_no_ack(void)
100 {
101 1 SDA=1;
102 1 sd2000_wait();
103 1 SCL=1;
104 1 sd2000_wait();
105 1 SCL=0;
106 1 }
107
108 /****************************************************************************/
109 /* 函数名:sd2000_wait_ack */
110 /* 功 能:等待ACK信号 */
111 /* 作 者:spot */
112 /* 输 入:无 */
113 /* 输 出:1-ACK 0-ERROR */
114 /* */
115 /* 历史记录: */
116 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
117 /****************************************************************************/
C51 COMPILER V6.12 SD2KDRV 09/23/2005 17:32:57 PAGE 3
118 bit sd2000_wait_ack(void)
119 {
120 1 u_char errtime=255;
121 1
122 1 SDA=1;
123 1 sd2000_wait();
124 1 SCL=1;
125 1 sd2000_wait();
126 1
127 1 while(SDA)
128 1 {
129 2 errtime--;
130 2 if(!errtime)
131 2 return 0;
132 2 }
133 1
134 1 SCL=0;
135 1 return 1;
136 1 }
137
138 /****************************************************************************/
139 /* 函数名:sd2000_send_byte */
140 /* 功 能:MCU向sd2000设备发送一个字节 */
141 /* 作 者:spot */
142 /* 输 入: */
143 /* demand 待发送命令或数据 */
144 /* order 1,发送命令; 0,发送数据 */
145 /* */
146 /* 输 出:无 */
147 /* */
148 /* 历史记录: */
149 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
150 /****************************************************************************/
151 void sd2000_send_byte(u_char demand, bit order)
152 {
153 1 u_char i = 8;
154 1
155 1 if (order)
156 1 {
157 2 while(i--)
158 2 {
159 3 SCL = 0;
160 3 _nop_();
161 3 SDA = (bit)(demand&0x80);
162 3 demand <<= 1;
163 3 sd2000_wait();
164 3 SCL = 1;
165 3 sd2000_wait();
166 3 }
167 2 SCL=0;
168 2 }
169 1 else
170 1 {
171 2 while(i--)
172 2 {
173 3 SCL = 0;
174 3 _nop_();
175 3 SDA = (bit)(demand&0x01);
176 3 demand >>= 1;
177 3 sd2000_wait();
178 3 SCL = 1;
179 3 sd2000_wait();
C51 COMPILER V6.12 SD2KDRV 09/23/2005 17:32:57 PAGE 4
180 3 }
181 2 SCL=0;
182 2 }
183 1
184 1 }
185
186 /****************************************************************************/
187 /* 函数名:sd2000_receive_byte */
188 /* 功 能:MCU从sd2000设备接收一个字节 */
189 /* 作 者:spot */
190 /* 输 入:无 */
191 /* 输 出:ddata 接收数据 */
192 /* */
193 /* 历史记录: */
194 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
195 /****************************************************************************/
196 u_char sd2000_receive_byte(void)
197 {
198 1 u_char i=8;
199 1 u_char ddata=0;
200 1
201 1 SDA=1;
202 1 while(i--)
203 1 {
204 2 ddata >>= 1;
205 2 SCL=0;
206 2 sd2000_wait();
207 2 SCL=1;
208 2 sd2000_wait();
209 2 if(SDA)
210 2 {
211 3 ddata |= 0x80;
212 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -