万年历.docx
- 文档编号:3504921
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:32
- 大小:23.09KB
万年历.docx
《万年历.docx》由会员分享,可在线阅读,更多相关《万年历.docx(32页珍藏版)》请在冰豆网上搜索。
万年历
上传了半天传不上去,说什么有非法内容,我晕,就几个程序还难到是木马不成
/*============================================================
使用1602液晶显示DS1302+c51时钟
[注:
AT89C51使用12M晶振]
=============================================================*/
#include
#include
#include
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
#defineLCM_RWP2_1//定义引脚
#defineLCM_RSP2_0
#defineLCM_EP2_2
#defineLCM_DataP0
#defineBusy0x80//用于检测LCM状态字中的Busy标识
#defineucharunsignedchar
sbitT_CLK=P1^5;
sbitT_IO=P1^6;
sbitT_RST=P1^4;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbitLED=P2^0;//背光灯输出(因本实验板无此功能所以此项功能无效)
sbitsystem=P1^1;//模式
sbitTimerUp=P1^2;//时间加
sbitTimerDown=P1^0;//时间减
sbitSpeaker=P2^1;//蜂鸣器
voidSet(uchar,uchar);//根据选择调整相应项目
voidRTInputByte(uchar);//输入1Byte*/
ucharRTOutputByte(void);//输出1Byte*/
voidW1302(uchar,uchar);//向DS1302写入一个字节
ucharR1302(uchar);//从DS1302读出一个字节
voidSet1302(uchar*);//设置时间
voidKeySound();//按键音
voidClockSound();//闹铃蜂鸣声
ucharid,msec,model,LedTime,d;
bita,b;//闪烁标志位
ucharinittime[7]={0x00,0x10,0x19,0x29,0x03,0x04,0x06};//初始化后设置为:
06年3月29日星期319点10分0秒
voidOut_LCM(void);//显示屏幕
voidmodel0(void);//显示输出
voidmodel1(void);
voidmodel2(void);
voidmodel3(void);
voidmodel4(void);
voidmodel5(void);
voidmodel6(void);
voidid_case1_key();//项目调整
voidModset();//模式键处理
voidWriteDataLCM(ucharWDLCM);
voidWriteCommandLCM(ucharWCLCM,BuysC);
ucharReadStatusLCM(void);
voidLCMInit(void);
voidOutputInformation(ucharX,ucharY,ucharDData);
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);
voidDelay5Ms(void);
voidDelay400Ms(void);
voidsystemsetup(void);//进入系统设置
ucharcodesystemp[]={"System.setup"};//字符串输出(系统设定)
ucharcodeTIMER[]={"Time"};//字符串输出(时间)
ucharcodeDATE[]={"Date"};//字符串输出(日期)
ucharcodealarmclock[]={"Clock"};//字符串输出(闹铃)
ucharcodelamp[]={"Lamp"};//字符串输出(背光灯)
ucharcodereset[]={"Reset"};//字符串输出(时间归零)
ucharcodeexit[]={"Exit"};//字符串输出(退出)
ucharcodeset[]={"Set"};//字符串输出(设置)
ucharcodesec[]={"sec"};//字符串输出(秒)
ucharcodeClockSet[]={"ClockSet"};//字符串输出(闹铃设置)
ucharcodeClockOn[]={"ON"};//字符串输出(ON)
ucharcodeClockOff[]={"OFF"};//字符串输出(OFF)
voidtimesetup(void);//时间设置
voiddatesetup(void);//日期设置
voidalarmclockset(void);//闹铃设置
voidlampsetup(void);//背光灯设置
voidtimereset(void);//时间清零
/*******************************************************************/
voiddelay1(intms)
{
unsignedchary;
while(ms--)
{
for(y=0;y<250;y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
voidmain(void)
{
Speaker=1;//关闭蜂鸣器
LED=0;//打开LED,低电平有效,外接9012驱动
Delay400Ms();//启动等待,等LCM讲入工作状态
Delay400Ms();
LCMInit();//LCM初始化
TMOD=0x01;//16位定时
TH0=0x3c;//50ms
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
while
(1)
{
if(TimerDown==0)//左移键按下后把背光灯打开
{Delay5Ms();
if(TimerDown==0)
{KeySound();//蜂鸣声
LED=0;//打开背光灯
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;}//取出背光灯时间并转换为十进制数
}
b=1;//模式键是否动作标志。
为1时不动作,为0时动作。
Modset();//调用模式键处理程序判断按键是否按下。
if(b==0)
{
KeySound();//蜂鸣声
LED=0;//打开背光灯
systemsetup();//进入系统设置模式
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;//取出背光灯时间并转换为十进制数
}
if((LED==0)&&LedTime==0)//延时间是否到
LED=1;//关闭背光灯
if(R1302(0xc3)==1)//闹铃是否打开,0xc3为读闹铃寄存器地址。
{if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7)))//判断闹铃时间是否到,
ClockSound();//发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
}
model0();//输出显示屏幕
}
}
voidKeySound()//按键音
{
Speaker=0;//开蜂鸣声
Delay5Ms();
Speaker=1;//关蜂鸣声
}
voidClockSound()//闹铃蜂鸣声
{
if(a==0)
{
Speaker=0;//开蜂鸣声
Delay5Ms();
Delay5Ms();
Delay5Ms();
Speaker=1;//关蜂鸣声
}
}
voidModset()//模式键处理
{if(system==0)
{
Delay5Ms();
if(system==0)
{while(system==0);
KeySound();//蜂鸣声
a=0;msec=0;b=0;//a、msec为闪烁标志,按键有动作时清零,不闪烁。
}//b为模式键确认动作。
其它程判断b是否为零时来确定模式键是否动作。
}
}
voidsystemsetup(void)//系统设置
{
model=1;
while(model!
=0)
{
Out_LCM();
if(TimerUp==0)//设置项目左移
{Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model--==1)//6种系统设置项目
model=6;
}
while(TimerUp==0);
}
if(TimerDown==0)//设置项目右移
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model++==6)
model=1;
}
while(TimerDown==0);
}
b=1;//模式键是否动作标志。
为1时不动作,为0时动作。
Modset();//调用模式键处理程序判断按键是否按下。
if(b==0)
{KeySound();//蜂鸣声
switch(model)//进入进个项目设置
{
case1:
timesetup();break;//时间设置
case2:
datesetup();break;//日期设置
case3:
alarmclockset();break;//闹铃设置
case4:
lampsetup();break;//背光灯设置
case5:
timereset();break;//时间清零
case6:
model=0;break;//退出系统设置
}
}
}
}
voidtimesetup()//时间调整
{
id=6;
while(model==1)//model为1时进入时间调整
{
b=1;
Modset();
if(b==0)
{KeySound();//蜂鸣声
if(id++==9)//6..9为时分秒调。
.
id=6;
}
id_case1_key();//调用按键处理
Out_LCM();//显示输出
}
}
voiddatesetup()//对日期进行调整
{
id=1;
while(model==2)//model为2时进入日期调整
{b=1;
Modset();//模式键是否动作
if(b==0)
{KeySound();//蜂鸣声
if(id++==5)//1..5为年月日星期exit
id=1;
}
id_case1_key();//日期调整
Out_LCM();//显示输出
}
}
voidalarmclockset(void)//闹铃调整
{id=12;
while(model==3)//进入闹铃设置
{b=1;
Modset();//模式键是否动作
if(b==0)
{KeySound();//蜂鸣声
if(R1302(0xc3)%16==0)
{id=0;model++;}//0xc2为闹铃开关寄存器。
当为关时按下模式键时将退出闹铃设置,当开时进入闹铃时间设置
elseif(id++==15)//12..15为闹铃开关和时间设置exit
id=12;
}
id_case1_key();//调整
Out_LCM();//显示输出
}
}
voidlampsetup(void)//背光灯时间设置
{id=10;//背光灯存储空间DS1302(0xc0)
while(model==4)//model为3时进入背光灯调整
{b=1;
Modset();//模式键是否动作
if(b==0)
{KeySound();//蜂鸣声
if(id++==11)//10为背光灯exit
id=10;
}
id_case1_key();
Out_LCM();//显示输出
}
}
voidtimereset()//时间清零
{
Set1302(inittime);//清时间
W1302(0x90,0xa5);//打开充电二级管一个二级管串联一个2K电阻
model++;
}
//对相应的项目进行加、减调整。
voidid_case1_key()//按键处理
{
if(TimerUp==0)//增加
{
Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound();//蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15))//当ID为9、5时按下加、减键将退出调整
{model++;//退出时间、日期设置
id=0;
}
else
Set(id,1);
}
while(TimerUp==0);
}
if(TimerDown==0)//减少
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15))//当ID为9、5时按下加、减键将退出调整
{model++;//退出时间、日期设置
id=0;
}
else
Set(id,0);//调用DS1302写入函数
}
while(TimerDown==0);
}
}
voidtimer_1(void)interrupt1//中断入口,闪烁
{
TH0=0x3c;//50ms定时
TL0=0xb0;
if(msec++==10)//500ms
{msec=0;a=~a;//闪烁标志反转
if(a==0)//1秒后背光时间减一秒。
LedTime--;
}
}
//根据选择调整相应项目并写入DS1302
voidSet(ucharsel,ucharsel_1)
{
ucharaddress,item;
ucharmax,min;
if(sel==1){address=0x8c;max=99;min=0;}//年
if(sel==2){address=0x88;max=12;min=1;}//月
if(sel==3){address=0x86;max=31;min=1;}//日
if(sel==4){address=0x8a;max=7;min=1;}//星期
if(sel==6){address=0x84;max=23;min=0;}//小时
if(sel==7){address=0x82;max=59;min=0;}//分钟
if(sel==8){address=0x80;max=59;min=0;}//秒
if(sel==10){address=0xc0;max=59;min=0;}//背光时间,最长1分钟
if(sel==12){address=0xc2;max=1;min=0;}//闹铃开关寄存器
if(sel==13){address=0xc4;max=23;min=0;}//闹铃时寄存器
if(sel==14){address=0xc6;max=59;min=0;}//闹铃分寄存器
item=R1302(address+1)/16*10+R1302(address+1)%16;
if(sel_1==0)item++;elseitem--;
if(item>max)item=min;
if(item W1302(0x8e,0x00);//允许写操作 W1302(address,item/10*16+item%10);//写入DS1302//转成BCD码 W1302(0x8e,0x80);//写保护,禁止写操作 } //屏幕显示 voidOut_LCM(void) {switch(model) { case0: model0();break; case1: model1();break; case2: model2();break;//在不同的条件下显示不同的字符 case3: model3();break; case4: model4();break; case5: model5();break; case6: model6();break; } } /***********************model为零时第一行显示时间,不为零时显示systemsetup******/ voidmodel0() { DisplayListChar(0,0,TIMER);//显示固定字符串(Time) OutputInformation(13,0,0x20);//不显示 OutputInformation(4,0,0x20);//不显示 OutputInformation(4,1,0x20);//不显示 OutputInformation(15,1,0x20);//不显示 OutputInformation(7,1,0x2f);//显示固定字符"/" OutputInformation(10,1,0x2f);//显示固定字符"/" OutputInformation(13,1,0x2f);//显示固定字符"/" DisplayListChar(0,1,DATE);//显示固定字符串Date(日期) if(a==1)//冒号闪烁 {OutputInformation(7,0,0x3a);OutputInformation(10,0,0x3a);} else {OutputInformation(7,0,0x20);OutputInformation(10,0,0x20);} /*******************model为零时第二行显示日期,不为零显示设置项目*******/ OutputInformation(5,1,R1302(0x8d)/16+0x30);//显示年 OutputInformation(6,1,R1302(0x8d)%16+0x30); OutputInformation(8,1,R1302(0x89)/16+0x30);//显示月 OutputInformation(9,1,R1302(0x89)%16+0x30); OutputInformation(11,1,R1302(0x87)/16+0x30);//显示日 OutputInformation(12,1,R1302(0x87)%16+0x30); OutputInformation(14,1,R1302(0x8b)%16+0x30);//显示星期 OutputInformation(5,0,R1302(0x85)/16+0x30);//显示小时 OutputInformation(6,0,R1302(0x85)%16+0x30); OutputInformation(8,0,R1302(0x83)/16+0x30);//显示分钟 OutputInformation(9,0,R1302(0x83)%16+0x30); OutputInformation(11,0,R1302(0x81)/16+0x30);//显示秒 OutputInformation(12,0,R1302(0x81)%16+0x30); } /*************************model不为零时显示系统设置***********************************/ //model为1时time闪烁,按下模式键后进入时间调整 voidmodel1() /*************************************判断ID的值来显示项目***********************/ {OutputInformation(0,0,0x20);//不显示 OutputInformation(1,0,0x20); DisplayListChar(2,0,systemp);//第一行显示systemsetup if(id==0)//为0时显示TIMEdatelalcak {OutputInformation(9,1,0x20);//不显示 OutputInformation(4,1,0x20);//不显示 OutputInformation(15,1,0x20);//不显示 DisplayListChar(5,1,DATE);//显示date DisplayListChar(10,1,alarmclock);//显示lalcak if(a==1) {OutputInformation(0,1,0x20);//不显示 OutputInformation(1,1,0x20);/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历