📄 text1.lst
字号:
152 1 PORTC&=~BIT(RTC_CS); //拉低片选端
153 1 PORTB&=~BIT(RTC_CLK); //拉低时钟端
154 1 Delayus(10);
155 1 PORTC|=BIT(RTC_CS); //拉高片选端
156 1 Delayus(10); //调整片选脉冲
157 1 DS1302_writeB(addr); //写入操作命令(地址)
C51 COMPILER V7.06 TEXT1 01/31/2009 12:11:09 PAGE 4
158 1 Delayus(10);
159 1 data=DS1302_readB(); //读出数据
160 1 Delayus(10);
161 1 PORTB&=~BIT(RTC_CLK); //拉低时钟端
162 1 PORTC&=~BIT(RTC_CS); //拉低片选端
163 1 return data; //返回读出的数据
164 1 }
165 /*******************************************
166 函数名称: DS1302_setT
167 功 能: 设置DS1302的时间
168 参 数: ptTimeD--设置时间数组指针
169 返回值 : 无
170 /********************************************/
171 void DS1302_setT(uchar ptTimeD[])
172 {
173 1 uchar i;
174 1 uchar addr = 0x80; //写入地址从秒寄存器开始
175 1 DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
176 1 Delayms(5);
177 1 for(i=0;i<7;i++)
178 1 {
179 2 DS1302_writeD(addr|WR,ptTimeD[i]); // 秒 分 时 日 月 星期 年
180 2 addr+=2;
181 2 Delayms(1);
182 2 }
183 1 DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
184 1 }
185 /*******************************************
186 函数名称: DS1302_getT
187 功 能: 读取DS1302的当前时间
188 参 数: time[]--读取的时间数组
189 返回值 : 无
190 /********************************************/
191 void DS1302_getT(uchar time[])
192 {
193 1 uchar i;
194 1 ////////下面的是单次读写//////////////////////////
195 1 /* uchar addr = 0x80; //读取地址从秒寄存器开始
196 1 for(i=0;i<7;i++)
197 1 {
198 1 time[i]=DS1302_readD(addr|RD); // 秒 分 时 日 月 星期 年
199 1 addr+=2;
200 1 }*/
201 1 ////////////////////////////////////////////////////
202 1 /////////下面是多字节读取///////////////
203 1 PORTC&=~BIT(RTC_CS); //拉低片选端
204 1 Delayus(10);
205 1 PORTC|=BIT(RTC_CS); //拉高片选端
206 1 Delayus(10); //调整片选脉冲
207 1 DS1302_writeB(0xbf); // 0xbf:时钟多字节读取命令
208 1 for (i=0;i<8;i++) //时间数据的存放格式是:
209 1 { //秒,分,时,日,月,星期,年,控制
210 2 time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】
211 2 }
212 1
213 1 PORTC&=~BIT(RTC_CS); //拉低片选端
214 1 ///////////////////////////////////////////////
215 1 PORTB&=~BIT(RTC_CLK); //拉低时钟端(时钟端在不操作时为低)
216 1 }
217 /*******************************************
218 函数名称: DS1302_check
219 功 能: 检测DS1302是否正常工作
C51 COMPILER V7.06 TEXT1 01/31/2009 12:11:09 PAGE 5
220 参 数: 无
221 返回值 : exist--为TRUE为检测到DS1302,为FALSE为没检测到
222 /********************************************/
223 uchar DS1302_check(void)
224 {
225 1 uchar exist;
226 1 DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
227 1 DS1302_writeD(C_RAMBASE|WR,0xA5); //RAM0写入0xA5
228 1 exist=DS1302_readD(C_RAMBASE|RD); //读取RAM0
229 1 if(exist==0xA5)
230 1 {
231 2 exist=TRUE; //如果读取值与写入值相等,返回TRUE
232 2 }
233 1 else
234 1 {
235 2 exist=FALSE; //如果读取值与写入值不相等,返回FALSE
236 2 }
237 1 return exist;
238 1 }
239 /*******************************************
240 函数名称: DS1302_init
241 功 能: 初始化DS1302
242 参 数: 无
243 返回值 : 无
244 /********************************************/
245 void DS1302_init(void)
246 {
247 1 DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
248 1 DS1302_writeD(C_SEC|WR,CLK_START); //启动振荡器,DS1302开始工作
249 1 DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
250 1 }
251 /*******************************************
252 函数名称: BCD_ASCII
253 功 能: 将压缩BCD码转换成ascii码
254 参 数: BCD--将要转换的压缩BCD码
255 ptasc--转换后的ASCII码数组指针
256 返回值 : 无
257 /********************************************/
258 void BCD_ASCII(uchar BCD,uchar ptasc[])
259 {
260 1 ptasc[0]=BCD/16|0x30; //0X58 35 38 //转换十位
261 1 ptasc[1]=BCD&0x0F|0x30; //转换个位
262 1 }
263 /*******************************************
264 函数名称: Disp_time
265 功 能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
266 参 数: time[]--时间数组
267 返回值 : 无
268 /********************************************/
269 void Disp_time(uchar time[])
270 {
271 1 uchar i,asc[2];
272 1 uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
273 1 uchar line2[9]={0,0,':',0,0,':',0,0,'\0'}; //显示第2行的字符数组
274 1 for(i=0;i<3;i++) //为第2行的字符数组赋值
275 1 {
276 2 BCD_ASCII(time[2-i],asc);
277 2 line2[i*3]=asc[0];
278 2 line2[i*3+1]=asc[1];
279 2 }
280 1 BCD_ASCII(time[6],asc); //为第1行的年赋值
281 1 line1[0]=asc[0];
C51 COMPILER V7.06 TEXT1 01/31/2009 12:11:09 PAGE 6
282 1 line1[1]=asc[1];
283 1 BCD_ASCII(time[4],asc); //为第1行的月赋值
284 1 line1[3]=asc[0];
285 1 line1[4]=asc[1];
286 1 BCD_ASCII(time[3],asc); //为第1行的日赋值
287 1 line1[6]=asc[0];
288 1 line1[7]=asc[1];
289 1 BCD_ASCII(time[5],asc); //为第1行的星期赋值
290 1 line1[9]=asc[1];
291 1
292 1 while(LCD1602_readBF());
293 1 LCD1602_gotoXY(1,2); //第1行从第3个位置开始显示
294 1 LCD1602_sendstr("20"); //将07年显示为2007的形式
295 1 LCD1602_sendstr(line1); //第1行显示
296 1 while(LCD1602_readBF());
297 1 LCD1602_gotoXY(2,4); //第2行从第5个位置开始显示
298 1 LCD1602_sendstr(line2); //第2行显示
299 1 }
300 /*******************************************
301 函数名称: main
302 功 能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当
-前设置位选择)
303 参 数: 无
304 返回值 : 无
305 /********************************************/
306 void main(void)
307 {
308 1
309 1
310 1 uchar setadd,setdat,shift; //setadd指定将当前数值送入DS1302的哪个寄存器
311 1 //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
312 1 //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
313 1 uchar dis_x,dis_y; //存储1602液晶当前光标的位置
314 1 uchar settime[7]={0x50,0x59,0x23,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
315 1 uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
316 1 LCD1602_initial(); //初始化1602液晶
317 1 DS1302_portinit(); //初始化DS1302的三根数据线
318 1 DS1302_init(); //启动振荡器,DS1302开始工作
319 1 DS1302_setT(settime); //设置初始时间
320 1 while(1) //以下程序完成显示和设置时间
321 1 {
322 2 DS1302_getT(gettime); //获得当前时间
323 2
324 2 Disp_time(gettime); //显示当前时间
325 2 }
326 1 }
C51 COMPILATION COMPLETE. 3 WARNING(S), 19 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -