新闻中心

EEPW首页>嵌入式系统>设计应用> 浅谈单片机c语言模块化编程-附ds1302时钟芯片驱动程序

浅谈单片机c语言模块化编程-附ds1302时钟芯片驱动程序

作者: 时间:2016-11-20 来源:网络 收藏
单片机c语言编程中,模块化编程显得非常重要。我觉得,模块化恰恰体现了c语言很好的可移植性。嵌入式编程中,硬件模块区分非常明显,所以驱动程序用模块化编程显得十分方便简洁。
报错原因,修改了不能修改的变量。

本文引用地址: //m.amcfsurvey.com/article/201611/318723.htm

C51中为了节省ram资源,数组用code定义在rom中,这样定义数组就不能重新赋值。

自己对着例程一条一条的看。真心表示没有发现错误。最后把函数一个一个替换成例程中的。最终确定在ds1302_write_byte中。发现了一个很奇特的事情。错误是因为fou循环,我用for(i=0;i<8;i++)替换成为for(i=8;i>0;i--)解决了问题。

extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。

使用模块化编程的时候,在.h里声明了数组。.c文件直接使用数组,在连接时会出现错误multiple public definition。

在.h文件用extren声明数组,在.c文件声明赋值。错误解决。

附ds1302时钟芯片驱动程序

void ds1302_write_byte(unsigned char d)
{

unsigned char i;
ACC=d;
for(i=0;i<8;i++)//改成i=0;i<8;没有现象。。为嘛呀。。。
{
io=ACC0;
//delayus(1);
sck=1;
//delayus(1);
sck=0;
ACC=ACC>>1;
}
}

void ds1302_write(uchar ad,uchar dat)
{
rst=0;
sck=0;
rst=1;
//delayus(1);
ds1302_write_byte(ad);
ds1302_write_byte(dat);
sck=1;
rst=0;
}
unsigned char ds1302_read_byte()
{

unsigned char i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
ACC7 =io;
sck=1;
//delayus(1);
sck=0;
//delayus(1);
}
return (ACC);

}
unsigned char ds1302_read(unsigned char add)
{
unsigned char ucdat;
rst=0;
sck=0;
rst=1;
//delayus(1);
ds1302_write_byte(add);
ucdat=ds1302_read_byte();
sck=1;
rst=0;
return ucdat;
}


void ds1302_init()
{

ds1302_write(0x8E,0x00);

}




评论


技术专区

关闭