精华内容
下载资源
问答
  • DS1302时钟程序

    2015-06-01 18:41:19
    DS1302时钟程序
  • ds1302时钟程序

    2013-06-16 14:16:53
    关于ds1302时钟程序,还有lcd1602显示和温度的显示
  • ds1302 时钟程序详解 ,ds1302 程序流程图 (C 程序 ) ds1302 时钟程序详解 DS1302 的控制字如图 2 所示控制字节的最高有效位 (位 7)必须是逻辑 1如果它为 0 则不能把数据写 入 DS1302 中位 6 如果为 0则表示存取日历...
  • ds1302时钟程序详解ds1302程序流程图C程序 ds1302时钟程序详解 DS1302的控制字如图2所示控制字节的最高有效位 位7必须是逻辑1 ,如果它为0 ,则不能把数据写 入DS1302中位6如果为0,则表示存取日历时钟数据 为1表示存取...
  • DS1302时钟程序.zip

    2020-09-21 11:00:45
    DS1302时钟程序.zip
  • DS1302时钟程序解读

    2021-01-20 11:05:08
    文章目录写在前面一、DS1302写入和读取时分秒的地址命令二、DS1302读/写命令1)、写命令2)、读命令三、DS1302初始化四、读取时钟信息五、DS1302头文件六、主函数附*数码管函数1)、shumguan.h2)、shumaguan.c ...
  • 12864 ks0108屏 ds1302 时钟 程序 入门级
  • proteus中ds1302时钟程序仿真
  • ds1302时钟程序调试好的 大家可以用的
  • ds1302时钟程序,在lcd1602上显示
  • 本程序是通过51单片机读取DS1302实时时钟程序,通过数码管显示,时,分,秒,代码都有注解,欢迎朋友们下载。
  • LCD1602-DS1302时钟程序

    千次阅读 2013-10-23 16:39:00
    //DS1302时钟程序 #include #include #define uchar unsigned char#define uint unsigned int/********************************************************************///少占鱼制作 河北正定欢迎您 长沙航空职业...

      //DS1302时钟程序       
    #include <stc89c52.h>
    #include <intrins.h>
    #define uchar unsigned char
    #define uint unsigned int


    /********************************************************************/
    //少占鱼制作  河北正定欢迎您   长沙航空职业技术学院  2010 年QQ:411656434
    #define LCD1602_RS  P2_5 //定义引脚    
    #define LCD1602_RW  P2_6
    #define LCD1602_E   P2_7
    #define LCD1602_IO  P0


    #define Busy    0x80 //用于检测LCD1602状态字中的Busy标识


    const uchar num[]="  3456789+";
    uchar code a[] = {"  E N v"};
    void WriteData(uchar DAT);
    void WriteCommand(uchar command,BuysC);
    uchar ReadData(void);
    void Readbusy(void);
    void LCD1602_Init(void);
    void DisplayOneChar(uchar X, uchar Y, uchar DData);
    void Displaystring(uchar X, uchar Y, uchar *DData);
    void Delay5Ms(void);
    void Delay400Ms(void);
    void delayms(uint);
    void delays(uint m) ;
    void delayus(uchar x) ;
    sbit DS1302_CLK =P2^0;// P1^0;
    sbit DS1302_IO =P2^1;// P1^1;
    sbit DS1302_RST =P2^2;// P1^2;


    uchar shuju;
    unsigned char time[]={0x11,0x03,0x28,0x01,0x12,0x39,0x00};// 初始化时间年月日星期时分秒     
    uchar  Display_Buffer[12]={"12:25:00"};//时、分、秒 的格式     
    uchar riqi[12]={"11-03-28"};//年、月、日 的格式   
    uchar xingqi[5]="week";//星期
    unsigned char second,minute,hour,week,day,month,year;
    /******************1602函数********************************/


    /********************************************************************/
     void delays(uint m)
    {
    uint i,j;
    for(i=0;i<m;i++)
      {
        for(j=0;j<1000;j++)
         {;}
       }
    }



    void Delay(void)
    {
     unsigned char i;
         unsigned int j;
     for(i=0;i<200;i++)
      for(j=300;j>0;j--);
    }
     
    /*****************************************************************************
    函数功能:向DS1302送一字节数据子程序
    入口参数:
    出口参数:
    *****************************************************************************/
    void InputByte(unsigned char BYTE)
    {
    char i;
    for(i=8;i>0;i--)
    {  //前面在read_ds1302()函数里已经把CLK清0了    
       DS1302_CLK=0;//这里再清0一次,看着清楚。呵呵   
       _nop_();
       DS1302_IO=(bit)(BYTE&0x01);//取出低位数据给数据引脚    
        _nop_();
        _nop_();
        DS1302_CLK=1;//置1,时钟上升沿,引脚上的数据传入1302寄存器中   
       _nop_();
        _nop_();
       BYTE>>=1;//因为这里移位的BYTE不是最后要的结果,虽然最后循环完会多移一位,但没影响。
        _nop_();
     //循环最后一次后,时钟状态是高电平。  
    }
      _nop_();
       _nop_();
    }


    /*****************************************************************************
    函数功能:读DS1302一个字节子程序,读数据是下降沿读
    入口参数:
    出口参数:
    *****************************************************************************/
    unsigned char OutputByte(void)
    {
    unsigned char i;
    unsigned char ucdat=0;
    for(i=8;i>0;i--)
    {  //前面时钟状态是高电平。  
        ucdat>>=1; //移位注意,移位不能放在循环语句末,否则最后循环完会多移一位。得到结果就错了。
       DS1302_IO=1;//单片机端置高防止破坏1302传来的数据,开始接收1302端的高低数据对数据线的改变。    
       DS1302_CLK=0;//紧接着时钟变低,下降沿数据输出。 
       if(DS1302_IO)//数据已经输出,判断是1还是0.  
       ucdat|=0x80;//如果引脚是高则此位保存1。低不保存,右移的时候自然补0了。      
        _nop_();
       DS1302_CLK=1;//读完一位数据,再置高时钟,准备读下一个。   
       _nop_();//延时一下。    
     
    }
      //读完数据还是把时钟清0,下次好直接用。     
      DS1302_CLK=0;//读完数据还是把时钟清0,下次好直接用。   
         _nop_();
     _nop_();
    DS1302_RST=0;
    _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
    DS1302_CLK=0;
    _nop_();
     _nop_();
     _nop_();
     _nop_();
     DS1302_RST=0;
     _nop_();
     _nop_();
     _nop_();
     _nop_();
       _nop_();
        return(ucdat);


    }


    /*****************************************************************************
    函数功能:向DS1302某地址写一字节数据子程序
    入口参数:addr,TDat
    出口参数:
    *****************************************************************************/
    void write_ds1302(unsigned char addr,unsigned char TDat)
    {
       DS1302_RST=0;
       _nop_();
        _nop_();
       DS1302_CLK=0;
       _nop_();
        _nop_();
       DS1302_RST=1;
        _nop_();
        _nop_();
         _nop_();
        _nop_();
       InputByte(addr);//先写地址    
        _nop_();
         _nop_();
       InputByte(TDat);//再写数据    
     DS1302_IO=1;//单片机端置高防止破坏1302传来的数据,开始接收1302端的高低数据对数据线的改变。   
     DS1302_RST=0;
          delayus(10);
     DS1302_CLK=0;
         delayus(10);
    }


    /*****************************************************************************
    函数功能:读DS1302地址子程序
    入口参数:add
    出口参数:timedata
    *****************************************************************************/
    unsigned char read_ds1302(unsigned char addr)
    {
    unsigned char timedata;
    DS1302_RST=0;
    _nop_();
    DS1302_CLK=0;
    _nop_();
    DS1302_RST=1;
    InputByte(addr);//先写入读命令   
    timedata=OutputByte();//再读出数据    
     DS1302_IO=1;//单片机端置高防止破坏1302传来的数据,开始接收1302端的高低数据对数据线的改变。   
     DS1302_RST=0;
          delayus(10);
     DS1302_CLK=0;
         delayus(10);
    return(timedata);
    }


    /*****************************************************************************
    函数功能:初始化DS1302子程序
    入口参数:time[](全局变量)
    出口参数:
    *****************************************************************************/
    void initial_ds1302()
    {
     DS1302_IO=1;//单片机端置高防止破坏1302传来的数据,开始接收1302端的高低数据对数据线的改变。   
     DS1302_RST=0;
          delayms(100);
     DS1302_CLK=0;
         delayms(100);
    write_ds1302(0x8e,0x00);   //写保护寄存器,在对时钟或RAM写前WP一定要为0
    write_ds1302(0x8c,time[0]);   //年 
    write_ds1302(0x88,time[1]);   //月 
    write_ds1302(0x86,time[2]);   //日 
    write_ds1302(0x8A,time[3]);   //星期 
    write_ds1302(0x84,time[4]);   //时  
    write_ds1302(0x82,time[5]);   //分 
    write_ds1302(0x80,time[6]);   //秒  
    write_ds1302(0x8e,0x80);   //写保护寄存器 
    }


    /*****************************************************************************
    函数功能:读DS1302时间子程序
    入口参数:
    出口参数:全局变量(second,minute,hour,week,day,month,year)
    *****************************************************************************/
    void read_time()
    {
    second=read_ds1302(0x81);   //秒寄存器  
     _nop_();
    minute=read_ds1302(0x83);   //读分 
     _nop_();
    hour=read_ds1302(0x85);    //读时 
     _nop_();
    week=read_ds1302(0x8B);    //读星期  
     _nop_();
    day=read_ds1302(0x87);    //日  
     _nop_();
    month=read_ds1302(0x89);   //月 
     _nop_();
    year=read_ds1302(0x8d);    //年 
     _nop_(); 
    }


    void main(void)
    {uchar shuju;
     delayms(2);
     Delay400Ms(); //启动等待,等LCM讲入工作状态
     delays(1);
     LCD1602_Init(); //LCM初始化   
     Delay5Ms(); //延时片刻(可不要) 
      DS1302_RST=0;
          delayms(1000);
        DS1302_CLK=0;
         delayms(1000);
     shuju=ReadData();
     Displaystring(2, 0, a);
     Delay();Delay();
     delayms(2000);
     Displaystring(3,0,riqi);
      Displaystring(12,0,xingqi);
     delayms(4000);
     // initial_ds1302();     //初始化DS1302
         delayms(1200);
     while(1)
     {
            read_time();//读取时间 
        Display_Buffer[0]=hour/16+'0';//存储下时的高位进数组
        Display_Buffer[1]=hour%16+'0';//存储下时的低位进数组
        Display_Buffer[3]=minute/16+'0';//注意+'0'后存储的是ASCII。用于下面液晶显示。
        Display_Buffer[4]=minute%16+'0';//注意+'0'后存储的是ASCII。用于下面液晶显示。
        Display_Buffer[6]=second/16+'0';
        Display_Buffer[7]=second%16+'0';
        riqi[0]=year/16+'0';
        riqi[1]=year%16+'0';
        riqi[3]=month/16+'0';
        riqi[4]=month%16+'0';
        riqi[6]=day/16+'0';
        riqi[7]=day%16+'0';
        Displaystring(3,0,riqi);
         delayms(1);
        DisplayOneChar(14,1,week+'0');
        Displaystring(3,1,Display_Buffer);


     }
    }



    //写数据  
    void WriteData(uchar DAT)
    {
     Readbusy();
     LCD1602_RS = 1;
     LCD1602_RW = 0;
     LCD1602_IO = DAT;
     LCD1602_E = 0; //若晶振速度太高可以在这后加小的延时    
     LCD1602_E = 0; //延时 
     LCD1602_E = 1;
     LCD1602_E=1;
     LCD1602_E=0;
    }


    //写指令   
    void WriteCommand(uchar command,BuysC) //BuysC为0时忽略忙检测
    {
     LCD1602_IO=0x00;
     if (BuysC)
     Readbusy(); //根据需要检测忙     


     LCD1602_RS = 0;
     LCD1602_RW = 0;
     LCD1602_IO = command;
     LCD1602_E = 0;
     LCD1602_E = 0;
     LCD1602_E = 1;
     LCD1602_E = 1;
     LCD1602_E=0;
    }


    //读数据  
    uchar ReadData(void)
    {
    Readbusy();
     LCD1602_RS = 1;
     LCD1602_RW = 1;
     LCD1602_E = 0;
     LCD1602_E = 0;
     LCD1602_E = 1;
     delayms(1);
     LCD1602_E = 0;
     return(LCD1602_IO);


    }


    //读忙
    void Readbusy(void)
    {
     LCD1602_IO = 0xff;
     LCD1602_RS = 0;
     LCD1602_RW = 1;
     LCD1602_E = 0;
     LCD1602_E = 0;
     LCD1602_E = 1;
     delayms(2);


     while (LCD1602_IO&0x80); //检测忙信号  
      LCD1602_E = 0;
    }
     //初始化
    void LCD1602_Init(void) //LCM初始化
    {
     Delay400Ms();
     LCD1602_E = 0;
     LCD1602_IO=0x00;
     WriteCommand(0x38,0); //三次显示模式设置,不检测忙信号
     Delay5Ms();
     WriteCommand(0x38,0);
     Delay5Ms();
     WriteCommand(0x38,0);
     Delay5Ms();


     WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号
     Delay5Ms();
     WriteCommand(0x08,1); //关闭显示   ] 
     Delay5Ms();
     WriteCommand(0x01,1); //显示清屏   
     Delay5Ms();
     WriteCommand(0x06,1); // 显示光标移动设置    
     Delay5Ms();
     WriteCommand(0x0f,1); // 显示开及光标设置    
     Delay5Ms();
    }


    //按指定位置显示一个字符 
    void DisplayOneChar(uchar X, uchar Y, uchar DData)
    {
     Y &= 0x01;
     X &= 0x0f; //限制X不能大于15,Y不能大于1  
     if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
     X |= 0x80; // 算出指令码    
     WriteCommand(X, 0); //这里不检测忙信号,发送地址码  
     WriteData(DData);
    }


    //按指定位置显示一串字符 
    void Displaystring(uchar X, uchar Y, uchar  *DData)
    {
     uchar ListLength;


      ListLength = 0;
     Y &= 0x01;
     X &= 0x0f; //限制X不能大于15,Y不能大于1
     while (DData[ListLength]>0x20) //若到达字串尾则退出 
      {
       if (X <= 0x0f) //X坐标应小于0x0f  
        {
         DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
         ListLength++;
         X++;
        }
      }
    }


    //5ms延时
    void Delay5Ms(void)
    {
     unsigned int t = 5552;
     while(t--);
    }


    //400ms延时
    void Delay400Ms(void)
    {
      uchar i = 5;
      uint j;
      while(i--)
       {
      j=7269;
      while(j--);
       }
     }
     //
     void delayms(uint k)
     {
    uint data i,j;
    for(i=0;i<k;i++)
      {
        for(j=0;j<121;j++)
         {;}
       }
     }
    void delayus(uchar x)      
     {
        while(--x);
     }

    展开全文
  • ds1302时钟程序详解

    2010-08-04 20:29:33
    控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1...
  • MSP430+DS1302程序,IAR for Msp430开发环境。两个按键,4位时钟专用数码管显示。MSP430G253芯片。
  • 关于ds1302液晶显示的一段程序,是关于AT单片机的
  • //DS1302时钟程序//液晶用的ST7920控制芯片的12864 #include #include /********************************************************************/#define LCD12864_IO P0#define CLERADISPLAY LCD12864_command...

     //DS1302时钟程序
    //液晶用的ST7920控制芯片的12864       
    #include <reg52.h>
    #include <intrins.h>
    /********************************************************************/
    #define  LCD12864_IO  P0
    #define  CLERADISPLAY LCD12864_command(0x01);
    #define uchar unsigned char
    #define uint unsigned int
    /********************************************************************/
    sbit LCD12864_EN=P2^7;   //E
    sbit LCD12864_DIN=P2^5;  // RS
    sbit LCD12864_CLK=P2^6;  //RW
    sbit DS1302_CLK =P2^0;// P1^0;
    sbit DS1302_IO =P2^1;// P1^1;
    sbit DS1302_RST =P2^2;// P1^2;
    unsigned char time[]={0x10,0x01,0x27,0x03,0x14,0x00,0x00};// 初始化时间年月日星期时分秒     
    uchar Display_Buffer[]="12-22-00";//时、分、秒 的格式
    uchar riqi[]="11-03-28";//年、月、日 的格式     
    uchar xingqi[]="week-3";//星期  
    unsigned char second,minute,hour,week,day,month,year;
    /********************************************************************/
    void LCD12864_busy(void);
    void LCD12864_command(unsigned char command);
    void LCD12864_data(unsigned char dat);
    void LCD12864_address(unsigned char row,unsigned char line);
    void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s);
    void LCD12864_picture(unsigned char *gImage);
    void LCD12864_init(void);
     void LCD12864_char (unsigned char row,unsigned char line,unsigned char a);
    /********************************************************************/
     
    //
     void delayms(uint k)
     {
    uint data i,j;
    for(i=0;i<k;i++)
      {
        for(j=0;j<121;j++)
         {;}
       }
     }
    void delayus(uchar x)      
     {
        while(--x);
     }


    void Mcu_init(void)
    {
     
     LCD12864_init();
     
     
     CLERADISPLAY 
     CLERADISPLAY 
     LCD12864_init();
    }


     


    void Delay(void)
    {
     unsigned char i;
         unsigned int j;
     for(i=0;i<200;i++)
      for(j=1000;j>0;j--);
    }
     
    /*****************************************************************************
    函数功能:向DS1302送一字节数据子程序
    入口参数:
    出口参数:
    *****************************************************************************/
    void InputByte(unsigned char BYTE)
    {
    char i;
    for(i=8;i>0;i--)
    {  //前面在read_ds1302()函数里已经把CLK清0了    
       DS1302_CLK=0;//这里再清0一次,看着清楚。呵呵   
       DS1302_IO=(bit)(BYTE&0x01);//取出低位数据给数据引脚    
        DS1302_CLK=1;//置1,时钟上升沿,引脚上的数据传入1302寄存器中   
       BYTE>>=1;//因为这里移位的BYTE不是最后要的结果,虽然最后循环完会多移一位,但没影响。
     //循环最后一次后,时钟状态是高电平。  
    }
    }


    /*****************************************************************************
    函数功能:读DS1302一个字节子程序,读数据是下降沿读
    入口参数:
    出口参数:
    *****************************************************************************/
    unsigned char OutputByte(void)
    {
    unsigned char i;
    unsigned char ucdat=0;
    for(i=8;i>0;i--)
    {  //前面时钟状态是高电平。  
        ucdat>>=1; //移位注意,移位不能放在循环语句末,否则最后循环完会多移一位。得到结果就错了。
       DS1302_IO=1;//单片机端置高防止破坏1302传来的数据,开始接收1302端的高低数据对数据线的改变。    
       DS1302_CLK=0;//紧接着时钟变低,下降沿数据输出。 
       if(DS1302_IO)//数据已经输出,判断是1还是0.  
       ucdat|=0x80;//如果引脚是高则此位保存1。低不保存,右移的时候自然补0了。  
       DS1302_CLK=1;//读完一位数据,再置高时钟,准备读下一个。   
       _nop_();//延时一下。    
     
    }
      //读完数据还是把时钟清0,下次好直接用。     
      DS1302_CLK=0;//读完数据还是把时钟清0,下次好直接用。   
    DS1302_RST=0;
    _nop_();
    DS1302_CLK=0;
     DS1302_RST=0;
     return(ucdat);


    }


    /*****************************************************************************
    函数功能:向DS1302某地址写一字节数据子程序
    入口参数:addr,TDat
    出口参数:
    *****************************************************************************/
    void write_ds1302(unsigned char addr,unsigned char TDat)
    {
       DS1302_RST=0;
       _nop_();
       DS1302_CLK=0;
        _nop_();
       DS1302_RST=1;
        _nop_();
       InputByte(addr);//先写地址 
       InputByte(TDat);//再写数据    
     DS1302_IO=1;//单片机端置高防止破坏1302传来的数据,开始接收1302端的高低数据对数据线的改变。   
     DS1302_RST=0;
       _nop_();
     DS1302_CLK=0;
    }


    /*****************************************************************************
    函数功能:读DS1302地址子程序   
    入口参数:add
    出口参数:timedata
    *****************************************************************************/
    unsigned char read_ds1302(unsigned char addr)
    {
    unsigned char timedata;
    DS1302_RST=0;
    DS1302_CLK=0;
    DS1302_RST=1;
    InputByte(addr);//先写入读命令   
    timedata=OutputByte();//再读出数据    
     DS1302_IO=1;//单片机端置高防止破坏1302传来的数据,开始接收1302端的高低数据对数据线的改变。   
     DS1302_RST=0;
      _nop_();
     DS1302_CLK=0;
    return(timedata);
    }


    /*****************************************************************************
    函数功能:初始化DS1302子程序
    入口参数:time[](全局变量)
    出口参数:
    *****************************************************************************/
    void initial_ds1302()
    {
     DS1302_IO=1;//单片机端置高防止破坏1302传来的数据,开始接收1302端的高低数据对数据线的改变。   
     DS1302_RST=0;
     DS1302_CLK=0;
    write_ds1302(0x8e,0x00);   //写保护寄存器,在对时钟或RAM写前WP一定要为0
    write_ds1302(0x8c,time[0]);   //年 
    write_ds1302(0x88,time[1]);   //月 
    write_ds1302(0x86,time[2]);   //日 
    write_ds1302(0x8A,time[3]);   //星期 
    write_ds1302(0x84,time[4]);   //时  
    write_ds1302(0x82,time[5]);   //分 
    write_ds1302(0x80,time[6]);   //秒  
    write_ds1302(0x8e,0x80);   //写保护寄存器 
    }



    /*****************************************************************************
    函数功能:读DS1302时间子程序
    入口参数:
    出口参数:全局变量(second,minute,hour,week,day,month,year)
    *****************************************************************************/
    void read_time()
    {
    second=read_ds1302(0x81);   //秒寄存器  
    minute=read_ds1302(0x83);   //读分 
    hour=read_ds1302(0x85);    //读时 
    //week=read_ds1302(0x8B);    //读星期  
    //day=read_ds1302(0x87);    //日  
    //month=read_ds1302(0x89);   //月  
    //year=read_ds1302(0x8d);    //年  
    }


    void main(void)
    {
    Mcu_init();
     DS1302_RST=0;
     DS1302_IO=1;
          delayms(1000);
        DS1302_CLK=0;
         delayms(1000);
    initial_ds1302();     //初始化DS1302


     Delay();Delay();
     CLERADISPLAY 
      LCD12864_string(1,1,"日期");
     LCD12864_string(2,1,"星期");
     LCD12864_string(3,1,"时间");
     while(1)
     {


        read_time();//读取时间 
        Display_Buffer[0]=hour/16+'0';//存储下时的高位进数组
        Display_Buffer[1]=hour%16+'0';//存储下时的低位进数组
        Display_Buffer[3]=minute/16+'0';//注意+'0'后存储的是ASCII。用于下面液晶显示。
        Display_Buffer[4]=minute%16+'0';//注意+'0'后存储的是ASCII。用于下面液晶显示。
        Display_Buffer[6]=second/16+'0';
        Display_Buffer[7]=second%16+'0';
     //   riqi[0]=year/16+'0';
     //   riqi[1]=year%16+'0';
     //   riqi[3]=month/16+'0';
     //   riqi[4]=month%16+'0';
      //  riqi[6]=day/16+'0';
     //   riqi[7]=day%16+'0';
      //  xingqi[1]=week%16+'0';


    // LCD12864_string(1,3,riqi);//液晶的第1行从第3位开始显示日期
    // LCD12864_string(2,3,xingqi);//液晶的第2行从第3位开始显示星期
     LCD12864_string(3,3,Display_Buffer);//液晶的第3行从第3列开始显示时间
     }
    }


    /*******************************************************************/
    void LCD12864_busy(void)
    {
        bit BF = 0;
        LCD12864_EN=0;
        LCD12864_DIN=0;
        LCD12864_CLK=1;
        LCD12864_IO=0xff;  //单片机读数据之前必须先置高位
        do
        {
         LCD12864_EN=1;
            BF=LCD12864_IO&0x80;
            LCD12864_EN=0;
        } while(BF);
       
    }
    /*******************************************************************/
    //          写入命令 
    /*******************************************************************/
    void LCD12864_command(unsigned char command)
    {
        LCD12864_busy();
        LCD12864_EN=0;
        LCD12864_DIN=0;
        LCD12864_CLK=0; 
       LCD12864_IO=0xff;
        LCD12864_EN=1;
        LCD12864_IO=command;
        LCD12864_EN=0;
    }
    /*******************************************************************/
    //          写入一字节数据
    /*******************************************************************/
    void LCD12864_data(unsigned char dat)
    {
      
        LCD12864_busy();
        LCD12864_EN=0;
        LCD12864_DIN=1;
        LCD12864_CLK=0;
        LCD12864_IO=0xff;
        LCD12864_EN=1;
        LCD12864_IO=dat;
        LCD12864_EN=0;
    }



    /*******************************************************************/
    //          设置显示位置    X(1~8),Y(1~4)
    /*******************************************************************/
    void LCD12864_address(unsigned char row,unsigned char line)
    {
        switch(row)
        {
            case 1:LCD12864_command(0x7f + line);
            break;
            case 2:LCD12864_command(0x8f + line);
            break;
            case 3:LCD12864_command(0x87 + line);
            break;
            case 4:LCD12864_command(0x97 + line);
            default:
            break;
        }
    }


     /*****************显示 一个 字符  **************/


      void LCD12864_char (unsigned char row,unsigned char line,unsigned char a)
    {
     
        LCD12864_address(row,line);
        LCD12864_data(a);
    }


    /*******************************************************************/
    //          在指定位置显示字符串
    /*******************************************************************/
    void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s)
    {
        unsigned char LCD12864_temp;
        LCD12864_address(row,line);
        LCD12864_temp=*s;
        while(LCD12864_temp != 0x00)
        {
            LCD12864_data(LCD12864_temp);
            LCD12864_temp=*(++s);
        } 
    }


    /*******************************************************************/
    //          绘制一幅图片  
    /*******************************************************************/
    void LCD12864_picture(unsigned char *gImage)
    {
        unsigned char X = 0x80,Y = 0x80;
        unsigned char i,j;
        for(i=0;i<64;i++)
        {
            for(j=0;j<16;j++)
            {
                LCD12864_command(0x34);
                LCD12864_command(Y);
                LCD12864_command(X);
                LCD12864_data(*(gImage+i*16+j));      //  low 8 bits
                LCD12864_data(*(gImage+i*16+j+1));    //  high 8 bits
                LCD12864_command(0x36);
                X++;
                j++;
            }
            Y++;
            if(Y>0x9f)
                Y=0x80;
            X=0x80+((i+1)/32)*8;
        }
        LCD12864_command(0x30);
      
    }
    /*******************************************************************/
    //          初始化设置
    /*******************************************************************/
    void LCD12864_init(void)
    {
        CLERADISPLAY      //  clear DDRAM
        LCD12864_command(0x30);     //  8 bits unsigned interface,basic instrument
        LCD12864_command(0x02);     //  cursor return
        LCD12864_command(0x0c);     //  display,cursor on
        LCD12864_command(0x03);  
        LCD12864_command(0x06);
        CLERADISPLAY       //  clear DDRAM
    }



     

    展开全文
  • 基于DS1302芯片做的时钟程序在液晶上显示。
  • 首先附上DS1302的时序图和它的寄存器图,程序中写的不好的地方希望大家多多谅解,谢谢~ #include<reg52.h> //头文件预编译 #define uchar unsigned char //宏定义 #define uint unsigned int //宏定义 uint ...

    首先附上DS1302的时序图和它的寄存器图,程序中写的不好的地方希望大家多多谅解,谢谢~在这里插入图片描述在这里插入图片描述

    #include<reg52.h>			//头文件预编译
    #define uchar unsigned char //宏定义
    #define uint unsigned int   //宏定义
    uint DisplayData[8];	    //无符号整型数码管显示的总位数
    uint code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管0-9的全数组
    uint code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};  //读寄存器的秒分钟日月周年
    uint code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //写寄存器的秒分钟日月周年
    uint TIME[7] = {0x50, 0x43, 0x21, 0x25, 0x07, 0x06, 0x20};				  //数码管显示的时间2020年7月25日星期六21点43分50秒
    sbit SCLK=P3^6;				//位选时钟线
    sbit IO=P3^4;				//位选输出输出
    sbit CE=P3^5;				//位选复位
    sbit LSA=P2^2;				//数码管端口A
    sbit LSB=P2^3;				//数码管端口B
    sbit LSC=P2^4;				//数码管端口C
    
    void write1302(uchar add,uchar dat)	//DS1302的写操作(写地址,写数据)
    {
    	uchar i;
    	CE=0;							//一开始CE为0
    	SCLK=0;							//时钟线为0
    	CE=1;							//过段时间CE为1开始工作
    	for(i=0;i<8;i++)				//FOR循环八次,写八次地址
    	{
    		
    		IO=add&0x01;				//从最低位开始接收
    		add>>=1;					//右移一位,执行8次
    		SCLK=1;						//时钟线升高,上升沿
    		SCLK=0;						//时钟线降低,为下一次for循环的上升沿做准备
    	}
    	for(i=0;i<8;i++)			    //与上同理
    	{
    		
    		IO=dat&0x01;
    		dat>>=1;
    		SCLK=1;
    		SCLK=0;	
    	}
    	CE=0;							//CE为0,停止工作
    }
    
    uint read1302(uchar add)			//DS1302的读操作,注意因为是读操作,所以有返回值,不能为void而是需要unsigned,形参为之前的地址
    {
    	uchar i,dat,dat1;
    	SCLK=0;
    	CE=0;
    	CE=1;
    	for(i=0;i<8;i++)
    	{
    		IO=add&0x01;				//与上同理
    		add>>=1;
    		SCLK=1;						//读操作时,时钟线做下降沿
    		SCLK=0;	
    	}
    	for(i=0;i<8;i++)
    	{
    		dat1 = IO;
    		dat = (dat>>1) | (dat1<<7);	//dat1左移7位变成最高位,dat1右移一位变成次高位,循环操作就能够将数据完整的读出
    		SCLK = 1;
    		SCLK = 0;
    			
    	}
    		CE = 0;	
    		return dat;					//返回dat值
    }
    
    void init1302()						//初始化ds1302
    {
    	uchar i;
    	write1302(0x8e,0);				//去除写保护
    	for(i=0;i<7;i++)
    	{
    		write1302(WRITE_RTC_ADDR[i],TIME[i]);//循环七次的目的就是为了能够将秒分钟日月周年输入,括号内就是为之前的写地址和写数据	
    	}
    	write1302(0x8e,0x80);			//重新赋予写保护
    }
    
    void read1302time()					//读取ds1302的数据
    {
    	uchar i;
    	for(i=0;i<7;i++)
    	{
    		TIME[i]=read1302(READ_RTC_ADDR[i]) ;//读七次,依次输出秒分钟日月周年,但是要注意的是,由于八段数码管数量有限,只能显示出时分秒
    	}
    }
    
    void delay(uint i)				    //延时函数,当i为1时,延时大概10ms
    {
    	while(i--);	
    }
    
    void datapros() 	 				//数据处理函数
    {
       	read1302time();
    	DisplayData[0] = smgduan[TIME[2]/16];				//显示小时的整数位
    	DisplayData[1] = smgduan[TIME[2]&0x0f];				//显示小时的低位 
    	DisplayData[2] = 0x40;								//显示“-”
    	DisplayData[3] = smgduan[TIME[1]/16];				//同理
    	DisplayData[4] = smgduan[TIME[1]&0x0f];	
    	DisplayData[5] = 0x40;
    	DisplayData[6] = smgduan[TIME[0]/16];				//同理
    	DisplayData[7] = smgduan[TIME[0]&0x0f];
    }
    
    
    
    void DigDisplay()										//八段数码管的位选显示
    {
    	uchar i;
    	for(i=0;i<8;i++)
    	{
    		switch(i)	 
    		{
    			case(0):
    				LSA=1;LSB=1;LSC=1; break;//显示第0位
    			case(1):
    				LSA=0;LSB=1;LSC=1; break;//显示第1位
    			case(2):
    				LSA=1;LSB=0;LSC=1; break;//显示第2位
    			case(3):
    				LSA=0;LSB=0;LSC=1; break;//显示第3位
    			case(4):
    				LSA=1;LSB=1;LSC=0; break;//显示第4位
    			case(5):
    				LSA=0;LSB=1;LSC=0; break;//显示第5位
    			case(6):
    				LSA=1;LSB=0;LSC=0; break;//显示第6位
    				case(7):
    				LSA=0;LSB=0;LSC=0; break;//显示第7位
    		}
    		P0=DisplayData[i];				 //发送数据
    		delay(100); 					 //间隔一段时间扫描	
    		P0=0x00;						 //消隐
    	}		
    }
    void main()
    {	
    	init1302();	   						
    	while(1)
    	{
    		datapros();	 					 //数据处理函数
    		DigDisplay();					 //数码管显示函数		
    	}		
    }
    
    展开全文
  • 基于MSP430G2553和NRF24L01的时钟程序 经验证可用
  • 使用DS1302+LCD1602做一个时钟 现在暂时只往LCD送秒位的数据,但是显示的始终不对 调试了一个下午,实在无力,求解决求拍醒[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/11.gif...
  • DS1302时钟芯片程序

    2014-04-24 20:13:40
    DS1302时钟程序,包括写入,读出等等等等

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 730
精华内容 292
关键字:

ds1302时钟程序