m41t0drv.lst
来自「C8051ucos源码」· LST 代码 · 共 230 行
LST
230 行
C51 COMPILER V8.02 M41T0DRV 01/09/2009 16:21:05 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE M41T0DRV
OBJECT MODULE PLACED IN M41T0DRV.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE program\M41T0DRV.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\M41T0DRV.lst) OB
-JECT(M41T0DRV.obj)
line level source
1 /*=======================================================================================================
2
3 M41T0drv是面向M41T0芯片的驱动程序
4
5 建立于:2005.08.01
6 编写人:杨术轩
7
8 =======================================================================================================*/
9
10 #include "C8051F020.h"
11 #include "M41T0DRV.h"
12
13 #define M41T0ClkDelay 10
14 #define M41T0SCL P1_5
15 #define M41T0SDA P1_4
16
17 //---------------------------------------------------------------------------------
18 //IIC总线的开始状态
19 void M41T0I2CStart(void)
20 {
21 1 unsigned char wait;
22 1 for(wait=0;wait<M41T0ClkDelay;wait++);
23 1 M41T0SDA = 1;
24 1 M41T0SCL = 1;
25 1 for(wait=0;wait<M41T0ClkDelay;wait++);
26 1 M41T0SDA = 0;
27 1 for(wait=0;wait<M41T0ClkDelay;wait++);
28 1 M41T0SCL = 0;
29 1 for(wait=0;wait<M41T0ClkDelay;wait++);
30 1 }
31 //----------------------------------------------------------------------------------
32 //IIC总线的停止状态
33 void M41T0I2CStop(void)
34 {
35 1 unsigned char wait;
36 1 M41T0SCL = 0;
37 1 M41T0SDA = 0;
38 1 for(wait=0;wait<M41T0ClkDelay;wait++);
39 1 M41T0SCL = 1;
40 1 for(wait=0;wait<M41T0ClkDelay;wait++);
41 1 M41T0SDA = 1;
42 1 }
43 //----------------------------------------------------------------------------------
44 //向从器件写出一个字节 ch,同时判断ack返回
45 //返回:ack的状态
46 unsigned char M41T0I2CByteWr(unsigned char ch)
47 {
48 1 unsigned char i,wait;
49 1 for (i=0; i<8; i++)
50 1 {
51 2 if(ch&0x80) M41T0SDA=1; else M41T0SDA=0;
52 2 ch<<=1;
53 2 for(wait=0;wait<M41T0ClkDelay;wait++);
54 2 M41T0SCL = 1;
C51 COMPILER V8.02 M41T0DRV 01/09/2009 16:21:05 PAGE 2
55 2 for(wait=0;wait<M41T0ClkDelay;wait++);
56 2 M41T0SCL = 0;
57 2 for(wait=0;wait<M41T0ClkDelay;wait++);
58 2 }
59 1 M41T0SDA=1;
60 1 for(wait=0;wait<M41T0ClkDelay;wait++);
61 1 M41T0SCL = 1;
62 1 if(M41T0SDA)i=1;else i=0;
63 1 for(wait=0;wait<M41T0ClkDelay;wait++);
64 1 M41T0SCL = 0;
65 1 return i;
66 1 }
67 //-----------------------------------------------------------------------------------
68 //从从器件读入一个字节
69 //reack:是反给从器件的应答信号
70 //返回:读入的字节
71 unsigned char M41T0I2CByteRd(unsigned char reack)
72 {
73 1 unsigned char i,val,wait;
74 1 M41T0SDA = 1;
75 1 for (i=0; i<8; i++)
76 1 {
77 2 for(wait=0;wait<M41T0ClkDelay;wait++);
78 2 M41T0SCL = 1;
79 2 val<<=1;
80 2 if(M41T0SDA) val|=1;
81 2 for(wait=0;wait<M41T0ClkDelay;wait++);
82 2 M41T0SCL = 0;
83 2 }
84 1 for(wait=0;wait<M41T0ClkDelay;wait++);
85 1 if (reack)M41T0SDA = 1;else M41T0SDA = 0;
86 1 for(wait=0;wait<M41T0ClkDelay;wait++);
87 1 M41T0SCL = 1;
88 1 for(wait=0;wait<M41T0ClkDelay;wait++);
89 1 M41T0SCL = 0;
90 1
91 1 return val;
92 1 }
93 //========================================================================================================
-===
94 //向m41t0写一组数据
95 //参数
96 // adr:M41T0内部的地址
97 // pbuf:写出的数据指针
98 // len:写出的数据长度
99 unsigned char M41T0Write(unsigned char adr,unsigned char *pbuf,unsigned char len)
100 {
101 1 M41T0I2CStart();
102 1 if(M41T0I2CByteWr(0xd0))return 1;
103 1 if(M41T0I2CByteWr(adr))return 1;
104 1 while(len--)
105 1 {
106 2 if(M41T0I2CByteWr(*pbuf++))return 1;
107 2 }
108 1 M41T0I2CStop();
109 1 return 0;
110 1 }
111 //------------------------------------------------------------------------------------------------------
112 //从m41t0读一组数据
113 //参数
114 // adr:M41T0内部的地址
115 // pbuf:读入的数据指针
C51 COMPILER V8.02 M41T0DRV 01/09/2009 16:21:05 PAGE 3
116 // len:读入的数据长度
117 unsigned char M41T0Read(unsigned char adr,unsigned char *pbuf,unsigned char len)
118 {
119 1 if(len==0)return 0;
120 1 M41T0I2CStart();
121 1 M41T0I2CByteWr(0xd0);
122 1 M41T0I2CByteWr(adr);
123 1 M41T0I2CStop();
124 1 M41T0I2CStart();
125 1 M41T0I2CByteWr(0xd1);
126 1
127 1 while(len--)
128 1 {
129 2 if(len!=0)*pbuf++ = M41T0I2CByteRd(0);
130 2 else *pbuf++ = M41T0I2CByteRd(1);//读取最后一个字节后ACK的值必须是1
131 2 }
132 1
133 1 M41T0I2CStop();
134 1 return 0;
135 1 }
136 //========================================================================================================
-===
137 //获取日期时间
138 unsigned char GetM41T0Time(DateTimeTYP *datetime)
139 {
140 1 unsigned char buf[8];
141 1 unsigned char *ptr = (unsigned char *) datetime;
142 1 unsigned char i;
143 1 for(i=0;i<5;i++)
144 1 {
145 2 M41T0Read(0,buf,8);
146 2 if((buf[0]>>4)>6||(buf[0]&0x0f)>9)continue;
147 2 if((buf[1]>>4)>6||(buf[1]&0x0f)>9)continue;
148 2 if((buf[2]>>4)>2||(buf[2]&0x0f)>9)continue;
149 2 if((buf[4]>>4)>3||(buf[4]&0x0f)>9)continue;
150 2 if((buf[5]>>4)>1||(buf[5]&0x0f)>9)continue;
151 2 if((buf[6]>>4)>9||(buf[6]&0x0f)>9)continue;
152 2 *ptr++ = buf[0];
153 2 *ptr++ = buf[1];
154 2 *ptr++ = buf[2];
155 2 *ptr++ = buf[4];
156 2 *ptr++ = buf[5];
157 2 *ptr++ = buf[6];
158 2 return 0;
159 2 }
160 1 return 1;
161 1 }
162 //------------------------------------------------------------------------------------------------------
163 //设置日期时间
164 //返回:非零数正确
165 unsigned char SetM41T0Time(DateTimeTYP *datetime)
166 {
167 1 idata unsigned char buf[7];
168 1 idata unsigned char *ptr = (unsigned char *) datetime;
169 1 M41T0Write(1,"\x80",1);
170 1 buf[0] = datetime->sec;
171 1 buf[1] = datetime->min;
172 1 buf[2] = datetime->hour;
173 1 buf[3] = 0x01;
174 1 buf[4] = datetime->date;
175 1 buf[5] = datetime->month;
176 1 buf[6] = datetime->year;
C51 COMPILER V8.02 M41T0DRV 01/09/2009 16:21:05 PAGE 4
177 1
178 1 if((buf[0]>>4)>6||(buf[0]&0x0f)>9)return 0;
179 1 if((buf[1]>>4)>6||(buf[1]&0x0f)>9)return 0;
180 1 if((buf[2]>>4)>2||(buf[2]&0x0f)>9)return 0;
181 1 if((buf[4]>>4)>3||(buf[4]&0x0f)>9)return 0;
182 1 if((buf[5]>>4)>1||(buf[5]&0x0f)>9)return 0;
183 1 if((buf[6]>>4)>9||(buf[6]&0x0f)>9)return 0;
184 1
185 1 M41T0Write(6,&buf[6],1);
186 1 M41T0Write(5,&buf[5],1);
187 1 M41T0Write(4,&buf[4],1);
188 1 M41T0Write(3,&buf[3],1);
189 1 M41T0Write(2,&buf[2],1);
190 1 M41T0Write(1,&buf[1],1);
191 1 M41T0Write(0,&buf[0],1);
192 1 return 1;
193 1 }
194
195 //=======================================================================================================
196
197
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1105 ----
CONSTANT SIZE = 2 ----
XDATA SIZE = ---- 25
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- 10
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?