/*************** writer:小白 ******************/
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "MusicPlay.h"
#include "MusicMap.h"
#define uint unsigned int //宏定义
#define uchar unsigned char
#define DS_SECOND 0x80 //DS1302数据地址。
#define DS_MINUTE 0x82
#define DS_HOUR 0x84
#define DS_WEEK 0x8A
#define DS_DAY 0x86
#define DS_MONTH 0x88
#define DS_YEAR 0x8C
//**********************************************数据定义**********************************************//
sbit IO = P1^0; //三线接口时的双向数据线
sbit SCLK = P1^1; //串行时钟,控制数据的输入与输出
sbit RST = P1^2; //复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送
sbit RS = P2^0; //0=输入指令,1=输入数据
sbit RW = P2^1; //0=向LCD写入指令或数据,1=从LCD读取信息
sbit EN = P2^2; //使能信号,1时读取信息,1->0(下降沿)执行指令
sbit K0 = P2^3; //按钮,功能切换
sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;
sbit S1 = P2^4; //音乐开关
uchar FunctionIndex; //功能模式索引
//**********************************************时钟模式数据定义**********************************************//
code uchar *WEEK[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};
uchar LCD_DSY_BUFFER1[]={"Date 00-00-00 "};
uchar LCD_DSY_BUFFER2[]={"Time 00:00:00 "};
uchar DateTime[7]; //秒,分,时,日,月,星期,年
code *Index[]={"[Y]","[M]","[D]","[h]","[m]","[s]"}; //日期和时间修改提示
uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
//**********************************************闹钟模式数据定义**********************************************//
code uchar LCD_DSY_BUFFER3[]={"Set Alarm Clock: "};
idata uchar LCD_DSY_BUFFER4[]={"Time 00:00 S1 "};
idata uchar AlarmTime[3]={1,0,0}; //暂存闹钟设定的歌曲,分,时
code uchar *Index1[]={"[h]","[m]","[S]"}; //闹钟修改提示
idata uchar AC_flag; //闹钟开启标志
//**********************************************秒表模式数据定义**********************************************//
code uchar LCD_DSY_BUFFER5[]={"StopWatch: "};
idata uchar LCD_DSY_BUFFER6[]={" 00'00\"00 "};
code uchar *Index2[]={"[A]","[P]","[T]","[D]","[R]"}; //秒表修改提示
uchar StopTime[3]; //分,秒,毫秒
idata uchar Record[12][3]; //存储秒表记录
uchar Index_Record; //记录索引
uchar Count_Display; //显示索引
//**********************************************倒计时模式数据定义**********************************************//
code uchar LCD_DSY_BUFFER7[]={"CountDown: "};
idata uchar LCD_DSY_BUFFER8[]={" 00:00:00 "};
code uchar *Index3[]={"[h]","[m]","[s]"}; //倒计时修改提示
uchar CountTime[3]; //暂存倒计时设置的时,分,秒
//**********************************************节日模式数据定义**********************************************//
code uchar LCD_DSY_BUFFER9[]={"Greetings: "};
uchar LCD_DSY_BUFFER0[]={" "}; //用于显示节日字符串
//**********************************************DS1302驱动函数**********************************************//
void DelayMS(uint ms) //延时函数
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void Write_A_Byte_TO_DS1302(uchar x) //向DS1302写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
IO=x&0x01;SCLK=1;SCLK=0;x>>=1;
}
}
uchar Get_A_Byte_FROM_DS1302() //从DS1302获得一个字节
{
uchar i,b=0x00;
for(i=0;i<8;i++)
{
b |= _crol_((uchar)IO,i);
SCLK=1;SCLK=0;
}
return b/16*10+b%16;
}
void Write_DS1302(uchar addr, uchar dat) //向DS1302指定地址写入数据
{
SCLK=0;
RST=1;
Write_A_Byte_TO_DS1302(addr);
Write_A_Byte_TO_DS1302(dat);
SCLK=0;
RST=0;
}
uchar Read_Data(uchar addr) //从DS1302指定的地址读数据
{
uchar dat;
RST = 0;SCLK=0;RST=1;
Write_A_Byte_TO_DS1302(addr);
dat = Get_A_Byte_FROM_DS1302();
SCLK=1;RST=0;
return dat;
}
//**********************************************LCD1402驱动函数**********************************************//
uchar Read_LCD_State() //读LCD状态
{
uchar state;
RS=0;RW=1;EN=1;DelayMS(1);
state=P0;
EN = 0;DelayMS(1);
return state;
}
void LCD_Busy_Wait() //忙等待
{
while((Read_LCD_State()&0x80)==0x80);
DelayMS(1);
}
void Write_LCD_Data(uchar dat) //向LCD写1 Byte数据
{
LCD_Busy_Wait();
RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;
}
void Write_LCD_Command(uchar cmd) //向LCD写指令
{
LCD_Busy_Wait();
RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;
}
void Init_LCD() //LCD初始化
{
Write_LCD_Command(0x38);
DelayMS(1);
Write_LCD_Command(0x01);
DelayMS(1);
Write_LCD_Command(0x06);
DelayMS(1);
Write_LCD_Command(0x0c);
DelayMS(1);
}
//**********************************************功能函数**********************************************//
void GetTime() //读取DS1302芯片中的日期&时间
{
uchar i,addr = 0x81;
for(i=0;i<7;i++)
{
DateTime[i]=Read_Data(addr);addr+=2;
}
}
void Format_DateTime(uchar d,uchar *a) //将两位数的 日期&时间 转换为 字符型
{
a[0]=d/10+'0';
a[1]=d%10+'0';
}
void Set_LCD_POS(uchar p) //设置液晶屏显示的起始位置
{
Write_LCD_Command(p|0x80);
}
void Display_LCD_String(uchar p,uchar *s) //在LCD上指定位置显示字符串
{
uchar i;
Set_LCD_POS(p);
for(i=0;i<16;i++)
{
Write_LCD_Data(s[i]);
DelayMS(1);
}
}
void ShowTime() //在LCD上显示日期和时间
{
Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);
Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);
Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);
strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]-1]);
Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);
Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);
Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);
Display_LCD_String(0x00,LCD_DSY_BUFFER1);
Display_LCD_String(0x40,LCD_DSY_BUFFER2);
}
void SetTime(unsigned char ucAddress, unsigned char ucValue) //将设置好的日期&时间写入DS1302
{
Write_DS1302(0x8e,0x00); //写控制字,取消写保护;
Write_DS1302(ucAddress, ((ucValue/10)<<4 | (ucValue%10))); //把ucValue转换成BCD码,然后写入。
Write_DS1302(0x8e,0x80); //加保护;
}
uchar isLeapYear(uint y) //判断是否为润年
{
return(y%4==0&&y%100!=0)||(y%400==0);
}
void RefreshWeekDay() //求自2000.1.1开始的任何一天是星期几
{
uint i, d, w=5; //已知1999.12.31是周五
for(i=2000;i<2000+DateTime[6];i++)
{
d=isLeapYear(i) ? 366:365;
w=(w+d)%7;
}
d=0;
for(i=1;i<DateTime[4];i++)
d+=MonthsDays[i];
d+=DateTime[3];
//***保存星期,0~6表示星期日,星期一,二,...六,为了与DS1302的星期格式匹配,返回值需要加1***//
DateTime[5]=(w+d)%7+1;
SetTime(DS_WEEK,DateTime[5]);
}
void DateTime_Modify(uchar index,uchar operate) //修改日期和时间并写入DS1302
{ //操作数为1时,加1操作,操作数为2时,减1操作
switch(index)
{
case 0: if(operate==1) //年修改
{
DateTime[6]=(DateTime[6]+1)%100;
MonthsDays[2]=isLeapYear(2000+DateTime[6])? 29:28;
}
else if(operate==2)
{
if(DateTime[6]==0)
{
DateTime[6]=99;
MonthsDays[2]=isLeapYear(1990+DateTime[6])? 29:28;
}
else
{
DateTime[6]=DateTime[6]-1;
MonthsDays[2]=isLeapYear(2000+DateTime[6])? 29:28;
}
}
if(DateTime[4]==2&&DateTime[3]==29)
{
DateTime[3]= MonthsDays[2];
}
RefreshWeekDay();
ShowT

PoppinWilliam
- 粉丝: 0
最新资源
- 小游戏五子棋JAVA程序设计.doc
- 综合项目管理大知识标准体系.docx
- 江苏省建设厅项目管理表样本.doc
- 系统集成项目管理工程师考试题库系统集成技术试题汇中样本.doc
- 上半年信息系统项目管理师参考答案及解析.doc
- 物联网期末设计.doc
- 运筹学图与网络分析.ppt
- 如何做好软件系统演示.ppt
- 基于RRTConnect算法的双履带起重机路径规划研究论文.doc
- 网络工程专业大学生职业生涯规划书范文字.doc
- 开放型计算机网络实验室建设路径研究获奖科研报告论文.docx
- 愿望网站策划案.doc
- 网络传播概论全书整本书电子教案教学教程.pptx
- 网络设备调试员(高级)实践操作题.doc
- 数控编程的工艺处理ppt课件.ppt
- (完整版)螺纹连接计算(附Excel计算).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
前往页