//1.14.6
sbit DSIO = P3~4;
sbit RST = P3~5;
sbit SCLK = P3~6;
void delay(void)
{
unsigned char i = 0;
for (i=0;i<3;i++);
}
//向ds1302的内部寄存器addr写入一个值value
void ds1302_write_reg(unsigned char addr ,unsigned char value)
{
unsigned char i=0; //要循环,先定义个变量。
unsigned char data=0; //定义个变量来取那个数据。
//第一部分:起始(时序的开始)
SCLK =0;
delay(); //在每一个操作了时序的后面都加。
RST =0;
RST =1; //SCLK为低时,RST由低变高,意味着一个总的时钟周期开始。
//一个周期传输一个bit,一个大的周期传输很多个Bit。
//第二部分:写入第二字节,addr;
for (i=0;i<8;i++)
{
data = addr & 0x01; //SPI是从低位开始传输的。
DSIO = dat; //把要发送的bit数据丢到IO引脚上去准备好
SCLK = 1; //制造上升沿,让DS1302把 IO上的值读走
//读走之后,一个小周期就完了。
SCLK = 0; //把SCLK拉低,是为了给下一个小周期做准备。
}
//第三部分:写入第三字节,value;
for (i=0;i<8;i++)
{
data = value & 0x01; //SPI是从低位开始传输的。
DSIO = dat; //把要发送的bit数据丢到IO引脚上去准备好
SCLK = 1; //制造上升沿,让DS1302把 IO上的值读走
delay(); //读走之后,一个小周期就完了。
SCLK = 0; //把SCLK拉低,是为了给下一个小周期做准备。
delay();
value = value >> 1; //把addr右移一位。
}
//第四部分:时序结果。
SCLK = 0; //SCLK拉低为了后面的周期时初始状态是对的。
delay(); //不加的速度太快了。加了牺牲了性能。
RST = 0; //RST拉低地位了一个大周期的结束。
}