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