📄 改动后ds1302.txt
字号:
// 关于DS1302的子程序集
/* command 是命令控制寄存器
bytecon 是每次要发送的字节个数
data_value 是要传输的数据
RA0 与DS1302的CLK连接
RA1 与I/O 相对应
RA2 与RES相连接
RTC Real Time Clock
*/
#define RTC_SCLK RA0
#define RTC_IO RA1
#define RTC_RES RA2
unsigned char command;
unsigned char bytecon;
unsigned char data_value;
void write_enable();
void write_disenable();
void osc_enable();
void osc_disenable();
void send_bytes(char*pp);
void receive_bytes(char*pp);
void write_singlebyte(unsigned char ord_reg;unsigned char data);
void write_bytes(char*p);
void read_singlebyte(unsigned char data, char*p)
void read_bytes(char*p);
void initds1302();
void initds1302()
{
ADCON1=0X07;
TRISA0=0;
TRISA0=1;
TRISA0=2;
}
// 向DS1301写入数据
void write_enable()
{
command=0x8e; // #8e是对写的考虑
bytecon=0x01; // 送一个字节
data_value=0x00; // 送的数据值是“00” 最高位是wp=0
//允许写入
send_bytes(&data_value);
}
//禁止写入数据
void write_disenable()
{
command=0x8e;
bytecon=0x01;
data_value=0x80; //WP=1是写保护,因此是禁止写入的
send_bytes(&data_value);
}
//起振
void osc_enable()
{
command=0x80;
bytecon=0x01;
data_value=0x00; //秒的最高位CH=0则启动振荡
send_bytes(&data_value);
}
//停止振荡
void osc_disenable()
{
command=0x80;
bytecon=0x01;
data_value=0x80; //秒的最高位CH=1则停止振荡
send_bytes(&data_value);
}
//发送数据给DS1302
void send_bytes(char *pp)
{
unsigned char bitcon;// 定义一个位循环变量
unsigned char movbit;
char *pd; //point data
PORTA=0XFF;
RTC_RES=0; //将RES置低电平,为通信好作准备 。此时是禁止的
pd=pp; //作为空语句,为了填补空语句
RTC_SCLK=0; //将RES置为高电平的条件
movbit=command; //复值给移位寄存器
RTC_RES=1; //使之可以进行通信
for(bitcon=0x08;bitcon>0;--bitcon)//命令控制器是SCLK的上升沿
{
RTC_IO=movbit; //默认是取最低位
RTC_SCLK=1;
movbit=movbit>>1; //利用C语言的移位指令 vari>>bit是左移
RTC_SCLK=0;
}
/* 1.因为是写入数据所以也是时钟的上升沿
2.由于可以是单字节,又可以是多字节所以我们选择指针来做
3.为了可以很好的用,我们最好先归定好他们的地址方便调用
*/
pd=pp; //给指针初始的地址
while(bytecon!=0)
{
movbit=*pd;
for(bitcon=0x08;bitcon>0;--bitcon)
{
RTC_IO=movbit;
RTC_SCLK=1;
movbit=movbit>>1;
RTC_SCLK=0;
}
bytecon--;
pd++; //指针可以指向时钟
}
RTC_RES=0; //禁止数据通信
}
//写给DS1302的单元中
void write_singlebyte(unsigned char ord_reg,unsigned char data)
{
command=ord_reg;
bytecon=0x01;
data_vlaue=data;
send_bytes(&data_value);
}
void write_bytes(char*p)
{
char*ptr;
//write_enable(); //写多字节数据
command=0x8e;
bitcon=0x08;
data_value=0;// 是允许写入
ptr=&data_value;
++ptr;
int i;
for(i=0;i<7;i++)
++ptr=++p; // 让PTR 与P指向同一变量
ptr=&data_value;
send_bytes(ptr);
}
//从DS1302中读出数据
void read_singlebyte(unsigned char data, char*p)
{
command=data;//选择要读的寄存器
bytecon=0x1;
receive_bytes(p); //还需要读到那里
}
//读多个字
void read_bytes(char *p)
{
command=0xbf; //奇数是读rd,偶数是写w
bytecon=0x08;
receive_bytes(p);
}
//读是下降沿有效
void receive_bytes(char*pp)
{
char dp;
unsigned char bitcon;
unsigned char movbit;
RTC_RES=0;
dp=p ;
RTC_SCLK=0;
movbit=command;
RTC_RES=1;// 打开数据通道
for(bitcon=0x08;bitcon>0;--bitcon)
{
movbit=RTC_IO;
RTC_SCLK=1;
movbit=movbit<<1;
RTC_SCLK=0;
}
//接收数据则要下降沿
//命令已经发送完成了,现在开始接收数据了,所以要该变传输方向
TRISA1=1; //
while(bytecon!=0)
{
for(bitcon=0x08;bitcon>0;--bitcon)
{
movbit=RTC_I;
RTC_SCLK=0;
movbit=movbit<<1;
RTC_SCLK=1;
}
*dp=movbit; //把移出的数据交给指针
dp++; //让指针指向下一个数
bytecon--;
}
RTC_RES=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -