📄 d.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 + -