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

 在单片机c语言编程中,模块化编程显得非常重要。我觉得,模块化恰恰体现了c语言很好的可移植性。嵌入式编程中,硬件模块区分非常明显,所以驱动程序用模块化编程显得十分方便简洁。
        详细规则不在赘述,可以百度c语言模块化编程。
        大概的步骤就是,每一个c文件,命名一个h文件,尽量文件名一致,c文件中包含h文件,在其他c文件中包涵.h文件就是包含了该文件。如果函数要外部调用。需在.h文件中声明。
        如果是变量的话尽量用extern在.h文件声明,变量不一定报错,如果是数组的话,在连接时是会出错的。
贴出今天操作感悟。

        unmodifiable lvalue报错原因,修改了不能修改的变量。

        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);

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值