|
本帖最后由 1860774xxxx 于 2022-12-26 15:28 編輯
這是舊版 退役拆解了
新版
與電路圖所示 共設(shè)置4個(gè)按鍵 短按開關(guān)臺(tái)燈 加減鍵調(diào)光 長(zhǎng)按進(jìn)入菜單
1.臺(tái)燈 加入PCA PWM 調(diào)光
STC12C5A60S2的PCA PWM非常好用 設(shè)置簡(jiǎn)單無極調(diào)節(jié) 0-255可調(diào)
2.加入3種時(shí)鐘字體
宋體字體
數(shù)碼字體
創(chuàng)意字體
3.新增平潤(rùn)年顯示 其他生肖農(nóng)歷公歷節(jié)氣
4.新增功能菜單
時(shí)鐘設(shè)置
2組鬧鐘設(shè)置 采用軟開關(guān) 并保全到EEPROM 調(diào)電數(shù)據(jù)不丟失
設(shè)置
時(shí)鐘字體 宋體 數(shù)碼 創(chuàng)意 3種選擇 默認(rèn) 數(shù)碼
按鍵燈 全亮模式 單點(diǎn)模式 2種選擇 默認(rèn) 全亮模式
背光 10秒 20秒 30秒 1分鐘 2分鐘 3分鐘 可調(diào) 時(shí)間到自動(dòng)關(guān)閉背光燈 默認(rèn)30秒
按鍵聲 默開
整點(diǎn)報(bào)時(shí) 起點(diǎn)6 7 8 9 10可調(diào) 止點(diǎn)18 19 20 21 22 23可調(diào) 默認(rèn) 開 8時(shí)-21時(shí) 意思是8時(shí)到21時(shí)范圍內(nèi)報(bào)時(shí) 否則免打擾以上數(shù)據(jù)設(shè)置后保全到EEPROM 數(shù)據(jù)不會(huì)丟失
下載前須知
固件版本在v7.1及以上可用
部分程序
#include <STC12C5A60S2.H> //此文件中定義了單片機(jī)的一些特殊功能寄存器
#define uchar unsigned char //宏定義無符號(hào)字符形數(shù)據(jù)類型進(jìn)行聲明定義 定義名稱uchar 所占位數(shù)8位 范圍0~255
#define uint unsigned int //宏定義無符號(hào)整形數(shù)據(jù)類型進(jìn)行聲明定義 定義名稱uint 所占位數(shù)16位 范圍0~65535
#include "Delay.h" //全局通用延時(shí)頭文件
#include "LCD_ks0108ZK.h" //屏字庫(kù) 適合ks0108控制器的12864屏/19264屏
#include "LCD_ks0108.h" //屏驅(qū)動(dòng) 適合ks0108控制器的12864屏/19264屏
#include "ds3231.h" //ds3231時(shí)鐘芯片驅(qū)動(dòng)
#include "rqzh.h" //日期轉(zhuǎn)換
#include "dht11.h" //DHT11濕度溫度驅(qū)動(dòng)
#include "STC12C5A60S2_EEPROM.h" //STC12C5A60S2內(nèi)部存儲(chǔ)驅(qū)動(dòng)
/*按鍵與按鍵燈*/
sbit anjian1LED=P2^7; //按鍵燈1
sbit anjian1=P2^6; //臺(tái)燈/設(shè)置按鍵
sbit anjian2LED=P2^5; //按鍵燈2
sbit anjian2=P2^4; //加按鍵
sbit anjian3LED=P2^3; //按鍵燈3
sbit anjian3=P2^2; //減按鍵
sbit anjian4LED=P2^1; //按鍵燈4
sbit anjian4=P2^0; //提出/關(guān)閉響鈴按鍵
sbit fmq=P3^2; //有源蜂鳴器
sbit beiguangLED=P3^3; //屏幕背光
bit taidengLED; //臺(tái)燈開關(guān)變量 =1開燈 =0關(guān)燈
bit anjian1sf,anjian2_3sf,anjian4sf; //用于按鍵釋放標(biāo)記
bit qingpingsf; //用于清屏釋放標(biāo)記
bit fb_shizwz,fb_nzwz,fb_szwz; //功能菜單頁(yè)面下的"時(shí)鐘""鬧鐘""設(shè)置"文字反白標(biāo)記 =1反白 =0取消反白
bit fbs_nian,fbs_yue,fbs_ri,fbs_shi,fbs_fen,fbs_miao; //設(shè)置時(shí)鐘時(shí) 年月日時(shí)分秒反白 =1反白 =0取消反白
bit nz1_kg,nz2_kg,nz1_xl,nz2_xl; //鬧鐘1 鬧鐘2 開關(guān)變量 =1鬧鐘開 =0鬧鐘關(guān) 鬧鐘1 鬧鐘2 響鈴變量 =1響鈴 =0不響鈴
bit fb_nz1_shi,fb_nz1_fen,fb_nz1_kg,fb_nz2_shi,fb_nz2_fen,fb_nz2_kg; //設(shè)置鬧鐘時(shí)分開關(guān)反白 =1反白 =0取消反白
bit xianshiyemian; //顯示頁(yè)面變量 =0時(shí)鐘頁(yè)面 =1功能一級(jí)菜單頁(yè)面
bit zdbs_kg,fb_zdbs_kg,zdbs; //整點(diǎn)報(bào)時(shí)開關(guān) =1開 =0關(guān),反白整點(diǎn)報(bào)時(shí)開關(guān) =1反白 =0取消反白
bit fb_zdbs_qd,fb_zdbs_zd; //整點(diǎn)報(bào)時(shí) 起點(diǎn)止點(diǎn)反白 =1反白 =0取消反白
bit fb_bgsc; //背光時(shí)長(zhǎng)反白 =1反白 =0取消反白
bit jdms,fb_jdms; //鍵燈模式變量 鍵燈模式反白 =1反白 =0取消反白
bit fb_shizhongzt; //時(shí)鐘字體變量反白=1反白 =0取消反白
bit anjiansy_kg,fb_anjiansy; //按鍵聲音開關(guān) =1開 =0關(guān) 按鍵聲音反白標(biāo)志 =1反白 =0取消反白 按鍵聲音釋放
uchar LED_mun; //臺(tái)燈調(diào)光變量
uchar shizhongzt; //時(shí)鐘字體變量
uchar shezhixx; //設(shè)置選項(xiàng)變量
uchar zdbs_qd,zdbs_zd; //整點(diǎn)報(bào)時(shí)允許范圍 起點(diǎn)止點(diǎn)變量
uchar shezhiym; //二級(jí)菜單頁(yè)面 =0鐘時(shí)設(shè)置頁(yè)面 =1鬧鐘設(shè)置頁(yè)面 =2設(shè)置頁(yè)面
uchar anjianjsbl; //按鍵計(jì)數(shù)變量 實(shí)現(xiàn)長(zhǎng)按短按功能
uchar gncdym; //功能菜單頁(yè)面選項(xiàng)變量
uchar shizhongsz; //時(shí)鐘設(shè)置選項(xiàng)變量
uchar nz1_shi,nz1_fen,nz2_shi,nz2_fen,nz1_fen_Stop,nz2_fen_Stop; //鬧鐘1 鬧鐘2 變量
uchar naozhongsz; //鬧鐘設(shè)置選項(xiàng)變量
uchar pingbgjs,miaojs,miaomun,bgsc; //用于屏背光自動(dòng)控制定時(shí)計(jì)數(shù)標(biāo)志
uchar naozhonglx,anjians; //鬧鐘鈴響計(jì)數(shù)變量 按鍵計(jì)數(shù)變量
/*按鍵功能函數(shù)*/
void anjiangn()
{
/*按鍵1臺(tái)燈與功能按鍵 */
if(anjian1==0) //判斷按鍵是否按下
{
if(jdms==1)anjian1LED=0; //按鍵燈1單點(diǎn)模式
if(xianshiyemian==0) //以下操作在時(shí)鐘頁(yè)面有效
{
if(anjianjsbl<=100)anjianjsbl++; //給按鍵計(jì)數(shù)變量設(shè)置最大范圍值 范圍內(nèi)anjianjsbl++ 否則停止anjianjsbl++
if(anjianjsbl>=20) //長(zhǎng)按約大于3秒
{
if(qingpingsf==0)ClearDisplay(); //LCD清屏
xianshiyemian=1; //進(jìn)入功能菜單頁(yè)面
qingpingsf=1; //釋放LCD清屏 防止一直清屏
}
}
else //xianshiyemian=1已進(jìn)入功能菜單頁(yè)面 以下操作在功能菜單頁(yè)面有效
{
if(anjian1sf==0) //給與限制條件 每次操作只允許運(yùn)行一次
{
if(shezhiym==0) //功能菜單頁(yè)面
{
switch(gncdym) //功能菜單頁(yè)面選項(xiàng)變量
{
case 1:if(qingpingsf==0)ClearDisplay();shezhiym=1;qingpingsf=1;break; //進(jìn)入二級(jí)菜單時(shí)鐘設(shè)置頁(yè)面
case 2:if(qingpingsf==0)ClearDisplay();shezhiym=2;qingpingsf=1;break; //進(jìn)入二級(jí)菜單鬧鐘設(shè)置頁(yè)面
case 3:if(qingpingsf==0)ClearDisplay();shezhiym=3;qingpingsf=1;break; //進(jìn)入二級(jí)菜單設(shè)置頁(yè)面
}
}
else if(shezhiym==1) //進(jìn)入二級(jí)菜單時(shí)鐘設(shè)置頁(yè)面
{
shizhongsz++; //時(shí)鐘 秒分時(shí)日月年 設(shè)置選項(xiàng)變量
if(shizhongsz==7)shizhongsz=1;
}
else if(shezhiym==2) //進(jìn)入二級(jí)菜單鬧鐘設(shè)置頁(yè)面
{
naozhongsz++; //鬧鐘1分時(shí)開關(guān) 鬧鐘2分時(shí)開關(guān) 設(shè)置選項(xiàng)變量
if(naozhongsz==7)naozhongsz=1;
}
else //進(jìn)入二級(jí)菜單設(shè)置頁(yè)面
{
shezhixx++; //設(shè)置選項(xiàng)變量
if(shezhixx==8)shezhixx=1;
}
anjian1sf=1; //完成操作按鍵1釋放 等待下一次執(zhí)行
}
}
}
else //短按開關(guān)臺(tái)燈
{
if(xianshiyemian==0) //以下操作在時(shí)鐘頁(yè)面有效
{
if(anjianjsbl>0&&anjianjsbl<15)taidengLED=~taidengLED; //當(dāng)時(shí)間小于約3秒 臺(tái)燈開關(guān)
anjianjsbl=0; //完成操作按鍵計(jì)數(shù)復(fù)位清零
}
if(jdms==1)anjian1LED=1; //松手關(guān)閉按鍵1燈
qingpingsf=0; //完成操作清屏釋放標(biāo)記復(fù)位清零
anjian1sf=0; //完成操作按鍵1釋放標(biāo)記復(fù)位清零
}
/*按鍵2加與按鍵3減按鍵*/
if(anjian2==0||anjian3==0) //判斷按鍵是否按下
{
if(jdms==1)
{
if(anjian2==0)anjian2LED=0; //按鍵燈2單點(diǎn)模式
if(anjian3==0)anjian3LED=0; //按鍵燈3單點(diǎn)模式
}
if(xianshiyemian==0)
{
if(anjian2==0)
{
if(LED_mun<255)LED_mun=LED_mun+5; //臺(tái)燈調(diào)光加
Delay_ms(10); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
}
if(anjian3==0)
{
if(LED_mun>10)LED_mun=LED_mun-5; //臺(tái)燈調(diào)光減
Delay_ms(10); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
}
}
else //以下操作在功能菜單頁(yè)面有效
{
if(shezhiym==0) //功能菜單頁(yè)面
{
if(anjian2_3sf==0) //給與限制條件 每次操作只允許運(yùn)行一次
{
if(anjian2==0)if(gncdym<3)gncdym=gncdym+1;else(gncdym=1); //功能菜單頁(yè)面 功能菜單頁(yè)面選項(xiàng)變量 ++
if(anjian3==0)if(gncdym>1)gncdym=gncdym-1;else(gncdym=3); //功能菜單頁(yè)面 功能菜單頁(yè)面選項(xiàng)變量 --
anjian2_3sf=1; //完成操作按鍵釋放
}
}
else if(shezhiym==1) //時(shí)鐘設(shè)置頁(yè)面
{
switch(shizhongsz)
{
case 1:if(anjian2==0)if(miao<59)miao=miao+1;else(miao=0); //調(diào)整秒+
if(anjian3==0)if(miao>0)miao=miao-1;else(miao=59); //調(diào)整秒-1
Ds3231Init(); //停止時(shí)鐘 調(diào)整時(shí)鐘數(shù)據(jù)寫入ds3231
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 2:if(anjian2==0)if(fen<59)fen=fen+1;else(fen=0); //調(diào)整分+
if(anjian3==0)if(fen>0)fen=fen-1;else(fen=59); //調(diào)整分-1
Ds3231Init(); //停止時(shí)鐘 調(diào)整時(shí)鐘數(shù)據(jù)寫入ds3231
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 3:if(anjian2==0)if(shi<23)shi=shi+1;else(shi=0); //調(diào)整時(shí)+1
if(anjian3==0)if(shi>0)shi=shi-1;else(shi=23); //調(diào)整時(shí)-1
Ds3231Init(); //停止時(shí)鐘 調(diào)整時(shí)鐘數(shù)據(jù)寫入ds3231
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 4:if(yue==2)
{
if(nian_r==0) //閏年
{
/*...如果是閏年2月只有29天.....*/
if(anjian2==0)if(ri<29)ri=ri+1;else(ri=1); //調(diào)整日+1
if(anjian3==0)if(ri>1)ri=ri-1;else(ri=29); //調(diào)整日-1
}
else //平年
{
/*....如果是平年2月只有28天.....*/
if(anjian2==0)if(ri<28)ri=ri+1;else(ri=1); //調(diào)整日+1
if(anjian3==0)if(ri>1)ri=ri-1;else(ri=28); //調(diào)整日-1
}
}
else
{
if(yue_dx==0) //大月
{
/*1,3,5,7,8,10,12月有31天 為大月*/
if(anjian2==0)if(ri<31)ri=ri+1;else(ri=1); //調(diào)整日+1
if(anjian3==0)if(ri>1)ri=ri-1;else(ri=31); //調(diào)整日-1
}
else //小月
{ /*4,6,9,11月只有30天 為小月*/
if(anjian2==0)if(ri<30)ri=ri+1;else(ri=1); //調(diào)整日+1
if(anjian3==0)if(ri>1)ri=ri-1;else(ri=30); //調(diào)整日-1
}
}
rilijs(); //日歷自動(dòng)計(jì)算函數(shù)
Ds3231Init(); //停止時(shí)鐘 調(diào)整時(shí)鐘數(shù)據(jù)寫入ds3231
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 5:if(anjian2==0)if(yue<12)yue=yue+1;else(yue=1); //調(diào)整月+1
if(anjian3==0)if(yue>1)yue=yue-1;else(yue=12); //調(diào)整月-1
rilijs(); //日歷自動(dòng)計(jì)算函數(shù)
Ds3231Init(); //停止時(shí)鐘 調(diào)整時(shí)鐘數(shù)據(jù)寫入ds3231
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 6:if(anjian2==0)if(nian<99)nian=nian+1;else(nian=0); //調(diào)整年+1
if(anjian3==0)if(nian>0)nian=nian-1;else(nian=99); //調(diào)整年-1
rilijs(); //日歷自動(dòng)計(jì)算函數(shù)
Ds3231Init(); //停止時(shí)鐘 調(diào)整時(shí)鐘數(shù)據(jù)寫入ds3231
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
}
}
else if(shezhiym==2) //鬧鐘設(shè)置頁(yè)面
{
switch(naozhongsz)
{
case 1:if(anjian2==0)nz1_kg=1; //調(diào)整鬧鐘1開
if(anjian3==0)nz1_kg=0; //調(diào)整鬧鐘1關(guān)
break;
case 2:if(anjian2==0)if(nz1_fen<59)nz1_fen=nz1_fen+1;else(nz1_fen=0); //調(diào)整鬧鐘1分+
if(anjian3==0)if(nz1_fen>0)nz1_fen=nz1_fen-1;else(nz1_fen=59); //調(diào)整鬧鐘1分-
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 3:if(anjian2==0)if(nz1_shi<23)nz1_shi=nz1_shi+1;else(nz1_shi=0); //調(diào)整鬧鐘1時(shí)+
if(anjian3==0)if(nz1_shi>0)nz1_shi=nz1_shi-1;else(nz1_shi=23); //調(diào)整鬧鐘1時(shí)-
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 4:if(anjian2==0)nz2_kg=1; //調(diào)整鬧鐘2開
if(anjian3==0)nz2_kg=0; //調(diào)整鬧鐘2關(guān)
break;
case 5:if(anjian2==0)if(nz2_fen<59)nz2_fen=nz2_fen+1;else(nz2_fen=0); //調(diào)整鬧鐘2分+
if(anjian3==0)if(nz2_fen>0)nz2_fen=nz2_fen-1;else(nz2_fen=59); //調(diào)整鬧鐘2分-
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 6:if(anjian2==0)if(nz2_shi<23)nz2_shi=nz2_shi+1;else(nz2_shi=0); //調(diào)整鬧鐘2時(shí)+
if(anjian3==0)if(nz2_shi>0)nz2_shi=nz2_shi-1;else(nz2_shi=23); //調(diào)整鬧鐘2時(shí)-
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
}
}
else //設(shè)置選項(xiàng)頁(yè)面
{
switch(shezhixx)
{
/*時(shí)鐘字體設(shè)置*/
case 1:if(anjian2==0)
{
if(anjian2_3sf==0) //給與限制條件 每次操作只允許運(yùn)行一次
{
if(shizhongzt<2)shizhongzt=shizhongzt+1;else(shizhongzt=0); //時(shí)鐘字體選項(xiàng)+
anjian2_3sf=1; //完成操作按鍵釋放
}
}
if(anjian3==0)
{
if(anjian2_3sf==0) //給與限制條件 每次操作只允許運(yùn)行一次
{
if(shizhongzt>0)shizhongzt=shizhongzt-1;else(shizhongzt=2); //時(shí)鐘字體選項(xiàng)-
anjian2_3sf=1; //完成操作按鍵釋放
}
}
break;
/*鍵燈模式設(shè)置*/
case 2:if(anjian2==0)jdms=1; //單點(diǎn)模式
if(anjian3==0)jdms=0; //全亮模式
break;
/*背光時(shí)長(zhǎng)設(shè)置*/
case 3:if(anjian2==0)
{
if(anjian2_3sf==0) //給與限制條件 每次操作只允許運(yùn)行一次
{
if(bgsc<5)bgsc=bgsc+1;else(bgsc=0); //時(shí)鐘字體選項(xiàng)+
anjian2_3sf=1; //完成操作按鍵釋放
}
}
if(anjian3==0)
{
if(anjian2_3sf==0) //給與限制條件 每次操作只允許運(yùn)行一次
{
if(bgsc>0)bgsc=bgsc-1;else(bgsc=5); //時(shí)鐘字體選項(xiàng)-
anjian2_3sf=1; //完成操作按鍵釋放
}
}
break;
/*按鍵聲音設(shè)置*/
case 4:if(anjian2==0)anjiansy_kg=1; //按鍵聲音開
if(anjian3==0)anjiansy_kg=0; //按鍵聲音關(guān)
break;
/*整點(diǎn)報(bào)時(shí)聲音設(shè)置*/
/*允許時(shí)間 起點(diǎn)6-11可調(diào) 止點(diǎn)18-23可調(diào)*/
case 5:if(anjian2==0)zdbs_kg=1; //整點(diǎn)報(bào)時(shí)開
if(anjian3==0)zdbs_kg=0; //整點(diǎn)報(bào)時(shí)關(guān)
break;
case 6:if(anjian2==0)if(zdbs_qd<11)zdbs_qd=zdbs_qd+1; //調(diào)整整點(diǎn)報(bào)時(shí)起點(diǎn)+
if(anjian3==0)if(zdbs_qd>6)zdbs_qd=zdbs_qd-1;//調(diào)整整點(diǎn)報(bào)時(shí)起點(diǎn)-
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
case 7:if(anjian2==0)if(zdbs_zd<23)zdbs_zd=zdbs_zd+1; //調(diào)整整點(diǎn)報(bào)時(shí)止點(diǎn)+
if(anjian3==0)if(zdbs_zd>18)zdbs_zd=zdbs_zd-1;//調(diào)整整點(diǎn)報(bào)時(shí)止點(diǎn)-
Delay_ms(200); //延時(shí)一段時(shí)間 如果還沒松開 繼續(xù)加減
break;
}
}
}
}
else
{
if(jdms==1)
{
anjian2LED=1; //松手關(guān)閉按鍵2燈
anjian3LED=1; //松手關(guān)閉按鍵3燈
}
anjian2_3sf=0; //完成操作按鍵2與按鍵3釋放標(biāo)記復(fù)位清零 等待下一次執(zhí)行
}
/*按鍵4返回與關(guān)閉響鈴按鍵*/
if(anjian4==0) //判斷按鍵是否按下
{
if(jdms==1)anjian4LED=0; //按鍵燈4單點(diǎn)模式
if(anjian4sf==0) //給與限制條件 每次操作只允許運(yùn)行一次
{
if(xianshiyemian==0) //在時(shí)鐘頁(yè)面中操作
{
if(nz1_xl==1||nz2_xl==1) //鬧鐘1或者2正在響鈴時(shí)
{
nz1_xl=0; //按下關(guān)閉鬧鐘1響鈴
nz2_xl=0; //按下關(guān)閉鬧鐘2響鈴
}
}
else //在功能菜單頁(yè)面中操作
{
if(shezhiym==0) //返回時(shí)鐘頁(yè)面處理
{
/*返回時(shí)鐘頁(yè)面前操作*/
fb_shizwz=0; //時(shí)鐘文字取消反白
fb_nzwz=0; //鬧鐘文字取消反白
fb_szwz=0; //設(shè)置文字取消反白
gncdym=0; //功能菜單頁(yè)面選項(xiàng)變量復(fù)位清零
ClearDisplay(); //LCD清屏
/*完成操作*/
xianshiyemian=0; //返回時(shí)鐘頁(yè)面
}
else //返回功能菜單頁(yè)面處理
{
/*返回功能菜單頁(yè)面前操作*/
if(shezhiym==1&&shizhongsz!=0)shizhongsz=0; //在退出時(shí)鐘設(shè)置選項(xiàng)變量復(fù)位清零
if((shezhiym==2&&naozhongsz!=0)||(shezhiym==3&&shezhixx!=0)) //在退出鬧鐘設(shè)置與設(shè)置選項(xiàng)頁(yè)面前 把設(shè)置好的數(shù)據(jù)保存到EEPROM1扇區(qū)
{
IapEraseSector(EEPROM_0); //EEPROM_1扇區(qū)擦除 地址0x0000-0x01ff
IapProgramByte(EEPROM_0,nz1_kg); //存儲(chǔ)鬧鐘1開關(guān)狀態(tài)到EEPROM_0 地址0x0000
IapProgramByte(EEPROM_1,nz1_fen); //存儲(chǔ)鬧鐘1分到EEPROM_1 地址0x0001
IapProgramByte(EEPROM_2,nz1_shi); //存儲(chǔ)鬧鐘1時(shí)到EEPROM_2 地址0x0002
IapProgramByte(EEPROM_3,nz2_kg); //存儲(chǔ)鬧鐘2開關(guān)狀態(tài)到EEPROM_3 地址0x0003
IapProgramByte(EEPROM_4,nz2_fen); //存儲(chǔ)鬧鐘2分到EEPROM_4 地址0x0004
IapProgramByte(EEPROM_5,nz2_shi); //存儲(chǔ)鬧鐘2時(shí)到EEPROM_5 地址0x0005
IapProgramByte(EEPROM_6,shizhongzt); //存儲(chǔ)時(shí)鐘字體到EEPROM_6 地址0x0006
IapProgramByte(EEPROM_7,jdms); //存儲(chǔ)鍵燈模式到EEPROM_7 地址0x0007
IapProgramByte(EEPROM_8,bgsc); //存儲(chǔ)背光時(shí)長(zhǎng)到EEPROM_8 地址0x0008
IapProgramByte(EEPROM_9,anjiansy_kg); //存儲(chǔ)按鍵聲音到EEPROM_9 地址0x0009
IapProgramByte(EEPROM_0a,zdbs_kg); //存儲(chǔ)整點(diǎn)報(bào)時(shí)開關(guān)到EEPROM_0a 地址0x000a
IapProgramByte(EEPROM_0b,zdbs_qd); //存儲(chǔ)整點(diǎn)報(bào)時(shí)起點(diǎn)到EEPROM_0b 地址0x000b
IapProgramByte(EEPROM_0c,zdbs_zd); //存儲(chǔ)整點(diǎn)報(bào)時(shí)止點(diǎn)到EEPROM_0c 地址0x000c
naozhongsz=0; //鬧鐘設(shè)置選項(xiàng)變量復(fù)位清零
shezhixx=0; //設(shè)置選項(xiàng)變量復(fù)位清零
}
ClearDisplay(); //LCD清屏
/*完成操作*/
shezhiym=0; //返回功能菜單頁(yè)面
}
}
anjian4sf=1; //完成操作按鍵4釋放
}
}
else
{
anjian4sf=0; //完成操作按鍵4釋放標(biāo)記復(fù)位清零 等待下一次執(zhí)行
if(jdms==1)anjian4LED=1;
}
}
/*EEPROM讀出初始化*/
void EEPROM_AInit()
{
/*方式一*/
/*從未擦寫個(gè)的EEPROM數(shù)據(jù)是空白的 讀出也是錯(cuò)誤的!*/
/*需要判斷EEPROM==0xff數(shù)據(jù)空白 如果數(shù)據(jù)是空白跳過EEPROM讀出*/
if(IapReadByte(EEPROM_0)!=0xff)nz1_kg=IapReadByte(EEPROM_0); //讀出EEPROM_0 鬧鐘1開關(guān)狀態(tài) 地址0x0000
if(IapReadByte(EEPROM_1)!=0xff)nz1_fen=IapReadByte(EEPROM_1); //讀出EEPROM_1 鬧鐘1分?jǐn)?shù)據(jù) 地址0x0001
if(IapReadByte(EEPROM_2)!=0xff)nz1_shi=IapReadByte(EEPROM_2); //讀出EEPROM_2 鬧鐘1時(shí)數(shù)據(jù) 地址0x0002
if(IapReadByte(EEPROM_3)!=0xff)nz2_kg=IapReadByte(EEPROM_3); //讀出EEPROM_3 鬧鐘2開關(guān)狀態(tài) 地址0x0003
if(IapReadByte(EEPROM_4)!=0xff)nz2_fen=IapReadByte(EEPROM_4); //讀出EEPROM_4 鬧鐘2分?jǐn)?shù)據(jù) 地址0x0004
if(IapReadByte(EEPROM_5)!=0xff)nz2_shi=IapReadByte(EEPROM_5); //讀出EEPROM_5 鬧鐘1時(shí)數(shù)據(jù) 地址0x0005
/*方式二*/
/*從未擦寫個(gè)的EEPROM數(shù)據(jù)是空白 需要變量重新初始化 也可以做為出廠默認(rèn)*/
/*用戶自行設(shè)置后出廠默認(rèn)會(huì)直接跳過*/
shizhongzt=IapReadByte(EEPROM_6); //讀出EEPROM_6 時(shí)鐘字體狀態(tài) 地址0x0006
if(IapReadByte(EEPROM_6)==0xff)shizhongzt=1; //判斷時(shí)鐘字體數(shù)據(jù)是否空白 如果空白重新初始化 默認(rèn)數(shù)碼字體 否則數(shù)據(jù)不是空白直接跳過
jdms=IapReadByte(EEPROM_7); //讀出EEPROM_7 鍵燈模式狀態(tài) 地址0x0007
if(IapReadByte(EEPROM_7)==0xff)jdms=0; //判斷鍵燈模式數(shù)據(jù)是否空白 如果空白重新初始化 默認(rèn)全亮 否則數(shù)據(jù)不是空白直接跳過
bgsc=IapReadByte(EEPROM_8); //讀出EEPROM_8 背光時(shí)長(zhǎng)狀態(tài) 地址0x0008
if(IapReadByte(EEPROM_8)==0xff)bgsc=2; //判斷背光時(shí)長(zhǎng)數(shù)據(jù)是否空白 如果空白重新初始化 默認(rèn)30秒 否則數(shù)據(jù)不是空白直接跳過
anjiansy_kg=IapReadByte(EEPROM_9); //讀出EEPROM_9 按鍵聲音開關(guān)狀態(tài) 地址0x0009
if(IapReadByte(EEPROM_9)==0xff)anjiansy_kg=1; //判斷按鍵聲音數(shù)據(jù)是否空白 如果空白重新初始化 默認(rèn)開 否則數(shù)據(jù)不是空白直接跳過
zdbs_kg=IapReadByte(EEPROM_0a); //讀出EEPROM_0a 整點(diǎn)報(bào)時(shí)開關(guān)狀態(tài) 地址0x000a
if(IapReadByte(EEPROM_0a)==0xff)zdbs_kg=1; //判斷整點(diǎn)報(bào)時(shí)開關(guān)數(shù)據(jù)是否空白 如果空白重新初始化 默認(rèn)開 否則數(shù)據(jù)不是空白直接跳過
zdbs_qd=IapReadByte(EEPROM_0b); //讀出EEPROM_0b 整點(diǎn)報(bào)時(shí)開關(guān)狀態(tài) 地址0x000b
if(IapReadByte(EEPROM_0b)==0xff)zdbs_qd=8; //判斷整點(diǎn)報(bào)時(shí)起點(diǎn)數(shù)據(jù)是否空白 如果空白重新初始化 默認(rèn)起點(diǎn)8時(shí) 否則數(shù)據(jù)不是空白直接跳過
zdbs_zd=IapReadByte(EEPROM_0c); //讀出EEPROM_0c 整點(diǎn)報(bào)時(shí)開關(guān)狀態(tài) 地址0x000c
if(IapReadByte(EEPROM_0c)==0xff)zdbs_zd=21; //判斷整點(diǎn)報(bào)時(shí)止點(diǎn)數(shù)據(jù)是否空白 如果空白重新初始化 默認(rèn)止點(diǎn)21時(shí) 否則數(shù)據(jù)不是空白直接跳過
}
/*背光時(shí)長(zhǎng) 作為開機(jī)設(shè)置*/
void beiguangsc()
{
switch(bgsc)
{
case 0:miaomun=10;break; //10秒設(shè)置
case 1:miaomun=20;break; //20秒設(shè)置
case 2:miaomun=30;break; //30秒設(shè)置
case 3:miaomun=60;break; //1分鐘設(shè)置
case 4:miaomun=120;break; //2分鐘設(shè)置
case 5:miaomun=180;break; //3分鐘設(shè)置
}
}
/*背光控制*/
void beiguangkz()
{
if(taidengLED==1||anjian1==0||anjian2==0||anjian3==0||anjian4==0||nz1_xl==1||nz2_xl==1) //背光跟隨臺(tái)燈 如果臺(tái)燈開著 那么背光就一直亮 與任意鍵開屏背光
{
beiguangLED=0; //開背光
TR0=0; //關(guān)閉定時(shí)器0
pingbgjs=0; //定時(shí)計(jì)數(shù)清零
miaojs=0; //定時(shí)計(jì)數(shù)清零
}
else //否則臺(tái)燈關(guān)閉下或者沒有按鍵操作下
{
if(beiguangLED==0)TR0=1; // 打開定時(shí)器0 開始定時(shí)器計(jì)時(shí)
else //時(shí)間到了 背光關(guān)閉后
{
TR0=0; //關(guān)閉定時(shí)器0
pingbgjs=0; //定時(shí)計(jì)數(shù)清零
miaojs=0; //定時(shí)計(jì)數(shù)清零
}
}
}
/*鍵燈全亮模式 .....單點(diǎn)模式放在按鍵里操作*/
void jiandengmoshi()
{
if(beiguangLED==0) //鍵燈跟隨背光 背光開鍵燈亮 背光關(guān)鍵燈滅
{
if(jdms==0) //如果是全亮模式
{
anjian1LED=0; //按鍵燈1亮
anjian2LED=0; //按鍵燈2亮
anjian3LED=0; //按鍵燈3亮
anjian4LED=0; //按鍵燈4亮
}
}
else //如果背光關(guān)了 按鍵燈也跟著關(guān)閉
{
anjian1LED=1; //按鍵燈1滅
anjian2LED=1; //按鍵燈2滅
anjian3LED=1; //按鍵燈3滅
anjian4LED=1; //按鍵燈4滅
}
}
/*DS3231時(shí)鐘初始化*/
void DS3231_szcqh()
{
uint niana;
Ds3231ReadTime(); //讀取ds3231時(shí)間數(shù)據(jù)
niana=nian+2000;
if(niana<2020||yue==0||ri==0) //若讀取的月日數(shù)據(jù)都為0則執(zhí)行以下程序 否則直接跳過此程序
{
nian=22; //初始化年 22年
yue=01; //初始化月 1月
ri=01; //初始化日 1日
zhou=06; //初始化周 周6
shi=12; //初始化時(shí) 12時(shí)
fen=00; //初始化分 00分
miao=00; //初始化秒 00秒
rilijs(); //日歷自動(dòng)計(jì)算函數(shù)
Ds3231Init(); //把初始化好后的時(shí)間數(shù)據(jù)寫入Ds3231時(shí)鐘芯片
}
}
/*鬧鐘對(duì)比*/
void naozhong()
{
if(nz1_kg==1||nz2_kg==1)
{
/*鬧鐘開關(guān)圖標(biāo)顯示*/
if(nz1_kg==1&&nz2_kg==0)Disp_16x16(8,0,0,ZM5_16x16[5]); //如果鬧鐘1打開 顯示鬧鐘1圖標(biāo)
else if(nz1_kg==0&&nz2_kg==1)Disp_16x16(8,0,0,ZM5_16x16[6]); //如果鬧鐘2打開 顯示鬧鐘2圖標(biāo)
else if(nz1_kg==1&&nz2_kg==1)Disp_16x16(8,0,0,ZM5_16x16[7]); //如果鬧鐘1 鬧鐘2都打開 顯示鬧鐘1/2圖標(biāo)
else Disp_16x16(8,0,0,ZM5_16x16[0]); //否則如果鬧鐘1或鬧鐘2關(guān)閉 取消顯示鬧鐘圖標(biāo)
/*鬧鐘1對(duì)比*/
if(nz1_kg==1) //如果鬧鐘1打開 開始鬧鐘對(duì)比
{
if(shi==nz1_shi&&fen==nz1_fen&&miao==0)
{
nz1_fen_Stop=nz1_fen+30; //限制約束響鈴時(shí)間條件變量 若不手動(dòng)關(guān)閉響鈴 30分后自動(dòng)關(guān)閉響鈴
nz1_xl=1; //時(shí)間到鬧鐘1響鈴
}
if(nz1_xl==1,shi==nz1_shi&&fen==nz1_fen_Stop)nz1_xl=0; //限制約束響鈴時(shí)間到關(guān)閉響鈴 最多只允許響鈴30分鐘
}
/*鬧鐘2對(duì)比*/
if(nz2_kg==1) //如果鬧鐘1打開 開始鬧鐘對(duì)比
{
if(shi==nz2_shi&&fen==nz2_fen&&miao==0)
{
nz2_fen_Stop=nz2_fen+30; //限制約束響鈴時(shí)間條件變量 若不手動(dòng)關(guān)閉響鈴 30分后自動(dòng)關(guān)閉響鈴
nz2_xl=1; //時(shí)間到鬧鐘2響鈴
}
if(nz2_xl==1,shi==nz2_shi&&fen==nz2_fen_Stop)nz2_xl=0; //限制約束響鈴時(shí)間到關(guān)閉響鈴 最多只允許響鈴30分鐘
}
}
}
/*整點(diǎn)報(bào)時(shí)*/
/*允許時(shí)間 起點(diǎn)6-11可調(diào) 止點(diǎn)18-23可調(diào)*/
/*在允許時(shí)間報(bào)時(shí) 否則不報(bào)時(shí)*/
/*例如:設(shè)置允許時(shí)間為8-21 可允許8時(shí)到21時(shí)內(nèi)報(bào)時(shí) */
void zhengdianbaoshi()
{
if(zdbs_kg==1) //判斷整點(diǎn)報(bào)時(shí)是否打開
{
if(shi>=zdbs_qd&&shi<=zdbs_zd) //判斷報(bào)時(shí)時(shí)間是否在許可范圍
{
if(fen==0&&miao==0) //如果時(shí)間=00分 =00秒 開啟報(bào)時(shí)
{
if(nz1_xl!=1||nz2_xl!=1)zdbs=1; //鬧鐘響時(shí)不允許報(bào)時(shí)
}
else(zdbs=0);
}
}
}
/*蜂鳴器協(xié)調(diào) 采用定時(shí)器1控制蜂鳴器響應(yīng)時(shí)間與次數(shù) 包括鬧鐘鬧鐘鈴響 整點(diǎn)報(bào)時(shí)聲音 按鍵聲音*/
void fmqxt()
{
/*鬧鐘1與鬧鐘2蜂鳴器響鈴程序 滴滴滴~ 3聲*/
if(zdbs==1||nz1_xl==1||nz2_xl==1||anjiansy_kg==1&&(anjian1==0||anjian2==0||anjian3==0||anjian4==0))
{
if(zdbs==1)fmq=0; //報(bào)時(shí)響聲時(shí)長(zhǎng)1秒 不需要定時(shí)器計(jì)數(shù)
TR1=1; //開定時(shí)器1
}
else
{
fmq=1; //關(guān)閉響鈴后 蜂鳴器停止響應(yīng)
TR1=0; //關(guān)定時(shí)器1
naozhonglx=0;
anjians=0;
}
}
/**********************************
*函數(shù)名稱:PCA_Init(void)
*輸入 :無
*輸出 :無
*調(diào)用說明:外部調(diào)用
*函數(shù)說明:PWM模塊初始化
***********************************/
void PCA_Init()
{
CCON = 0; //PCA初始化
CMOD = 0x00; //空閑時(shí)不計(jì)數(shù),不產(chǎn)生中斷,時(shí)鐘源為Sysclk/12,PWM頻率大約為4KHz
CL = 0x00; //PCA低8位清零
CH = 0x00; //PCA高8位清零
CCAPM0 = 0x42; //8位PWM模式,無中斷
//CCAP0H = 0; //PWM0占空比(調(diào)節(jié)此處值調(diào)節(jié)PWM占空比 0~255)
//CCAP0L = 0; //PWM0占空比(調(diào)節(jié)此處值調(diào)節(jié)PWM占空比0~255)
CR = 1; //啟動(dòng)PCA計(jì)數(shù)器
}
/*臺(tái)燈控制程序*/
void taidengkz()
{
if(taidengLED==1) //開臺(tái)燈
{
CCAP0H=LED_mun; //LED_mun變量 10——255 范圍可調(diào)
CCAP0L=LED_mun;
if(xianshiyemian==0)
{
Disp_8x16(11,0,0,ZM_8x16[LED_mun%1000/100]);
Disp_8x16(12,0,0,ZM_8x16[LED_mun%100/10]);
Disp_8x16(13,0,0,ZM_8x16[LED_mun%10]);
Disp_16x16(7,0,0,ZM5_16x16[4]); //如果臺(tái)燈打開顯示臺(tái)燈圖標(biāo)
}
}
else //關(guān)臺(tái)燈
{
CCAP0H=0; //當(dāng)CCAP0H=0時(shí) 已經(jīng)關(guān)閉了
CCAP0L=0;
if(xianshiyemian==0)
{
Disp_8x16(11,0,0,ZM_8x16[15]);
Disp_8x16(12,0,0,ZM_8x16[15]);
Disp_8x16(13,0,0,ZM_8x16[15]);
Disp_16x16(7,0,0,ZM5_16x16[0]); //否則如果臺(tái)燈關(guān)閉不顯示臺(tái)燈圖標(biāo)
}
}
}
/*主函數(shù)*/
void main()
{
TMOD=0x11; //定時(shí)器0與定時(shí)器1打開
TH0=0x0D1;
TL0=0x20; //給定時(shí)器0賦初值,定時(shí)1ms
TH1=0x0D1;
TL1=0x20; //給定時(shí)器1賦初值,定時(shí)1ms
ET0=1; //打開定時(shí)器0中斷允許
TR0=1; //打開定時(shí)器0
ET1=1; //打開定時(shí)器1中斷允許
//TR1=1; //打開定時(shí)器1
EA=1; //打開總中斷
PCA_Init(); //PCA PWM初始化
LED_mun=255; //默認(rèn)臺(tái)燈最亮
DS3231_szcqh(); //DS3231時(shí)鐘初始化
beiguangLED=0; //剛通電屏背光開
EEPROM_AInit(); //EEPROM讀出初始化
beiguangsc(); //開機(jī)讀出背光時(shí)長(zhǎng)
LCD_AInit(); //LCD屏初始化
ClearDisplay(); //LCD清屏
while(1)
{
fmqxt(); //運(yùn)行蜂鳴器協(xié)調(diào)程序
anjiangn(); //運(yùn)行按鍵功能程序
beiguangkz(); //運(yùn)行背光控制程序
jiandengmoshi(); //運(yùn)行鍵燈全亮模式程序
zhengdianbaoshi(); //運(yùn)行整點(diǎn)報(bào)時(shí)程序
taidengkz(); //運(yùn)行臺(tái)燈控制程序
if(xianshiyemian==0) //xianshiyemian=0時(shí)鐘頁(yè)面
{
Ds3231ReadTime(); //不在時(shí)鐘設(shè)置下運(yùn)行時(shí)鐘數(shù)據(jù)
naozhong(); //運(yùn)行鬧鐘對(duì)比 只允許在時(shí)間頁(yè)面運(yùn)行
/*年月日顯示*/
Disp_8x16(0,0,0,ZM_8x16[2]); //
Disp_8x16(1,0,0,ZM_8x16[0]); //
Disp_8x16(2,0,0,ZM_8x16[nian/10]); //
Disp_8x16(3,0,0,ZM_8x16[nian%10]); //年
Disp_8x16(4,0,0,ZM_8x16[10]); //-
Disp_8x16(5,0,0,ZM_8x16[yue/10]); //
Disp_8x16(6,0,0,ZM_8x16[yue%10]); //月
Disp_8x16(7,0,0,ZM_8x16[10]); //-
Disp_8x16(8,0,0,ZM_8x16[ri/10]); //
Disp_8x16(9,0,0,ZM_8x16[ri%10]); //日
/*時(shí)分秒顯示*/
switch(shizhongzt) //時(shí)鐘字體選擇
{
case 0:Disp_16x32(0,8,0,ZM_16x32[shi/10]); // 宋體
Disp_16x32(1,8,0,ZM_16x32[shi%10]); //時(shí)
Disp_16x32(2,8,0,ZM_16x32[10]); //:
Disp_16x32(3,8,0,ZM_16x32[fen/10]); //
Disp_16x32(4,8,0,ZM_16x32[fen%10]); //分
Disp_16x32(5,8,0,ZM_16x32[10]); //:
Disp_16x32(6,8,0,ZM_16x32[miao/10]); //
Disp_16x32(7,8,0,ZM_16x32[miao%10]); //秒*/
break;
case 1:Disp_16x32(0,8,0,ZM1_16x32[shi/10]); // 數(shù)碼
Disp_16x32(1,8,0,ZM1_16x32[shi%10]); //時(shí)
Disp_16x32(2,8,0,ZM1_16x32[10]); //:
Disp_16x32(3,8,0,ZM1_16x32[fen/10]); //
Disp_16x32(4,8,0,ZM1_16x32[fen%10]); //分
Disp_16x32(5,8,0,ZM1_16x32[10]); //:
Disp_16x32(6,8,0,ZM1_16x32[miao/10]); //
Disp_16x32(7,8,0,ZM1_16x32[miao%10]); //秒*/
break;
case 2:Disp_16x32(0,8,0,ZM2_16x32[shi/10]); // 創(chuàng)意
Disp_16x32(1,8,0,ZM2_16x32[shi%10]); //時(shí)
Disp_16x32(2,8,0,ZM2_16x32[10]); //:
Disp_16x32(3,8,0,ZM2_16x32[fen/10]); //
Disp_16x32(4,8,0,ZM2_16x32[fen%10]); //分
Disp_16x32(5,8,0,ZM2_16x32[10]); //:
Disp_16x32(6,8,0,ZM2_16x32[miao/10]); //
Disp_16x32(7,8,0,ZM2_16x32[miao%10]); //秒*/
break;
}
/*星期顯示*/
Disp_16x16(5,3,0,ZM_16x16[18]); //星
Disp_16x16(6,3,0,ZM_16x16[19]); //期
switch(zhou)
{
case 1:Disp_16x16(7,3,0,ZM_16x16[1]);break; //星期一
case 2:Disp_16x16(7,3,0,ZM_16x16[2]);break; //星期二
case 3:Disp_16x16(7,3,0,ZM_16x16[3]);break; //星期三
case 4:Disp_16x16(7,3,0,ZM_16x16[4]);break; //星期四
case 5:Disp_16x16(7,3,0,ZM_16x16[5]);break; //星期五
case 6:Disp_16x16(7,3,0,ZM_16x16[6]);break; //星期六
case 7:Disp_16x16(7,3,0,ZM_16x16[17]);break; //星期天
}
nonglixs();//顯示農(nóng)歷
pingrunjs(); //閏年平年計(jì)算
gljr(); //公歷節(jié)日計(jì)算
nonglijrjs(); //農(nóng)歷節(jié)日計(jì)算
jiqijs(); //節(jié)氣計(jì)算
if(gljrjs!=0&&nljs==0&&jieqijs==0) //如果當(dāng)天只有公歷節(jié)日 輪番顯示生肖公歷節(jié)日顯示
{
if(miao>=0&&miao<30)shengxiaoxs(); //顯示生肖及閏平年
if(miao>=30&&miao<=59)gljxs(); //公歷節(jié)日顯示
}
else if(gljrjs==0&&nljs!=0&&jieqijs==0) //如果當(dāng)天只有農(nóng)歷節(jié)日 輪番顯示生肖農(nóng)歷節(jié)日
{
if(miao>=0&&miao<30)shengxiaoxs(); //顯示生肖及閏平年
if(miao>=30&&miao<=59)nonglijrxs(); //顯示農(nóng)歷節(jié)日
}
else if(gljrjs==0&&nljs==0&&jieqijs!=0) //如果當(dāng)天只有節(jié)氣 輪番顯示生肖節(jié)氣
{
if(miao>=0&&miao<30)shengxiaoxs(); //顯示生肖及閏平年
if(miao>=30&&miao<=59)jieqixs(); //顯示節(jié)氣
}
else if(gljrjs!=0&&nljs!=0&&jieqijs==0) //如果當(dāng)天同時(shí)有公歷節(jié)日和農(nóng)歷節(jié)日 輪番顯示生肖公歷節(jié)日農(nóng)歷節(jié)日
{
if(miao>=0&&miao<20)shengxiaoxs(); //顯示生肖及閏平年
if(miao>=20&&miao<40)gljxs(); //顯示公歷節(jié)日
if(miao>=40&&miao<=59)nonglijrxs(); //顯示農(nóng)歷節(jié)日
}
else if(gljrjs!=0&&nljs==0&&jieqijs!=0) //如果當(dāng)天同時(shí)有公歷節(jié)日和節(jié)氣 輪番顯示生肖公歷節(jié)日節(jié)氣
{
if(miao>=0&&miao<20)shengxiaoxs(); //顯示生肖及閏平年
if(miao>=20&&miao<40)gljxs(); //顯示公歷節(jié)日
if(miao>=40&&miao<=59)jieqixs(); //顯示節(jié)氣
}
else if(gljrjs==0&&nljs!=0&&jieqijs!=0) //如果當(dāng)天同時(shí)有農(nóng)歷節(jié)日和節(jié)氣 輪番顯示生肖農(nóng)歷節(jié)日節(jié)氣
{
if(miao>=0&&miao<20)shengxiaoxs(); //顯示生肖及閏平年
if(miao>=20&&miao<40)nonglijrxs(); //顯示農(nóng)歷節(jié)日
if(miao>=40&&miao<=59)jieqixs(); //顯示節(jié)氣
}
else if(jieqijs!=0&&nljs!=0&&gljrjs!=0) //如果當(dāng)天同時(shí)有公歷節(jié)日農(nóng)歷節(jié)日生肖 輪番顯示生肖公歷節(jié)日農(nóng)歷節(jié)日節(jié)氣
{
if(miao>=0&&miao<15)shengxiaoxs(); //顯示生肖及閏平年
if(miao>=15&&miao<30)gljxs(); //公歷節(jié)日顯示
if(miao>=30&&miao<45)nonglijrxs(); //農(nóng)歷節(jié)日顯示
if(miao>=45&&miao<=59)jieqixs(); //顯示節(jié)氣
}
else shengxiaoxs(); //如果沒有其他節(jié)日只顯示生肖及閏平年
/*溫濕度顯示*/
DHT11_receive(); //讀取濕度溫度函數(shù)
Disp_8x16(18,1,0,ZM_8x16[11]);
Disp_8x16(20,1,0,ZM_8x16[RH/10]); //濕度
Disp_8x16(21,1,0,ZM_8x16[RH%10]);
Disp_8x16(22,1,0,ZM_8x16[12]);
Disp_8x16(18,2,0,ZM_8x16[13]);
Disp_8x16(20,2,0,ZM_8x16[TH/10]); //溫度
Disp_8x16(21,2,0,ZM_8x16[TH%10]);
Disp_8x16(22,2,0,ZM_8x16[14]);
if(nz1_xl==0&&nz2_xl==0) //如果沒有鬧鐘鈴響 顯示小動(dòng)物
{
if(miao>=0&&miao<5)
{
Disp_16x16(9,0,0,ZM5_16x16[1]);
Disp_16x16(10,0,0,ZM5_16x16[0]);
Disp_16x16(11,0,0,ZM5_16x16[0]);
}
else if(miao>=5&&miao<10)
{
Disp_16x16(9,0,0,ZM5_16x16[0]);
Disp_16x16(10,0,0,ZM5_16x16[2]);
Disp_16x16(11,0,0,ZM5_16x16[0]);
}
else if(miao>=10&&miao<15)
{
Disp_16x16(9,0,0,ZM5_16x16[0]);
Disp_16x16(10,0,0,ZM5_16x16[0]);
Disp_16x16(11,0,0,ZM5_16x16[3]);
}
else if(miao>=15&&miao<20)
{
Disp_16x16(9,0,0,ZM5_16x16[0]);
Disp_16x16(10,0,0,ZM5_16x16[0]);
Disp_16x16(11,0,0,ZM5_16x16[0]);
}
else
{
Disp_16x16(9,0,0,ZM5_16x16[1]);
Disp_16x16(10,0,0,ZM5_16x16[2]);
Disp_16x16(11,0,0,ZM5_16x16[3]);
}
}
else //有鬧鐘鈴響 則顯示當(dāng)前鬧鐘
{
if(nz1_xl==1)
{
Disp_8x16(18,0,0,ZM1_8x16[nz1_shi/10]); //
Disp_8x16(19,0,0,ZM1_8x16[nz1_shi%10]); //鬧鐘1時(shí)
Disp_8x16(20,0,0,ZM1_8x16[11]); //:
Disp_8x16(21,0,0,ZM1_8x16[nz1_fen/10]); //
Disp_8x16(22,0,0,ZM1_8x16[nz1_fen%10]); //鬧鐘1分
Disp_8x16(23,0,0,ZM1_8x16[12]);
}
if(nz2_xl==1)
{
Disp_8x16(18,0,0,ZM1_8x16[nz2_shi/10]); //
Disp_8x16(19,0,0,ZM1_8x16[nz2_shi%10]); //鬧鐘2時(shí)
Disp_8x16(20,0,0,ZM1_8x16[11]); //:
Disp_8x16(21,0,0,ZM1_8x16[nz2_fen/10]); //
Disp_8x16(22,0,0,ZM1_8x16[nz2_fen%10]); //鬧鐘2分
Disp_8x16(23,0,0,ZM1_8x16[12]);
}
}
}
else//xianshiyemian=1已進(jìn)入功能菜單頁(yè)面
{
if(nz1_xl==1||nz2_xl==1) //如果已進(jìn)入功能菜單頁(yè)面 則強(qiáng)行關(guān)閉鬧鐘響鈴
{
nz1_xl=0;
nz2_xl=0;
}
if(shezhiym==0) //功能菜單頁(yè)面
{
Ds3231ReadTime(); //不在時(shí)鐘設(shè)置下運(yùn)行時(shí)鐘數(shù)據(jù)
Disp_64x48(0,0,0,ZM_64x48[0]); //顯示時(shí)鐘圖標(biāo)
Disp_64x48(1,0,0,ZM_64x48[1]); //顯示鬧鐘圖標(biāo)
Disp_64x48(2,0,0,ZM_64x48[2]); //顯示設(shè)置圖標(biāo)
if(gncdym==1)fb_shizwz=1;else(fb_shizwz=0); //=1反白 =0取消反白
Disp_16x16(1,3,fb_shizwz,ZM5_16x16[10]); //顯示文字"時(shí)"
Disp_16x16(2,3,fb_shizwz,ZM5_16x16[12]); //顯示文字"鐘"
if(gncdym==2)fb_nzwz=1;else(fb_nzwz=0); //=1反白 =0取消反白
Disp_16x16(5,3,fb_nzwz,ZM5_16x16[11]); //顯示文字"鬧"
Disp_16x16(6,3,fb_nzwz,ZM5_16x16[12]); //顯示文字"鐘"
if(gncdym==3)fb_szwz=1;else(fb_szwz=0); //=1反白 =0取消反白
Disp_16x16(9,3,fb_szwz,ZM5_16x16[13]); //顯示文字"設(shè)"
Disp_16x16(10,3,fb_szwz,ZM5_16x16[14]); //顯示文字"置"
}
else if(shezhiym==1) //shezhiym=0已進(jìn)入時(shí)鐘設(shè)置頁(yè)面
{
//當(dāng)進(jìn)入時(shí)鐘設(shè)置后 沒按下加減鍵時(shí)鐘依然保持運(yùn)行
//否則按下加減鍵設(shè)置時(shí)鐘生效 寫入Ds3231時(shí)鐘芯片 松開按鍵后恢復(fù)運(yùn)行時(shí)鐘數(shù)據(jù)
if(shizhongsz==0)Ds3231ReadTime(); //不在時(shí)鐘設(shè)置下運(yùn)行時(shí)鐘數(shù)據(jù)
else
{
if(anjian2!=0&&anjian3!=0)Ds3231ReadTime(); //不在時(shí)鐘設(shè)置下運(yùn)行時(shí)鐘數(shù)據(jù)
}
Disp_16x16(5,0,0,ZM5_16x16[10]); //顯示文字"時(shí)"
Disp_16x16(6,0,0,ZM5_16x16[12]); //顯示文字"鐘"
Disp_16x16(2,2,0,ZM5_16x16[15]); //顯示文字"時(shí)"
Disp_16x16(3,2,0,ZM5_16x16[16]); //顯示文字"間"
Disp_16x16(2,3,0,ZM5_16x16[17]); //顯示文字"日"
Disp_16x16(3,3,0,ZM5_16x16[18]); //顯示文字"期"
if(shizhongsz==3)fbs_shi=1;else(fbs_shi=0); //=1反白 =0取消反白
Disp_8x16(9,2,fbs_shi,ZM1_8x16[shi/10]); //
Disp_8x16(10,2,fbs_shi,ZM1_8x16[shi%10]); //時(shí)
Disp_8x16(11,2,0,ZM1_8x16[11]); //:
if(shizhongsz==2)fbs_fen=1;else(fbs_fen=0); //=1反白 =0取消反白
Disp_8x16(12,2,fbs_fen,ZM1_8x16[fen/10]); //
Disp_8x16(13,2,fbs_fen,ZM1_8x16[fen%10]); //分
Disp_8x16(14,2,0,ZM1_8x16[11]); //:
if(shizhongsz==1)fbs_miao=1;else(fbs_miao=0); //=1反白 =0取消反白
Disp_8x16(15,2,fbs_miao,ZM1_8x16[miao/10]); //
Disp_8x16(16,2,fbs_miao,ZM1_8x16[miao%10]); //秒*/
if(shizhongsz==6)fbs_nian=1;else(fbs_nian=0); //=1反白 =0取消反白
Disp_8x16(9,3,fbs_nian,ZM1_8x16[2]); //
Disp_8x16(10,3,fbs_nian,ZM1_8x16[0]); //
Disp_8x16(11,3,fbs_nian,ZM1_8x16[nian/10]); //
Disp_8x16(12,3,fbs_nian,ZM1_8x16[nian%10]); //年
Disp_8x16(13,3,0,ZM1_8x16[10]); //-
if(shizhongsz==5)fbs_yue=1;else(fbs_yue=0); //=1反白 =0取消反白
Disp_8x16(14,3,fbs_yue,ZM1_8x16[yue/10]); //
Disp_8x16(15,3,fbs_yue,ZM1_8x16[yue%10]); //月
Disp_8x16(16,3,0,ZM1_8x16[10]); //-
if(shizhongsz==4)fbs_ri=1;else(fbs_ri=0); //=1反白 =0取消反白
Disp_8x16(17,3,fbs_ri,ZM1_8x16[ri/10]); //
Disp_8x16(18,3,fbs_ri,ZM1_8x16[ri%10]); //日
}
else if(shezhiym==2) //shezhiym=1已進(jìn)入鬧鐘設(shè)置頁(yè)面
{
Ds3231ReadTime(); //不在時(shí)鐘設(shè)置下運(yùn)行時(shí)鐘數(shù)據(jù)
Disp_16x16(5,0,0,ZM5_16x16[11]); //顯示文字"鬧"
Disp_16x16(6,0,0,ZM5_16x16[12]); //顯示文字"鐘"
/*顯示時(shí)鐘*/
Disp_8x16(8,1,0,ZM1_8x16[shi/10]); //
Disp_8x16(9,1,0,ZM1_8x16[shi%10]); //時(shí)
Disp_8x16(10,1,0,ZM1_8x16[11]); //:
Disp_8x16(11,1,0,ZM1_8x16[fen/10]); //
Disp_8x16(12,1,0,ZM1_8x16[fen%10]); //分
Disp_8x16(13,1,0,ZM1_8x16[11]); //:
Disp_8x16(14,1,0,ZM1_8x16[miao/10]); //
Disp_8x16(15,1,0,ZM1_8x16[miao%10]); //秒*/
/*鬧鐘1*/
Disp_16x16(2,2,0,ZM5_16x16[19]); //顯示文字"鬧"
Disp_16x16(3,2,0,ZM5_16x16[20]); //顯示文字"鐘"
Disp_8x16(8,2,0,ZM1_8x16[1]); //顯示數(shù)字"1"
if(naozhongsz==3)fb_nz1_shi=1;else(fb_nz1_shi=0);
Disp_8x16(10,2,fb_nz1_shi,ZM1_8x16[nz1_shi/10]); //
Disp_8x16(11,2,fb_nz1_shi,ZM1_8x16[nz1_shi%10]); //鬧鐘時(shí)
Disp_8x16(12,2,0,ZM1_8x16[11]); //:
if(naozhongsz==2)fb_nz1_fen=1;else(fb_nz1_fen=0);
Disp_8x16(13,2,fb_nz1_fen,ZM1_8x16[nz1_fen/10]); //
Disp_8x16(14,2,fb_nz1_fen,ZM1_8x16[nz1_fen%10]); //鬧鐘分
if(naozhongsz==1)fb_nz1_kg=1;else(fb_nz1_kg=0);
if(nz1_kg==1)Disp_16x16(8,2,fb_nz1_kg,ZM5_16x16[21]); //如果鬧鐘1打開 顯示文字"開"
else Disp_16x16(8,2,fb_nz1_kg,ZM5_16x16[22]); //如果鬧鐘1關(guān)閉 顯示文字"關(guān)"
/*鬧鐘2*/
Disp_16x16(2,3,0,ZM5_16x16[19]); //顯示文字"鬧"
Disp_16x16(3,3,0,ZM5_16x16[20]); //顯示文字"鐘"
Disp_8x16(8,3,0,ZM1_8x16[2]); //顯示數(shù)字"2"
if(naozhongsz==6)fb_nz2_shi=1;else(fb_nz2_shi=0); //=1反白 =0取消反白
Disp_8x16(10,3,fb_nz2_shi,ZM1_8x16[nz2_shi/10]); //
Disp_8x16(11,3,fb_nz2_shi,ZM1_8x16[nz2_shi%10]); //鬧鐘時(shí)
Disp_8x16(12,3,0,ZM1_8x16[11]); //:
if(naozhongsz==5)fb_nz2_fen=1;else(fb_nz2_fen=0); //=1反白 =0取消反白
Disp_8x16(13,3,fb_nz2_fen,ZM1_8x16[nz2_fen/10]); //
Disp_8x16(14,3,fb_nz2_fen,ZM1_8x16[nz2_fen%10]); //鬧鐘分
if(naozhongsz==4)fb_nz2_kg=1;else(fb_nz2_kg=0); //=1反白 =0取消反白
if(nz2_kg==1)Disp_16x16(8,3,fb_nz2_kg,ZM5_16x16[21]); //如果鬧鐘2打開 顯示文字"開"
else Disp_16x16(8,3,fb_nz2_kg,ZM5_16x16[22]); //如果鬧鐘2關(guān)閉 顯示文字"關(guān)"
}
else //shezhiym=2已進(jìn)入設(shè)置頁(yè)面
{
Ds3231ReadTime(); //不在時(shí)鐘設(shè)置下運(yùn)行時(shí)鐘數(shù)據(jù)
Disp_16x16(5,0,0,ZM5_16x16[13]); //顯示文字"設(shè)"
Disp_16x16(6,0,0,ZM5_16x16[14]); //顯示文字"置"
/*時(shí)鐘字體設(shè)置*/
Disp_16x16(0,1,0,ZM5_16x16[23]); //顯示文字"字"
Disp_16x16(1,1,0,ZM5_16x16[24]); //顯示文字"體"
Disp_16x16(2,1,0,ZM5_16x16[8]); //顯示單向箭頭圖標(biāo)
if(shezhixx==1)fb_shizhongzt=1;else(fb_shizhongzt=0);//=1反白 =0取消反白
switch(shizhongzt)
{
case 0:Disp_16x16(3,1,fb_shizhongzt,ZM5_16x16[25]);Disp_16x16(4,1,fb_shizhongzt,ZM5_16x16[24]); break; //顯示文字"宋體"
case 1:Disp_16x16(3,1,fb_shizhongzt,ZM5_16x16[26]);Disp_16x16(4,1,fb_shizhongzt,ZM5_16x16[27]);break; //顯示文字"數(shù)碼"
case 2:Disp_16x16(3,1,fb_shizhongzt,ZM5_16x16[28]);Disp_16x16(4,1,fb_shizhongzt,ZM5_16x16[29]);break; //顯示文字"創(chuàng)意"
}
/*按鍵燈設(shè)置*/
Disp_16x16(7,1,0,ZM5_16x16[30]); //顯示文字"鍵"
Disp_16x16(8,1,0,ZM5_16x16[31]); //顯示文字"燈"
Disp_16x16(9,1,0,ZM5_16x16[8]); //顯示單向箭頭圖標(biāo)
if(shezhixx==2)fb_jdms=1;else(fb_jdms=0); //=1反白 =0取消反白
if(jdms==0)
{
Disp_16x16(10,1,fb_jdms,ZM5_16x16[32]); //顯示文字"全"
Disp_16x16(11,1,fb_jdms,ZM5_16x16[33]); //顯示文字"亮"
}
else
{
Disp_16x16(10,1,fb_jdms,ZM5_16x16[34]); //顯示文字"單"
Disp_16x16(11,1,fb_jdms,ZM5_16x16[35]); //顯示文字"點(diǎn)"
}
/*背光時(shí)長(zhǎng)*/
Disp_16x16(0,2,0,ZM5_16x16[36]); //顯示文字"背"
Disp_16x16(1,2,0,ZM5_16x16[37]); //顯示文字"光"
Disp_16x16(2,2,0,ZM5_16x16[8]); //顯示單向箭頭圖標(biāo)
if(shezhixx==3)fb_bgsc=1;else(fb_bgsc=0); //=1反白 =0取消反白
switch(bgsc)
{
case 0:Disp_8x16(6,2,fb_bgsc,ZM1_8x16[1]); //10秒設(shè)置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[0]);
Disp_16x16(4,2,0,ZM5_16x16[38]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=10;
break;
case 1:Disp_8x16(6,2,fb_bgsc,ZM1_8x16[2]); //20秒設(shè)置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[0]);
Disp_16x16(4,2,0,ZM5_16x16[38]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=20;
break;
case 2:Disp_8x16(6,2,fb_bgsc,ZM1_8x16[3]); //30秒設(shè)置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[0]);
Disp_16x16(4,2,0,ZM5_16x16[38]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=30;
break;
case 3:Disp_8x16(6,2,0,ZM1_8x16[12]); //1分鐘設(shè)置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[1]);
Disp_16x16(4,2,0,ZM5_16x16[39]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=60;
break;
case 4:Disp_8x16(6,2,0,ZM1_8x16[12]); //2分鐘設(shè)置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[2]);
Disp_16x16(4,2,0,ZM5_16x16[39]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=120;
break;
case 5:Disp_8x16(6,2,0,ZM1_8x16[12]); //3分鐘設(shè)置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[3]);
Disp_16x16(4,2,0,ZM5_16x16[39]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=180;
break;
}
/*按鍵聲音*/
Disp_16x16(7,2,0,ZM5_16x16[30]); //顯示文字"鍵"
Disp_16x16(8,2,0,ZM5_16x16[40]); //顯示文字"聲"
Disp_16x16(9,2,0,ZM5_16x16[8]); //顯示單向箭頭圖標(biāo)
if(shezhixx==4)fb_anjiansy=1;else(fb_anjiansy=0); //=1反白 =0取消反白
if(anjiansy_kg==1)Disp_16x16(10,2,fb_anjiansy,ZM5_16x16[21]); //按鍵聲音開
else Disp_16x16(10,2,fb_anjiansy,ZM5_16x16[22]); //按鍵聲音開
/*整點(diǎn)報(bào)時(shí)*/
Disp_16x16(0,3,0,ZM5_16x16[41]); //顯示文字"報(bào)"
Disp_16x16(1,3,0,ZM5_16x16[15]); //顯示文字"時(shí)"
Disp_16x16(2,3,0,ZM5_16x16[8]); //顯示單向箭頭圖標(biāo)
if(shezhixx==5)fb_zdbs_kg=1;else(fb_zdbs_kg=0); //=1反白 =0取消反白
if(zdbs_kg==1)Disp_16x16(3,3,fb_zdbs_kg,ZM5_16x16[21]); //顯示文字"開"
else Disp_16x16(3,3,fb_zdbs_kg,ZM5_16x16[22]); //顯示文字"關(guān)"
if(shezhixx==6)fb_zdbs_qd=1;else(fb_zdbs_qd=0); //=1反白 =0取消反白
Disp_8x16(10,3,fb_zdbs_qd,ZM1_8x16[zdbs_qd/10]); //
Disp_8x16(11,3,fb_zdbs_qd,ZM1_8x16[zdbs_qd%10]); //整點(diǎn)報(bào)時(shí)允許范圍 起點(diǎn)
Disp_16x16(6,3,0,ZM5_16x16[9]); //顯示雙向箭頭圖標(biāo)
if(shezhixx==7)fb_zdbs_zd=1;else(fb_zdbs_zd=0); //=1反白 =0取消反白
Disp_8x16(14,3,fb_zdbs_zd,ZM1_8x16[zdbs_zd/10]); //
Disp_8x16(15,3,fb_zdbs_zd,ZM1_8x16[zdbs_zd%10]); //整點(diǎn)報(bào)時(shí)允許范圍 止點(diǎn)
}
}
}
}
/*定時(shí)器0函數(shù)*/
void Timer0() interrupt 1
{
TH0=0x0D1;
TL0=0x20; //給定時(shí)器0賦初值,定時(shí)1ms
pingbgjs++; //當(dāng)背光打開時(shí)定時(shí)器開始計(jì)數(shù) 用于屏背光自動(dòng)關(guān)閉控制
if(pingbgjs==84)
{
miaojs++;
if(miaojs==miaomun)
{
beiguangLED=1; //
TR0=0; //關(guān)閉定時(shí)器0
}
pingbgjs=0;
}
}
/*定時(shí)器1函數(shù)*/
void Timer1() interrupt 3
{
TH1=0x0D1;
TL1=0x20; //給定時(shí)器0賦初值,定時(shí)1ms
/*按鍵短聲*/
if(anjiansy_kg==1&&nz1_xl!=1&&nz2_xl!=1)
{
if(anjian1==0||anjian2==0||anjian3==0||anjian4==0)
{
if(anjians<10)anjians++;
if(anjians>0&&anjians<5)fmq=0;
else fmq=1;
}
}
/*鬧鐘響聲 滴滴滴~ 3聲*/
if(nz1_xl==1||nz2_xl==1)
{
naozhonglx++;
if(naozhonglx==100)naozhonglx=0; //鬧鐘鈴響計(jì)數(shù)變量
if(naozhonglx>0&&naozhonglx<=5)fmq=0; //第1聲
else if(naozhonglx>5&&naozhonglx<=10)fmq=1;
else if(naozhonglx>10&&naozhonglx<=15)fmq=0; //第2聲
else if(naozhonglx>15&&naozhonglx<=20)fmq=1;
else if(naozhonglx>20&&naozhonglx<=25)fmq=0; //第3聲
else fmq=1;
}
}
|
-
-
多功能時(shí)鐘.zip
2022-12-26 15:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
287.11 KB, 下載次數(shù): 491, 下載積分: 黑幣 -5
|