⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d.txt

📁 DS1302和LCD1602的多功能数字钟
💻 TXT
字号:
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<ds1302.h>       //DS1302驱动程序
#include<lcd1602.h>      //LCD1302驱动程序

//==========================
#define uchar unsigned char
#define uint unsigned int
//==========================

sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;

uchar key1,key2,key3;

uchar tab_time[8]={0,0,10,0,0,10,0,0};    //时间
uchar tab_ymdw[12]={2,0,0,0,11,0,0,11,0,0,12,0};   //年月日星期
uchar tab_num[]="0123456789:- ";
uchar tab_t[]="Time ";
uchar tab_d[]="Date ";
uchar tab_week[21]="MonTeuWedThuFriSATSUN";
uchar tab_ampm[4]="AmPm";
//--------------------------
//------- 函数声明 --------
void lcd_disp();
void trans();
void key();
void delay(uint);
//==========================

//------ 主函数 -----------
void main()
{ 
// ds1302_init();        //DS1302初始化
write_com(0x01);        //LCD清屏
lcd_init();             //LCD1602初始化
while(1)
   {
    key();
    ds1302();
    trans();
    lcd_disp();
   }
}

//========================================
//------ 数据转换函数   --------
//========================================
void trans()
{
tab_time[0]=tab_1302[2]/10;   //小时十位    
tab_time[1]=tab_1302[2]%10;   //小时个位

tab_time[3]=tab_1302[1]/10;   //分十位
tab_time[4]=tab_1302[1]%10;   //分个位

tab_time[6]=tab_1302[0]/10;   //秒十位
tab_time[7]=tab_1302[0]%10;   //秒个位

tab_ymdw[2]=tab_1302[6]/10;   //年十位
tab_ymdw[3]=tab_1302[6]%10;   //年个位

tab_ymdw[5]=tab_1302[4]/10;   //月十位
tab_ymdw[6]=tab_1302[4]%10;   //月个位

tab_ymdw[8]=tab_1302[3]/10;   //日十位
tab_ymdw[9]=tab_1302[3]%10;   //日个位

tab_ymdw[11]=tab_1302[5];     //星期
}

//===========================================
//----   LCD1602显示函数 ------
//----   write_com(uchar):LCD1602写命令函数 
//----   write_data(uchar):LCD1602写数据函数
//===========================================
void lcd_disp()
{
uchar i,j;
write_com(0x80);           //LCD1602写命令函数,从第一行开始显示
//------------------------- 
for(i=0;i<5;i++)
{
   write_data(tab_t[i]);    //显示'Time '
}
//------------------------ 
write_com(0x80+5); 
for(i=0;i<8;i++)
{
    j=tab_time[i];            //显示时间
    write_data(tab_num[j]);   //LCD1602写数据函数,显示时间
}

write_com(0x80+5+8); 
//------------------
write_data(' '); 
write_data(' '); 
write_data(' '); 
if(tab_1302[2]<12)
{
   write_data(tab_ampm[0]); 
   write_data(tab_ampm[1]); 
}
else
{
   write_data(tab_ampm[2]); 
   write_data(tab_ampm[3]); 
}
//-------------------- 
write_com(0x80+0x40);      //LCD1602写命令函数,从第二行开始显示
for(i=0;i<5;i++)
{
   write_data(tab_d[i]);      //显示'Date '
}
//---------------------
write_com(0x80+0x40+5); 
for(i=0;i<11;i++)
{
    j=tab_ymdw[i];            //显示日期
    write_data(tab_num[j]);   //LCD1602写数据函数,显示年月日星期
}
//----------------------
write_com(0x80+0x40+5+11);
for(i=0;i<3;i++)
   {
    j=tab_ymdw[11];           //星期
    write_data(tab_week[(j-1)*3+i]);
   } 
write_com(0x80);           //LCD1602写命令函数
}

//=============================================
//------- 时间日期调节函数 ----------
//------- k1选定,k2加1,k3减1 ------
//=============================================
void key()
{
if(k1==0)
{
    delay(20);
    if(k1==0)
    {
     key1++;
     if(key1==8)      //一共要调7个
     {key1=0;}
    }
}
while(k1==0);
//--------------------------------------------------------
if(k2==0)           //加一
   {
    delay(20);
    if(k2==0)
    {
     if(key1==1||key1==2)    //秒分调节
     {
      tab_1302[key1-1]++;
       if(tab_1302[key1-1]>=60)
         {tab_1302[key1-1]=0;}
       if(tab_1302[key1-1]<0)
         {tab_1302[key1-1]=60;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//---------------
     if(key1==3)    //小时调节
     {
      tab_1302[key1-1]++;
       if(tab_1302[key1-1]>=24)
         {tab_1302[key1-1]=0;}
       if(tab_1302[key1-1]<0)
         {tab_1302[key1-1]=24;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     
     }
//--------------
    if(key1==4)    //日期调节
     {
      tab_1302[key1-1]++;
       if(tab_1302[key1-1]>=32)
         {tab_1302[key1-1]=1;}
       if(tab_1302[key1-1]<=0)
         {tab_1302[key1-1]=31;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//-------------------

    if(key1==5)    //月调节
     {
      tab_1302[key1-1]++;
       if(tab_1302[key1-1]>=13)
         {tab_1302[key1-1]=1;}
       if(tab_1302[key1-1]<=0)
         {tab_1302[key1-1]=12;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//------------------
    if(key1==6)    //星期调节
     {
      tab_1302[key1-1]++;
       if(tab_1302[key1-1]>=8)
         {tab_1302[key1-1]=1;}
       if(tab_1302[key1-1]<=0)
         {tab_1302[key1-1]=7;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//-----------------
    if(key1==7)    //年调节
     {
      tab_1302[key1-1]++;
       if(tab_1302[key1-1]>=99)
         {tab_1302[key1-1]=0;}
       if(tab_1302[key1-1]<0)
         {tab_1302[key1-1]=99;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
    }
   }
   while(k2==0);
//------------------------------------------------------------
if(k3==0)           //减一
   {
    delay(20);
    if(k3==0)
    {
     
     if(key1==1||key1==2)    //秒分调节
     {
      tab_1302[key1-1]--;
       if(tab_1302[key1-1]>=60)
         {tab_1302[key1-1]=0;}
       if(tab_1302[key1-1]<0)
         {tab_1302[key1-1]=60;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//---------------
     if(key1==3)    //小时调节
     {
      tab_1302[key1-1]--;
       if(tab_1302[key1-1]>=24)
         {tab_1302[key1-1]=0;}
       if(tab_1302[key1-1]<0)
         {tab_1302[key1-1]=24;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//--------------
    if(key1==4)    //日期调节
     {
      tab_1302[key1-1]--;
       if(tab_1302[key1-1]>=32)
         {tab_1302[key1-1]=1;}
       if(tab_1302[key1-1]<=0)
         {tab_1302[key1-1]=31;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//-------------------

    if(key1==5)    //月调节
     {
      tab_1302[key1-1]--;
       if(tab_1302[key1-1]>=13)
         {tab_1302[key1-1]=1;}
       if(tab_1302[key1-1]<=0)
         {tab_1302[key1-1]=12;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//------------------
    if(key1==6)    //星期调节
     {
      tab_1302[key1-1]--;
       if(tab_1302[key1-1]>=8)
         {tab_1302[key1-1]=1;}
       if(tab_1302[key1-1]<=0)
         {tab_1302[key1-1]=7;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
//-----------------
    if(key1==7)    //年调节
     {
      tab_1302[key1-1]--;
       if(tab_1302[key1-1]>=99)
         {tab_1302[key1-1]=0;}
       if(tab_1302[key1-1]<0)
         {tab_1302[key1-1]=99;}
      writeds_add(0x80+(key1-1)*2,tab_1302[key1-1]);
     }
    }
}
while(k3==0);
}
//=======================================================
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//=======================================================

ds1302.h
//=========================================
//----- http://hi.baidu.com/niejinbo
//----- DS1302驱动程序 ---------------
//----- 作者:聂金波   niejinbo999@163.com
//----- 完成日期:2008-07-28    ------
//=========================================
//----- 星期一 monday 星期二 tuesday   星期三 wednesday
//----- 星期四 thursday 星期五 friday   星期六 saturday
//----- 星期日 sunday
//-----
//-----
//==========================================

//--------------------------
#define uchar unsigned char
#define uint unsigned int
//--------------------------
//------ 定义端口 ---------
sbit rst=P3^1;
sbit sclk=P3^2;
sbit io=P3^3;

//---------------------------

tab_1302[7]={0,11,1,29,7,2,8};     //初始化时时间日期设置
         //秒 分 时 日月 星期 年

//--------------------------
//----- 函数声明 ------
//--------------------------
void ds1302();                   //获取DS1302时间
void writeds_byte(uchar);        //向DS1302写一字节
uchar readds_byte();             //从DS1302读一字节
void ds1302_init();              //DS1302初始化
void writeds_add(uchar,uchar);   //指定地址向1302写一数据
uchar readds_add(uchar);         //指定地址从1302读一数据

//=========================================
//------    函数 ------
//=========================================
//-------------------------------
//---- 向DS1302写一字节 (上升沿有效) -------
//---- 数据输入从低位到高位     ------------
//-------------------------------

void writeds_byte(uchar dat)    
{
uchar i,dat_w;
dat_w=dat;         //数据送给变量dat_w
for(i=0;i<8;i++)
   {
    io=0;             //数据线先拉低
    if(dat_w&0x01)    //如果是1
     {io=1;}
    else              //如果是0
     {io=0;}
    dat_w=dat_w>>1;   //右移一位
    sclk=0;           //先拉低时钟信号
    sclk=1;           //拉高时钟信号   
   }    
sclk=0;             //写一字节完毕,拉低时钟信号
}

//-------------------------------
//---- 从DS1302读一字节 (下降沿有效) --------
//---- 读出数据时从低位0位到高位7   -----------
//-------------------------------

uchar readds_byte()
{
uchar i,k; 
k=0;
for(i=0;i<8;i++)
{
   k=k>>1;
   if(io)
   {k=k|0x80;}
   sclk=1;           //先拉低时钟信号
   sclk=0;
}
sclk=0;
return (k);
}

//-------------------------------
//---- 指定地址写一数据 --------
//-------------------------------

void writeds_add(uchar add,uchar dat) //dat为十进制数
{
rst=0;
sclk=0;
rst=1;                               //拉高RST
writeds_byte(add);                   // 写地址
writeds_byte((dat/10<<4)|(dat%10)); // DS1302中的时间数据是BCD码形式
sclk=0;
rst=0;
}

//-------------------------------
//---- 指定地址读出一数据 ------
//-------------------------------

uchar readds_add(uchar add)
{
uchar temp,dat1,dat2;
rst=0;
sclk=0;
rst=1;
writeds_byte(add);
temp=readds_byte(); //读取的数据为16进制
sclk=0;              //读取完毕,拉低SCLK
rst=0;               //拉低SCLK
dat1=temp/16;        //16进制转成BCD
dat2=temp%16;
temp=dat1*10+dat2;   //转换成10进制数字
return (temp);     
}

//-------------------------------
//---- DS1302初始化 --------
//---- 设置初始时间 --------
//-------------------------------

void ds1302_init()
{
uchar i,add;
add=0x80;
writeds_add(0x8e,0x00);    //允许写入
for(i=0;i<7;i++)
   {
    writeds_add(add,tab_1302[i]);
    add+=2;
   }
writeds_add(0x90,0xa6);   //写充电控制寄存器.
writeds_add(0x8e,0x80);   //禁止写入
}

//-------------------------------
//---- 获取DS1302时间 --------
//---- 在主函数中调用 --------
//-------------------------------

void ds1302()
{
uchar i,add=0x81;
writeds_add(0x8e,0x00);     //允许向DS1302写入数据
for(i=0;i<7;i++)
{
   tab_1302[i]=readds_add(add); //获得的数据已转换为十进制     
   add+=2;
}
writeds_add(0x8e,0x80);        //获取完一次时间,禁止向DS1302写入数据,提高可靠
}

//-------------------------------
//-------------------------------
//========================================

lcd1602.h
//==========LCD1602小波版头文件=================
//设计者: 聂金波   niejinbo999@163.com
//-----------------2008/07/22-------------------

//----------宏定义方便使用---------
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------
//sbit dula=P2^6;     // 数码管段选 
//sbit wela=P2^7;     // 数码管段选 

//开发板硬件原因,其它地方则可删除这两句
//----------------------------------------

//-----------定义端口(具体情况,具体对待)------------
#define DATA_PORT P0 //定义数据端口 // 次处定义为P0口

sbit lcden=P2^0;      //LCD使能信号(开发板为P3.5)
sbit lcdrs=P2^2;      //LCD数据/命令选择信号(开发板为P3.5)
//sibt lcdrw=P2^3     //此处只写不读,故lcdrw接地处理

//----硬件电路改变时候只需修改以上4个------------------

//----------函数声明---------------
void lcd_init();          //LCD初始化函数
void write_com(uchar);    //写命令函数
void write_data(uchar);   //写数据函数
void lcd_delay(uint);     //延时函数
void cursor_flash(uchar,uchar);   //光标在指定坐标闪烁
//----------------------------------

//**********LCD初始化函数开始*********
void lcd_init()
{
// dula=0;               // 关闭数码管显示
// wela=0;               // 开发板硬件原因,其它地方则可删除这两句
lcden=0;
write_com(0x38);      //设置显示模式:16X2,5X7,8位数据接口
write_com(0x08);
write_com(0x01);
write_com(0x0c);      //开显示,显示光标,光标闪烁
write_com(0x06);      //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动
write_com(0x80);      //设置光标指针
}

//-----------------------------

//**********写命令函数开始************
void write_com(uchar com)
{
lcdrs=0;           //低电平写命令
DATA_PORT=com;     //写入命令,DATA_PORT为数据端口
lcd_delay(3);      //延时约3ms
lcden=1;           //LCD使能端置高电平
lcd_delay(5);      //延时约5ms
lcden=0;           //LCD使能端拉低电平
}

//---------------------------------
//**********写数据函数开始************
void write_data(uchar dat)
{
   lcdrs=1;             //低电平写数据
   DATA_PORT=dat;       //写入命令,DATA_PORT为数据端口
   lcd_delay(3);        //延时约3ms
   lcden=1;             //LCD使能端置高电平
   lcd_delay(5);        //延时约5ms
   lcden=0;             //LCD使能端拉低电平
}

//==========================================
//--------光标在指定坐标闪烁函数----
void cursor_flash(uchar a,uchar b)
{
write_com(0x80+a*0x40+b);
write_com(0x14);
write_com(0x0f);
write_com(0x80+a*0x40+b);

}


//-----------延时函数---------------
void lcd_delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
   for(j=50;j>0;j--);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -