DS1302程序
ds1302程序 bit DS18B20_ReadBit(void) // 读一位 { uint i; bit dat; DS=0;i++; //小延时一下 DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat); } uchar DS18B20_ReadByte(void) //读一个字节 { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=DS18B20_ReadBit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里 } return(dat); //将一个字节数据返回 } void DS18B20_WriteByte(uchar dat) { //写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) // 写1部分 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //写0部分 i=8;while(i>0)i--; DS=1; i++;i++; } } } 根据提供的文件信息,本文主要涉及DS1302实时时钟芯片的操作以及与液晶显示器(LCD)相关的控制程序。下面将详细解析文件中的关键代码片段及其功能。 ### DS1302基本操作 #### 读取一位数据 ```c bit DS18B20_ReadBit(void) { uint i; bit dat; DS=0;i++; // 小延时 DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat); } ``` 此函数用于从DS1302读取一位数据。首先通过设置DS引脚低电平来启动读取过程,然后设置DS引脚为高电平以接收数据。`dat`变量存储接收到的数据位,并返回该值。 #### 读取一个字节 ```c uchar DS18B20_ReadByte(void) { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=DS18B20_ReadBit(); dat=(j<<7)|(dat>>1); } return(dat); } ``` 此函数读取DS1302的一个字节数据。它通过循环调用`DS18B20_ReadBit`函数八次来读取每个数据位,并将它们组合成一个完整的字节。注意,数据是以最低位在前的方式读取的。 #### 写入一个字节 ```c void DS18B20_WriteByte(uchar dat) { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; i=8;while(i>0)i--; DS=1; i++;i++; } } } ``` 此函数向DS1302写入一个字节数据。它通过循环处理每一位数据,使用`testb`变量判断当前位是否为1,从而决定写入0或1。 ### LCD控制程序 #### 延时函数 ```c void Delay_ms(uint xms) { uint i, j; for(i = xms; i > 0; i--) for(j = 110; j > 0; j--); } ``` 此函数实现指定毫秒的延时。通过嵌套循环来达到延时的效果,适用于对精确度要求不高的场合。 #### 检查LCD是否忙碌 ```c bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0 & 0x80); LCD_EN = 0; return result; } ``` 此函数用于检查LCD是否正在执行其他操作。通过发送读命令并检查P0口的高位(通常代表忙碌状态),可以确定LCD是否准备好接受新指令。 #### 写入指令 ```c void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EN = 1; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EN = 0; } ``` 此函数用于向LCD写入指令。在写入指令之前,先确保LCD不处于忙碌状态。之后按照正确的顺序设置LCD的控制信号并发送指令。 #### 写入数据 ```c void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EN = 1; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EN = 0; } ``` 此函数用于向LCD写入数据。与写入指令类似,但在写入数据之前会检查LCD是否忙碌,并且设置LCD_RS为1表示要写入的是数据。 ### 结论 以上代码片段展示了如何通过软件控制DS1302实时时钟芯片进行基本的数据读写操作,以及如何与液晶显示器进行交互。这些函数是构建基于DS1302的时钟系统的基石,可以帮助开发人员轻松地集成实时时钟功能到各种项目中。此外,通过对LCD控制程序的理解,开发人员可以更好地设计用户界面,提高产品的用户体验。
剩余8页未读,继续阅读
- kiddreamken2013-10-05可以用 好东西 谢谢分享
- TQMCU2013-11-04不错,值得学习
- aimicromouse2013-09-18非常好呀,谢谢
- eysionvk12015-06-09好东西,可以用,谢谢
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助