📄 sd2kdrv.lst
字号:
C51 COMPILER V6.12 SD2KDRV 09/11/2005 13:05:15 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE SD2KDRV
OBJECT MODULE PLACED IN E:\C51PRJ\RTIMELED\SD2KDRV.OBJ
COMPILER INVOKED BY: d:\keil\c51\BIN\C51.EXE E:\C51PRJ\RTIMELED\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 /* 描 述:在数码管上显示实时时钟 */
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 /* */
25 /* 历史记录: */
26 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
27 /****************************************************************************/
28 #include <reg52.h>
29 #include <absacc.h>
30 #include <intrins.h>
31 #include "../includes/types.h"
32
33 sbit SDA = P0^6; /* sd2000数据传送位 */
34 sbit SCL = P0^7; /* sd2000时钟控制位 */
35
36 /* 函数声明 */
37 void sd2000_wait(void); /* sd2000延时 */
38 void sd2000_start(void); /* 开启sd2000总线 */
39 void sd2000_stop(void); /* 关闭sd2000总线 */
40 void sd2000_ack(void); /* 发送ACK信号 */
41 void sd2000_no_ack(void); /* 发送NOACK信号 */
42 bit sd2000_wait_ack(void); /* 等待ACK信号 */
43 void sd2000_send_byte(u_char demand, bit order); /* MCU向sd2000发送一个字节 */
44 u_char sd2000_receive_byte(void); /* MCU从sd2000接收一个字节 */
45 void display_time(u_char current_time[2]); /* 在数码管上显示当前时间 */
46
47 extern void load_number(u_char number, bit dp);
48 extern void send_latch_clock(void);
49 extern void clear_led(void);
50 /* 声明结束 */
51
52 u_char date[7];
53
54 /* sd2000延时 */
55 void sd2000_wait(void)
C51 COMPILER V6.12 SD2KDRV 09/11/2005 13:05:15 PAGE 2
56 {
57 1 _nop_();
58 1 _nop_();
59 1 _nop_();
60 1 _nop_();
61 1 }
62
63 /* 开启sd2000总线 */
64 void sd2000_start(void)
65 {
66 1 SDA = 1;
67 1 SCL = 1;
68 1 sd2000_wait();
69 1 SDA = 0;
70 1 sd2000_wait();
71 1 SCL = 0;
72 1 }
73
74 /* 关闭sd2000总线 */
75 void sd2000_stop(void)
76 {
77 1 SDA=0;
78 1 SCL=0;
79 1 sd2000_wait();
80 1 SCL=1;
81 1 sd2000_wait();
82 1 SDA=1;
83 1 }
84
85 /* 发送ACK信号 */
86 void sd2000_ack(void)
87 {
88 1 SDA=0;
89 1 sd2000_wait();
90 1 SCL=1;
91 1 sd2000_wait();
92 1 SCL=0;
93 1 }
94
95 /* 发送NOACK信号 */
96 void sd2000_no_ack(void)
97 {
98 1 SDA=1;
99 1 sd2000_wait();
100 1 SCL=1;
101 1 sd2000_wait();
102 1 SCL=0;
103 1 }
104
105 /****************************************************************************/
106 /* 函数名:sd2000_wait_ack */
107 /* 功 能:等待ACK信号 */
108 /* 作 者:spot */
109 /* 输 入:无 */
110 /* 输 出:1-ACK 0-ERROR */
111 /* */
112 /* 历史记录: */
113 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
114 /****************************************************************************/
115 bit sd2000_wait_ack(void)
116 {
117 1 u_char errtime=255;
C51 COMPILER V6.12 SD2KDRV 09/11/2005 13:05:15 PAGE 3
118 1
119 1 SDA=1;
120 1 sd2000_wait();
121 1 SCL=1;
122 1 sd2000_wait();
123 1
124 1 while(SDA)
125 1 {
126 2 errtime--;
127 2 if(!errtime)
128 2 return 0;
129 2 }
130 1
131 1 SCL=0;
132 1 return 1;
133 1 }
134
135 /****************************************************************************/
136 /* 函数名:sd2000_send_byte */
137 /* 功 能:MCU向sd2000设备发送一个字节 */
138 /* 作 者:spot */
139 /* 输 入: */
140 /* demand 待发送命令或数据 */
141 /* order 1,发送命令; 0,发送数据 */
142 /* */
143 /* 输 出:无 */
144 /* */
145 /* 历史记录: */
146 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
147 /****************************************************************************/
148 void sd2000_send_byte(u_char demand, bit order)
149 {
150 1 u_char i = 8;
151 1
152 1 if (order)
153 1 {
154 2 while(i--)
155 2 {
156 3 SCL = 0;
157 3 _nop_();
158 3 SDA = (bit)(demand&0x80);
159 3 demand <<= 1;
160 3 sd2000_wait();
161 3 SCL = 1;
162 3 sd2000_wait();
163 3 }
164 2 SCL=0;
165 2 }
166 1 else
167 1 {
168 2 while(i--)
169 2 {
170 3 SCL = 0;
171 3 _nop_();
172 3 SDA = (bit)(demand&0x01);
173 3 demand >>= 1;
174 3 sd2000_wait();
175 3 SCL = 1;
176 3 sd2000_wait();
177 3 }
178 2 SCL=0;
179 2 }
C51 COMPILER V6.12 SD2KDRV 09/11/2005 13:05:15 PAGE 4
180 1
181 1 }
182
183 /****************************************************************************/
184 /* 函数名:sd2000_receive_byte */
185 /* 功 能:MCU从sd2000设备接收一个字节 */
186 /* 作 者:spot */
187 /* 输 入:无 */
188 /* 输 出:ddata 接收数据 */
189 /* */
190 /* 历史记录: */
191 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
192 /****************************************************************************/
193 u_char sd2000_receive_byte(void)
194 {
195 1 u_char i=8;
196 1 u_char ddata=0;
197 1
198 1 SDA=1;
199 1 while(i--)
200 1 {
201 2 ddata >>= 1;
202 2 SCL=0;
203 2 sd2000_wait();
204 2 SCL=1;
205 2 sd2000_wait();
206 2 if(SDA)
207 2 {
208 3 ddata |= 0x80;
209 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -