这是时钟芯片Ds1302程序,在下列程序中控制字是怎么生成的?控制字不是可以设定的吗?为什么在程序中看不到呢?形参addr和dat 在何处给赋值了呢?该程序在开发板上是可用的。
#include”ds1302.h”
//–DS1302Ð写入和读取的地址命令–//
Uchar code READ_RTC_ADDR[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; // 读取
uchar code WRITE_RTC_ADDR[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; // 写入
//–发送秒,分,时,日,星期,月,年BCD码–//
uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13}; //
/***发送(地址、数据)***/
void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0; // 将CE端置低
_nop_();
SCLK = 0; // 将SCLK端置高
_nop_();
RST = 1; // 将CE端置高
_nop_();
for (n=0; n<8; n++) // 8次循环
{
SCLK = 0; // 清零时钟总线
_nop_();
DSIO = addr & 0x01; // 每次传输低字节
addr >>= 1; //· 右循环1位
SCLK = 1; // 置位时钟总线
_nop_();
}
//– 发送数据–//
for (n=0; n<8; n++) // 8次循环
{
SCLK = 0; //
_nop_();
DSIO = dat & 0x01; // 每次传输低字节
dat >>= 1; //· 右循环1位
SCLK = 1; // 置位时钟总线
_nop_();
}
RST = 0; //
_nop_();
}
/***读取地址和数据***/
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0; // 清零时钟总线
_nop_();
RST = 1; //
_nop_();
for (n=0; n<8; n++) // 8次循环
{
SCLK = 0; // 清零时钟总线
_nop_();
DSIO = addr & 0x01;
addr >>= 1; //·右循环1位
SCLK = 1; // 置位时钟总线
_nop_();
}
#include”ds1302.h”
//–DS1302Ð写入和读取的地址命令–//
Uchar code READ_RTC_ADDR[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; // 读取
uchar code WRITE_RTC_ADDR[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; // 写入
//–发送秒,分,时,日,星期,月,年BCD码–//
uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13}; //
/***发送(地址、数据)***/
void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0; // 将CE端置低
_nop_();
SCLK = 0; // 将SCLK端置高
_nop_();
RST = 1; // 将CE端置高
_nop_();
for (n=0; n<8; n++) // 8次循环
{
SCLK = 0; // 清零时钟总线
_nop_();
DSIO = addr & 0x01; // 每次传输低字节
addr >>= 1; //· 右循环1位
SCLK = 1; // 置位时钟总线
_nop_();
}
//– 发送数据–//
for (n=0; n<8; n++) // 8次循环
{
SCLK = 0; //
_nop_();
DSIO = dat & 0x01; // 每次传输低字节
dat >>= 1; //· 右循环1位
SCLK = 1; // 置位时钟总线
_nop_();
}
RST = 0; //
_nop_();
}
/***读取地址和数据***/
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0; // 清零时钟总线
_nop_();
RST = 1; //
_nop_();
for (n=0; n<8; n++) // 8次循环
{
SCLK = 0; // 清零时钟总线
_nop_();
DSIO = addr & 0x01;
addr >>= 1; //·右循环1位
SCLK = 1; // 置位时钟总线
_nop_();
}
for (n=0; n<8; n++) // 8次循环
{
SCLK = 0; // 清零时钟总线
_nop_();
dat1 = DSIO;
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
}
RST = 0;
_nop_();
SCLK = 1; // 置位时钟总线
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
/***初始化Ds1302***/
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); // 关闭写保护功能
for (n=0; n<7; n++) // 写入秒、分、时、日、星期、月、年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); // 打开写保护功能
}
/*** ***/
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++) // 读取7个时钟信号
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}
解决方案
10
函数在哪里调用 addr就在哪里给了值
30
void Ds1302Write(uchar addr, uchar dat) //函数声明
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);//函数调用
addr<===> WRITE_RTC_ADDR[n]
dat<===>TIME[n]
函数调用时候,会用实参表达式,初始化形参变量
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);//函数调用
addr<===> WRITE_RTC_ADDR[n]
dat<===>TIME[n]
函数调用时候,会用实参表达式,初始化形参变量