找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1638|回复: 0
打印 上一主题 下一主题
收起左侧

单片机时钟程序DS1302 LCD1602基础

[复制链接]
跳转到指定楼层
楼主
ID:594757 发表于 2021-5-30 20:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"reg52.h"
#include "DS1302.h"
#include "LCD1602.h"


uint x;


extern void delay10us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=1;a>0;a--);
}




uchar DS1302_ZhiLing_DuQu(uchar dat)        //指令,读取
{
uchar K;
DS1302_RST=0; //RST置零
DS1302_SCLK=0;//脉冲置零

DS1302_RST=1;          //0x80=10000000开放RST
delay10us();
  for(x=0;x<=7;x++)        //写指令//将8位字节用高低电平方式表现出来
  {
    delay10us();
    if(dat & 0x01)
    {DS1302_IO =1;}  
    else
    {DS1302_IO =0;}   
    DS1302_SCLK=1;
    delay10us();
    DS1302_SCLK=0;
    dat>>=1;      }   
  for(x=0;x<=7;x++)        //读数据   //高低电平方储存将一个字节中
  {
    K>>=1;         //必须在前面,只移位7次不是8次,从第0移到7;不能移位8次
    delay10us();
    if(DS1302_IO)
    {K|=0x80;}         
    DS1302_SCLK=1;
    delay10us();
    DS1302_SCLK=0;
    delay10us();
                      }                                       
    DS1302_RST=0;
   return K;
}
void DS1302_ZhiLing_XieRu(uchar ZhiLing,uchar ShuJu)         //指令,写入数据
{
DS1302_RST=0; //RST置零
DS1302_SCLK=0;//脉冲置零
  delay10us();;
DS1302_RST=1;
delay10us();
for(x=0;x<=7;x++)        //写指令
{
   delay10us();
   if(ZhiLing & 0x01)  //将8位字节用高低电平方式表现出来
   {DS1302_IO =1;}
   else
   {DS1302_IO =0;}
   DS1302_SCLK=1;
   delay10us();
   DS1302_SCLK=0;
   ZhiLing>>=1;         
               }
  for(x=0;x<=7;x++)        //写数据
  {
  delay10us();
  if(ShuJu & 0x01)        //将8位字节用高低电平方式表现出来
  {DS1302_IO =1;}
  else
  {DS1302_IO =0;}
  DS1302_SCLK=1;
  delay10us();
  DS1302_SCLK=0;  
  ShuJu >>=  1;
               }
  delay10us();
  DS1302_RST=0;              
}


void DS1302_LCD1602_DuQU(uchar MingLing)//数据处理
{

   uchar GeiWei,ShiWei,x;
   uchar ShuZi1[]="0123456789";
   x=DS1302_ZhiLing_DuQu(MingLing);// 将命令指令转换成读取命令

   if(MingLing==0x8B)           //针对星期,星期用4位BCD可以应付
   {
    GeiWei=x&0x0f;
    GeiWei=GeiWei%10;
        LCD1602_XieShuJu(ShuZi1[GeiWei]); }
   else
  {
   GeiWei=x&0x0f;                //必要提取低4位字节
   GeiWei=GeiWei%10;   //取余,提取数字

   ShiWei=x>>4;                  //提取高4位字节
   ShiWei=ShiWei%10;  //取余,提取数字
   LCD1602_XieShuJu(ShuZi1[GeiWei]);
   LCD1602_XieShuJu(ShuZi1[ShiWei]);
                                           }
}




//2020-04-26  00:00:00
void DS1302_ChuShiHua()          //DS1302初始化
{                         //2020-04-26 星期7 00:00:00
char DS1302_ChuShiShuJu[]={0x20,0x04,0x26,0x07,0x00,0x00,0x00};//初始数据
DS1302_ZhiLing_XieRu(0x8e,0x00); //关闭写入保护
DS1302_ZhiLing_XieRu(0x80,0x80); //暂停运行
DS1302_ZhiLing_XieRu(Nian,    DS1302_ChuShiShuJu[0]); //年份
DS1302_ZhiLing_XieRu(Yue,     DS1302_ChuShiShuJu[1]); //月
DS1302_ZhiLing_XieRu(Ri,      DS1302_ChuShiShuJu[2]); //日
DS1302_ZhiLing_XieRu(XingQi,  DS1302_ChuShiShuJu[3]);//星期7
DS1302_ZhiLing_XieRu(XiaoShi, DS1302_ChuShiShuJu[4]); //小时
DS1302_ZhiLing_XieRu(FenZhong,DS1302_ChuShiShuJu[5]); //分钟
DS1302_ZhiLing_XieRu(miao,    DS1302_ChuShiShuJu[6]); //秒
DS1302_ZhiLing_XieRu(0x8e,0x80); //开启写入保护
}
void DS1302_KaiShiYunXing()//开始运行
{  
   LCD1602_ShuRuMoShi(0,0);
   LCD1602_WeiXuanXianShi(2,15);
   DS1302_LCD1602_DuQU(0x81);

   delay10us();        

   LCD1602_WeiXuanXianShi(2,12);
   DS1302_LCD1602_DuQU(0x83);


   LCD1602_WeiXuanXianShi(2,9);
   DS1302_LCD1602_DuQU(0x85);


   LCD1602_WeiXuanXianShi(2,5);                                                   
   DS1302_LCD1602_DuQU(0x8B);

   LCD1602_WeiXuanXianShi(1,9);
   DS1302_LCD1602_DuQU(0x87);


   LCD1602_WeiXuanXianShi(1,6);
   DS1302_LCD1602_DuQU(0x89);

   LCD1602_WeiXuanXianShi(1,3);
   DS1302_LCD1602_DuQU(0x8D);

}





时钟(DS1302)(LCD1602)改进版.zip

84.03 KB, 下载次数: 27, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表