//*******************************************************************************************************
//**********************用DS1602实现可调日期,时间,星期的实用数字钟功能*********************************
//******************创建日期:2010-1-7********************************************************************
//******************功能介绍:用3*3按键在DS1602上显示 第一排显示"2010-01-05 MON"第二排显示"23:59:00"****
//*********************************************功能介绍**************************************************
//************************** K6:adjtime K3:hour K2:minute K1:OK********************************
//************************** K3:adjalarm K3:hh K2:min K1:OK********************************
//************************** K2:lookalarm K1:OK ********************************
//************************** K1:alarm ON/OFF ********************************
//************************** K5:adjdate K9:month K8:day K7:week K4:OK********************************
//*******************************************************************************************************
//*******************************************************************************************************
#include "reg51.h"
#define K1 0xde
#define K2 0xee
#define K3 0xf6
#define K4 0xdd
#define K5 0xed
#define K6 0xf5
#define K7 0xdb
#define K8 0xeb
#define K9 0xf3//按键代码
sbit rs=P2^5;
sbit rw=P2^6;
sbit en=P2^7;
sbit P37=P3^7;//蜂鸣器开关 置0有效
unsigned char kbscan();//按键扫描
void ds1602();//DS1602初始化
void lcd_com(unsigned char com);//DS1602命令写入
void lcd_data(unsigned char dat);//DS1602数据写入
void timer0();//用于延时的定时中断 初始2mS
void disp();//主程序的显示调用
void display();//正常的显示
void display_alarm();//查看闹铃
void alarm();//闹铃
void process();//按键的处理
unsigned char result();//计算月份的天数
unsigned char key,days,flag_week=2,dema,demb,a,b,c,d,e,f,i,n;//key按键的返回值 dema延时的2mS传递变量 flag_week默认周一 demb按键扫描的延时传递变量 a..i为时分秒的传递
unsigned int count=0;//计数 到1秒
unsigned char second=0,minute=59,hour=23,hh=0,min=0,sec=0,day=5,month=1,year=10;//年月日时分秒的初始值
bit flag_alarm=0,flag_offalarm=0;//闹铃的标志位,闹钟关的标志位
unsigned char demc,demd,deme,temp=0,flag=0,m3,m4,m6,m7,m9,m10;//demc..deme temp flag为闹铃声的变量 m3..m10为年月日的传递
unsigned char week1[]="MON";
unsigned char week2[]="TUE";
unsigned char week3[]="WED";
unsigned char week4[]="THU";
unsigned char week5[]="FRI";
unsigned char week6[]="SAT";
unsigned char week7[]="SUN";//星期代码
//*******************************
//DS1602命令的写入
//*******************************
void lcd_com(unsigned char com)
{
rs=0;
rw=0;
P0=com;
dema=1;
while(dema!=0);
en=1;
dema=1;
while(dema!=0);
en=0;
}
//*********************
//DS1602数据的写入
//*********************
void lcd_data(unsigned char dat)
{
rs=1;
rw=0;
P0=dat;
dema=1;
while(dema!=0);
en=1;
dema=1;
while(dema!=0);
en=0;
}
//***************************
//3*3按键的扫描
//***************************
unsigned char kbscan()
{
unsigned char sccode,recode,temp;
P1=0XF8;
temp=P1;
if(temp!=0xf8)
{
demb=3;
while(demb!=0);
if(temp==P1)
{
sccode=0xfe;
while((sccode&0xf7)!=0)
{
P1=sccode;
if((P1&0xf8)!=0xf8)
{
recode=P1&0Xf8;
sccode=sccode&0xc7;
return(recode|sccode);
}
else
sccode=sccode<<1|0x01;
}
}
}
return(0);
}
//**************************
//*********每月的天数计算***
//**************************
unsigned char result()
{
switch(month)
{
case 1:return 31;break;
case 3:return 31;break;
case 5:return 31;break;
case 7:return 31;break;
case 8:return 31;break;
case 10:return 31;break;
case 12:return 31;break;
case 4:return 30;break;
case 6:return 30;break;
case 9:return 30;break;
case 11:return 30;break;
case 2:
if(year%4==0)
{
return 29;//闰年 29天
}
else
{
return 28;//平年28天
}
}
}
//**************************
//*********DS1602的初始化***
//**************************
void ds1602()
{
lcd_com(0x38);//16*2显示 5*7矩阵
dema=1;
while(dema!=0);
lcd_com(0x0c);//显示开,无光标无闪烁
dema=1;
while(dema!=0);
lcd_com(0x06);//指针+1,整屏不动
dema=1;
while(dema!=0);
lcd_com(0x01);//清屏
}
//*******************************
//定时中断延时的初始化以及中断***
//*******************************
void timer0()
{
TMOD=0X01;
TH0=0Xf8;
TL0=0X30; //2mS初值 12M晶振
TR0=1;
ET0=1;
EA=1;
}
TIME0() interrupt 1
{
TR0=0;
TH0=0Xf8;
TL0=0X30; //2mS初值
TR0=1;
count++;
if(count>=500)//1s
{
count=0;
second++;
if(second>=60)//1m
{
second=0;
minute++;
if(minute>=60)//1h
{
minute=0;
hour++;
if(hour>=24)//1day
{
hour=0;
flag_week++;//星期调整
if(flag_week>8)
{
flag_week=1;
}
day++;
if(day>(days=result()))//1month
{
day=1;
month++;
if(month>12)//1year
{
month=1;
year++;
if(year>100)
{
year=0;
}
}
}
}
}
}
}
if(dema)
dema--;//写命令的延时
if(demb)
demb--;//按键的延时
//************闹铃**********
if(demc)
{
demc--;
}
if(demd)
{
demd--;
}
flag++;
if(flag>=200)
{
flag=0;
temp=1;
deme++;
if(deme>=2)
{
demc=0;
temp=0;
}
}
}
//**************************
//正常日期时间显示
//**************************
void display()
{
a=hour/10;
b=hour%10;
c=minute/10;
d=minute%10;
e=second/10;
f=second%10;
m3=year/10;
m4=year%10;
m6=month/10;
m7=month%10;
m9=day/10;
m10=day%10;
//*****第一排显示 **********
lcd_com(0x81);//第一排从第2个位置开始显示
lcd_data(0x32);
lcd_com(0x82);
lcd_data(0x30);
lcd_com(0x83);
lcd_data(0x30+m3);
lcd_com(0x84);
lcd_data(0x30+m4);
lcd_com(0x85);
lcd_data(0x2d);//"-"
lcd_com(0x86);
lcd_data(0x30+m6);
lcd_com(0x87);
lcd_data(0x30+m7);
lcd_com(0x88);
lcd_data(0x2d);//"-"
lcd_com(0x89);
lcd_data(0x30+m9);
lcd_com(0x8a);
lcd_data(0x30+m10);
if(flag_week==1)//周1
{
lcd_com(0x8c);
for(n=0;n<3;n++)
{
lcd_data(week1[n]);
}
}
else if(flag_week==2)//周2
{
lcd_com(0x8c);
for(n=0;n<3;n++)
{
lcd_data(week2[n]);
}
}
else if(flag_week==3)//周3
{
lcd_com(0x8c);
for(n=0;n<3;n++)
{
lcd_data(week3[n]);
}
}
else if(flag_week==4)//周4
{
lcd_com(0x8c);
for(n=0;n<3;n++)
{
lcd_data(week4[n]);
}
}
else if(flag_week==5)//周5
{
lcd_com(0x8c);
for(n=0;n<3;n++)
{
lcd_data(week5[n]);
}
}
else if(flag_week==6)//周6
{
lcd_com(0x8c);
for(n=0;n<3;n++)
{
lcd_data(week6[n]);
}
}
else if(flag_week==7)//周7
{
lcd_com(0x8c);
for(n=0;n<3;n++)
{
lcd_data(week7[n]);
}
}
//*****第二排显示***********
lcd_com(0xc2);//第二排从第3个位置开始显示
lcd_data(0x30+a);
lcd_com(0xc3);
lcd_data(0x30+b);
lcd_com(0xc4);
lcd_data(0x3a);//":"
lcd_com(0xc5);
lcd_data(0x30+c);
lcd_com(0xc6);
lcd_data(0x30+d);
lcd_com(0xc7);
lcd_data(0x3a);//":"
lcd_com(0xc8);
lcd_data(0x30+e);
lcd_com(0xc9);
lcd_data(0x30+f);
lcd_com(0xcb);
lcd_data(0x47);//"G"
lcd_com(0xcc);
lcd_data(0x47);//"G"
lcd_com(0xcd);
lcd_data(0x47);//"G"
}
//**********************************************
//*************************看闹钟***************
void display_alarm()
{
a=hh/10;
b=hh%10;
c=min/10;
d=min%10;
e=sec/10;
f=sec%10;
m3=year/10;
m4=year%10;
m6=month/10;
m7=month%10;
m9=day/10;
m10=day%10;
//*****第一排显示 **********
lcd_com(0x81);//第一排从第2个位置开始显示
lcd_data(0x32);
lcd_com(0x82);
lcd_data(0x30);
lcd_com(0x83);
lcd_data(0x30+m3);
lcd_com(0
DS1602显示的可调时间、日期、星期、闹铃的数字钟
5星 · 超过95%的资源 需积分: 10 99 浏览量
2010-01-08
22:29:05
上传
评论
收藏 44KB ZIP 举报
hsllssmxian
- 粉丝: 1
- 资源: 1
最新资源
- 2022NOC软件创意编程赛项真题python小学高年级-决赛(有解析)
- mathml转换latex需要的xsl文件
- 2022NOC软件创意编程赛项真题图形化小学高年级-决赛赛(有解析)
- gbase驱动下载gbase-connector-java-8.3.81.53驱动下载
- 2022NOC软件创意编程赛项真题图形化小学低年级-决赛赛(有解析)
- InsightFace从青铜到王者,超大规模人脸识别的优雅解法
- python后端开发spider框架详解
- 基于 STM32 与 ESP8266 的智能家居系统源码.zip
- 毕业设计:基于SSM的mysql-个性化点餐配送系统(源码 + 数据库 + 说明文档)
- 基于matlab的鱼苗计数识别(GUI界面).zip代码57
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈