?? 卡7萬(wàn)年歷時(shí)鐘讀寫.c
字號(hào):
/*============================================================
使用1602液晶顯示DS1302+c51時(shí)鐘
[注:AT89C51使用12M晶振]
=============================================================*/
#include <AT89x51.h>
#include <string.h>
#define LCM_RW P3_1 //定義引腳
#define LCM_RS P3_0
#define LCM_E P3_2
#define LCM_Data P0
#define Busy 0x80 //用于檢測(cè)LCM狀態(tài)字中的Busy標(biāo)識(shí)
#define uchar unsigned char
sbit T_CLK=P2^3;
sbit T_IO =P2^4;
sbit T_RST=P2^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit LED=P2^0; //背光燈輸出 (因本實(shí)驗(yàn)板無(wú)此功能 所以此項(xiàng)功能無(wú)效)
sbit system=P1^1; //模式
sbit TimerUp=P1^2; //時(shí)間加
sbit TimerDown=P1^0; //時(shí)間減
sbit Speaker=P2^1; //蜂鳴器
void Set(uchar,uchar); //根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目
void RTInputByte(uchar); //輸入 1Byte */
uchar RTOutputByte(void); //輸出 1Byte */
void W1302(uchar, uchar); //向DS1302寫入一個(gè)字節(jié)
uchar R1302(uchar); //從DS1302讀出一個(gè)字節(jié)
void Set1302(uchar * ); //設(shè)置時(shí)間
void KeySound(); //按鍵音
void ClockSound(); //鬧鈴蜂鳴聲
uchar id,msec,model,LedTime,d;
bit a,b; //閃爍標(biāo)志位
uchar inittime[7]={0x00,0x10,0x19,0x29,0x03,0x04,0x06}; //初始化后設(shè)置為:06年3月29日星期3 19點(diǎn)10分0秒
void Out_LCM(void); //顯示屏幕
void model0(void); //顯示輸出
void model1(void);
void model2(void);
void model3(void);
void model4(void);
void model5(void);
void model6(void);
void id_case1_key(); //項(xiàng)目調(diào)整
void Modset(); //模式鍵處理
void WriteDataLCM(uchar WDLCM);
void WriteCommandLCM(uchar WCLCM,BuysC);
uchar ReadStatusLCM(void);
void LCMInit(void);
void OutputInformation(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void systemsetup(void); //進(jìn)入系統(tǒng)設(shè)置
uchar code systemp[]={"System.setup"}; //字符串輸出(系統(tǒng)設(shè)定)
uchar code TIMER[]={"Time"}; //字符串輸出(時(shí)間)
uchar code DATE[]={"Date"}; //字符串輸出(日期)
uchar code alarmclock[]={"Clock"}; //字符串輸出(鬧鈴)
uchar code lamp[]={"Lamp"}; //字符串輸出(背光燈)
uchar code reset[]={"Reset"}; //字符串輸出(時(shí)間歸零)
uchar code exit[]={"Exit"}; //字符串輸出(退出)
uchar code set[]={"Set"}; //字符串輸出(設(shè)置)
uchar code sec[]={"sec"}; //字符串輸出(秒)
uchar code ClockSet[]={"ClockSet"}; //字符串輸出(鬧鈴設(shè)置)
uchar code ClockOn[]={"ON"}; //字符串輸出(ON)
uchar code ClockOff[]={"OFF"}; //字符串輸出(OFF)
void timesetup(void); //時(shí)間設(shè)置
void datesetup(void); //日期設(shè)置
void alarmclockset(void); //鬧鈴設(shè)置
void lampsetup(void); //背光燈設(shè)置
void timereset(void); //時(shí)間清零
void main(void)
{
Speaker=1; //關(guān)閉蜂鳴器
LED=0; //打開LED ,低電平有效,外接9012驅(qū)動(dòng)
Delay400Ms(); //啟動(dòng)等待,等LCM講入工作狀態(tài)
LCMInit(); //LCM初始化
TMOD=0x01; //16位定時(shí)
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;} //取出背光燈時(shí)間并轉(zhuǎn)換為十進(jìn)制數(shù)
}
b=1; //模式鍵是否動(dòng)作標(biāo)志。為1時(shí)不動(dòng)作,為0時(shí)動(dòng)作。
Modset(); //調(diào)用模式鍵處理程序判斷按鍵是否按下。
if(b==0)
{
KeySound(); //蜂鳴聲
LED=0; //打開背光燈
systemsetup(); //進(jìn)入系統(tǒng)設(shè)置模式
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16; //取出背光燈時(shí)間并轉(zhuǎn)換為十進(jìn)制數(shù)
}
if((LED==0)&&LedTime==0) //延時(shí)間是否到
LED=1; //關(guān)閉背光燈
if(R1302(0xc3)==1) //鬧鈴是否打開,0xc3為讀鬧鈴寄存器地址。
{if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))) //判斷鬧鈴時(shí)間是否到,
ClockSound(); //發(fā)出鬧鈴蜂鳴聲,無(wú)按鍵動(dòng)作蜂鳴一分鐘。
}
model0(); //輸出顯示屏幕
}
}
void KeySound() //按鍵音
{
Speaker=0; //開蜂鳴聲
Delay5Ms();
Speaker=1; //關(guān)蜂鳴聲
}
void ClockSound() //鬧鈴蜂鳴聲
{
if(a==0)
{
Speaker=0; //開蜂鳴聲
Delay5Ms();
Delay5Ms();
Delay5Ms();
Speaker=1; //關(guān)蜂鳴聲
}
}
void Modset() //模式鍵處理
{ if(system==0)
{
Delay5Ms();
if(system==0)
{while(system==0);
KeySound(); //蜂鳴聲
a=0;msec=0;b=0; //a、msec為閃爍標(biāo)志,按鍵有動(dòng)作時(shí)清零,不閃爍。
} //b為模式鍵確認(rèn)動(dòng)作。其它程判斷b是否為零時(shí)來確定模式鍵是否動(dòng)作。
}
}
void systemsetup(void) //系統(tǒng)設(shè)置
{
model=1;
while(model!=0)
{
Out_LCM();
if (TimerUp==0) //設(shè)置項(xiàng)目左移
{Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound();//蜂鳴聲
if(model--==1) //6種系統(tǒng)設(shè)置項(xiàng)目
model=6;
}
while(TimerUp==0);
}
if (TimerDown==0) //設(shè)置項(xiàng)目右移
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鳴聲
if(model++==6)
model=1;
}
while(TimerDown==0);
}
b=1; //模式鍵是否動(dòng)作標(biāo)志。為1時(shí)不動(dòng)作,為0時(shí)動(dòng)作。
Modset(); //調(diào)用模式鍵處理程序判斷按鍵是否按下。
if(b==0)
{KeySound(); //蜂鳴聲
switch(model) //進(jìn)入進(jìn)個(gè)項(xiàng)目設(shè)置
{
case 1:
timesetup(); break; //時(shí)間設(shè)置
case 2:
datesetup();break; //日期設(shè)置
case 3:
alarmclockset();break;//鬧鈴設(shè)置
case 4:
lampsetup();break; //背光燈設(shè)置
case 5:
timereset();break; //時(shí)間清零
case 6:
model=0;break; //退出系統(tǒng)設(shè)置
}
}
}
}
void timesetup() //時(shí)間調(diào)整
{
id=6;
while(model==1) //model為1時(shí)進(jìn)入時(shí)間調(diào)整
{
b=1;
Modset();
if(b==0)
{KeySound(); //蜂鳴聲
if(id++==9) //6..9為時(shí)分秒調(diào)。 .
id=6;
}
id_case1_key(); //調(diào)用按鍵處理
Out_LCM(); //顯示輸出
}
}
void datesetup() //對(duì)日期進(jìn)行調(diào)整
{
id=1;
while(model==2) //model為2時(shí)進(jìn)入日期調(diào)整
{b=1;
Modset(); //模式鍵是否動(dòng)作
if(b==0)
{KeySound(); //蜂鳴聲
if(id++==5) //1..5為年月日星期 exit
id=1;
}
id_case1_key(); //日期調(diào)整
Out_LCM(); //顯示輸出
}
}
void alarmclockset(void) //鬧鈴調(diào)整
{id=12;
while(model==3) //進(jìn)入鬧鈴設(shè)置
{b=1;
Modset(); //模式鍵是否動(dòng)作
if(b==0)
{KeySound(); //蜂鳴聲
if(R1302(0xc3)%16==0)
{id=0;model++;} //0xc2為鬧鈴開關(guān)寄存器。當(dāng)為關(guān)時(shí)按下模式鍵時(shí)將退出鬧鈴設(shè)置,當(dāng)開時(shí)進(jìn)入鬧鈴時(shí)間設(shè)置
else if(id++==15) //12..15為鬧鈴開關(guān)和時(shí)間設(shè)置 exit
id=12;
}
id_case1_key(); //調(diào)整
Out_LCM(); //顯示輸出
}
}
void lampsetup(void) //背光燈時(shí)間設(shè)置
{id=10; //背光燈存儲(chǔ)空間DS1302(0xc0)
while(model==4) //model為3時(shí)進(jìn)入背光燈調(diào)整
{b=1;
Modset(); //模式鍵是否動(dòng)作
if(b==0)
{KeySound(); //蜂鳴聲
if(id++==11) //10為背光燈 exit
id=10;
}
id_case1_key();
Out_LCM(); //顯示輸出
}
}
void timereset() //時(shí)間清零
{
Set1302(inittime); //清時(shí)間
W1302(0x90,0xa5); //打開充電二級(jí)管 一個(gè)二級(jí)管串聯(lián)一個(gè)2K電阻
model++;
}
//對(duì)相應(yīng)的項(xiàng)目進(jìn)行加、減調(diào)整。
void id_case1_key() //按鍵處理
{
if (TimerUp==0) //增加
{
Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound(); //蜂鳴聲
if((id==9)||(id==5)||(id==11)||(id==15)) //當(dāng)ID為9、5時(shí)按下加、減鍵將退出調(diào)整
{ model++; //退出時(shí)間、日期設(shè)置
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)) //當(dāng)ID為9、5時(shí)按下加、減鍵將退出調(diào)整
{ model++; //退出時(shí)間、日期設(shè)置
id=0;
}
else
Set(id,0); //調(diào)用DS1302寫入函數(shù)
}
while(TimerDown==0);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -