微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 有没有人能帮我在这个程序基础上添加一下ds1302读取的子程序 啊

有没有人能帮我在这个程序基础上添加一下ds1302读取的子程序 啊

时间:10-02 整理:3721RD 点击:

这程序的时间是我一开始随便写的,老师要求从ds1302读取时间,我该怎么改啊?
#include<reg51.h>
#define uint   unsigned int
#define uchar  unsigned char
#define rst RST=0;
#define nrst RST=1;
void init();
void write_com(uchar);
void write_data(uchar);
void delay(uint);
void write_sfm(uchar,uchar);
void keyscan();
void wr_byte(uchar dat);
uchar count,num,s1num;
char shi,fen,miao;
uchar code table[]=" 2016-7-1 Fri";
uchar code table1[]="    00:00:00";
sbit rw=P2^5;                //内部拐角的设置
sbit rd=P2^6;
sbit lcde=P2^7;
sbit s1=P3^2;
sbit s2=P3^1;
sbit s3=P3^0;
void main()
    {
      init();
     while(1)
      {
       keyscan();
       if(count==20)             //中断1秒               
         {
          count=0;
                        miao++;
          if(miao==60)
            {
              miao=0;
              fen++;
              if(fen==60)
                {
                   fen=0;
                   shi++;
                  if(shi==24)
                    {
                      shi=0;
                    }
                    write_sfm(0x04,shi);  //显示小时
                }
               write_sfm(0x07,fen);       //显示分钟
             }
          write_sfm(0x0a,miao);           //显示秒
        }
      }
   }
void init()                         //初始化函数
    {
      rw=0;                          //进入写操作
      write_com(0x38);                //显示十六位液晶
      write_com(0x0c);               //打开十六位液晶 不显示光标
      write_com(0x06);                //写以为下一个数右移一位写
      write_com(0x01);                 //清屏
      write_com(0x80);                //第一行写
      for(num=0;num<15;num++)
         {
           write_data(table[num]);        //第一行写数据
           delay(5);
         }
      write_com(0x80+0x40);
      for(num=0;num<12;num++)        //第二行写数据
         {
           write_data(table1[num]);
           delay(5);
         }
      TMOD=0x01;                   //定时器0 方式1工作
      TH0=(65536-50000)/256;          //定时器数数1到50000
      TL0=(65536-50000)%256;
      EA=1;                           //打开总中断
      ET0=1;                          //打开T0中断
      TR0=1;                          //启动他T0中断
    }
void write_com(uchar com)
    {
      rd=0;                           //写指令
      lcde=0;                         //使能端拉低
      delay(5);
      P0=com;                        //输入地址
      lcde=1;                         //使能端拉高 工作
      delay(5);                           // 命令输入
      lcde=0;                         //使能端拉低 停止工作
      delay(5);
    }  
void write_data(uchar date)
    {
      rd=1;                           //写数据            
      lcde=0;                         //使能端拉低
      delay(5);
      P0=date;                        //输入数据
      lcde=1;                         //使能端拉高 开始输入数据
      delay(5);                        //五毫秒 数据输入
      lcde=0;                         //拉低使能端 停止工作
      delay(5);
    }  
void delay(uint z)                    //延迟函数
    {
      uint x,y;
      for(x=z;x>0;x--)
        for(y=110;y>0;y--)
                        ;
    }
void time0() interrupt 1            // 中断函数
    {
      TH0=(65536-50000)/256;
      TL0=(65536-50000)%256;
      count++;
    }
void write_sfm(uchar add,uchar date)     //  时 分 秒的显示
    {
      uchar shi,ge;
          shi=date/10;                     //时 分秒最多只有两位分解出来
      ge=date%10;
      write_com(0x80+0x40+add);       //十位的地址
      write_data(0x30+shi);            // 十位
      write_data(0x30+ge);              //写个位
    }
void keyscan()
    {
      if(s1==0)                       //判断s1是否按下
        {
          delay(5);                    //按键消抖
          if(s1==0)                   //按键消抖后判断是否按下      
           {
             s1num++;
             while(!s1);            //按下去不变 手取了变化
              if(s1num==1)           //秒下光标
                {
                 TR0=0;              //关闭中断
                 write_com(0x80+0x40+0x0b); //光标取位
                 write_com(0x0f);      //打开光标
                }
              if(s1num==2)            //分下光标
                {
                 write_com(0x80+0x40+0x08);//光标取位
                }
              if(s1num==3)              //时取位
                {
                 write_com(0x80+0x40+0x05);//光标取位
                }
              if(s1num==4)           
                {
                 s1num=0;
                 write_com(0x0c);      //关闭光标
                 TR0=1;               //打开光标                }
            }
        }
        }
            if(s1num!=0)             //在有光标的前提下 用按键2来给时间++
           {
             if(s2==0)               //2按键是否按下去
               {
                delay(5);              //按键去抖
                if(s2==0)             //去抖后是否还有按键
                  {
                    while(!s2);         //松手后数字变化 按下去不变化
                    if(s1num==1)      //秒的条件下 控制秒的++
                      {
                        miao++;
                        if(miao==60)
                          miao=0;                                
                        write_sfm(0x0a,miao);     //写秒的数据 并且取秒的位置
                        write_com(0x80+0x40+0x0b);//每扫描一次把数字拉回秒的位置
                       }
                    if(s1num==2)
                      {
                       fen++;
                        if(fen==60)
                          fen=0;
                        write_sfm(0x07,fen);
                        write_com(0x80+0x40+0x08);
                      }
                    if(s1num==3)
                      {
                        shi++;
                        if(shi==24)
                           shi=0;
                        write_sfm(0x04,shi);
                        write_com(0x80+0x40+0x05);
                      }
                  }
               }
           }
        if(s1num!=0)                  //在光标显示下 3按键控制时间--
          {
            if(s3==0)                 //是否3按键 按下去
              {
                delay(5);            //  延迟去抖
                if(s3==0)             //在次判断是否有键按下去
                  {
                   while(!s3);         //松手后数字变化 按下去不变化
                   if(s1num==1)
                     {
                       miao--;
                       if(miao==-1)
                                                miao=59;
                        write_sfm(0x0a,miao);
                        write_com(0x80+0x40+0x0b);
                     }
                   if(s1num==2)
                     {
                       fen--;
                       if(fen==-1)
                        fen=59;
                        write_sfm(0x07,fen);
                        write_com(0x80+0x40+0x08);
                     }
                    if(s1num==3)
                     {
                        shi--;
                       if(shi==-1)
                        shi=23;
                        write_sfm(0x04,shi);
                        write_com(0x80+0x40+0x05);
                     }
                  }
              }
}
}

加程序肯定没有问题,你得付报酬

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top