?? dianzishizhong.txt
字號:
#include"c:\stc54\stc54.h"
#include"c:\stc54\LedCode-P.h"
// 定義輸入按鍵I/O
sbit set = P3^4;
sbit inc = P2^6;
sbit ring = P0^3;
sbit led0 = P2^1; // 鬧鈴
bit set_sec, set_min, set_hour; // 設(shè)置時,分,秒標(biāo)志
bit set_ring0, set_ring1, set_ring2; // 設(shè)置鬧鈴1,鬧鈴2,鬧鈴3標(biāo)志
bit set_ring; // 開始設(shè)置鬧鈴標(biāo)志
bit sec; // 秒標(biāo)志
bit half; // 半秒標(biāo)志,調(diào)整時間時為被調(diào)數(shù)的閃動作準(zhǔn)備
bit run; // 時間運行標(biāo)志,時間調(diào)整時設(shè)置為run = 0
bit key_mark; // 按鍵標(biāo)志
bit store_ring0,store_ring1, store_ring2; // 存儲鬧鈴1,鬧鈴2,鬧鈴3標(biāo)志
bit store_ring; // 存儲鬧鈴標(biāo)志
bit ring_call; // 鬧鈴響應(yīng)按鍵
bit ring_re; // 不響應(yīng)鬧鈴,鬧鈴不能停止
bit time_recall; // 看完鬧鈴,恢復(fù)正常
bit ring0_see, ring1_see, ring2_see; // 觀察鬧鈴1,鬧鈴2,鬧鈴2標(biāo)志
bit ring_see;
bit ring_full; // 鬧鈴存儲滿標(biāo)志
bit ring0_lock, ring1_lock, ring2_lock; // 關(guān)閉鬧鈴1,鬧鈴2,鬧鈴3標(biāo)志
unchar second, minute, hour;
unchar second_before, minute_before, hour_before;
unchar second_ring_before, minute_ring_before, hour_ring_before;
unchar second_set_before, minute_set_before, hour_set_before;
unchar ring0, ring1, ring2; // 鬧鈴1,鬧鈴2, 鬧鈴3
unchar count;
unchar count_second; // 觀察鬧鈴,調(diào)整時表自行計數(shù)
unchar dip[6]; // 顯示變量,數(shù)碼管需要顯示的內(nèi)容存入此變量
unchar status; // 二極管狀態(tài)
extern dsp(unchar); // dsp是用匯編語言編寫的外部函數(shù),用extern聲明
void key_func(); // 按鍵功能函數(shù)
void dspfull();
void dspplay();
void delay(); // 延時函數(shù)
void change(); // 控制二極管亮滅函數(shù)
// 由于中斷函數(shù)任務(wù)較多,為了保護現(xiàn)場中斷函數(shù)工作寄存器用1區(qū)
void time0() interrupt 1
{
TL0 = TL0 + (-50000 & 0xff); // 設(shè)置初值
TH0 = -50000>>8;
// 運行時間
if (++count > 19)
{
count = 0;
sec = 1;
if(++second > 59)
{
second = 0;
if (++minute > 59)
{
minute = 0;
if (++hour > 23)
{
hour = 0;
}
}
}
}
if(count == 10)
half = 1;
}
void main()
{
TMOD = 1; // 初始化SFR
IE = 0x82;
TR0 = 1;
run = 1; // 通電時工
time_recall = 1;
// 由于C51初始化時內(nèi)部RAM都為零,因此系統(tǒng)初始為零的值都不用賦值
dspplay();
for( ; ; )
{
if(!key_mark && (!set || !inc || !ring))
{
// 鍵功能調(diào)用
delay(); // 防止干擾
if (!set || !inc || !ring) // 防干擾
{
key_mark = 1; // 設(shè)置標(biāo)志,確保每次按鍵只執(zhí)行1次
key_func();
}
}
else if(set && inc && ring)
key_mark = 0; // 抬鍵清標(biāo)志,以便下次按鍵
if (sec)
{
// 顯示功能調(diào)用
if(run && !ring_see )
dspfull(); // 時鐘運行,顯示時間
dspplay();
sec =0;
count_second++;
}
else if(half)
{
if(!run)
dspplay();
half = 0;
}
}
}
void dspfull()
{
// 拆數(shù)程序,將需要顯示的內(nèi)容送入各自的寄存器
dip[0] = hour / 10;
dip[1] = hour % 10;
dip[2] = minute / 10;
dip[3] = minute % 10;
dip[4] = second / 10;
dip[5] = second % 10;
if (((ring0 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring0_lock)
|| ((ring1 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring1_lock)
|| ((ring2 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring2_lock) )
{
change();
}
}
void dspplay()
{
unchar n;
if(ring0_see)
{
for(n=0;n<6;n++)
{
if(set_ring)
{
if(!run && half && ((set_hour && (n == 0 || n == 1))
|| (set_min && (n == 2 || n == 3))
|| (set_sec && (n == 4 || n == 5)))) // 顯示黑屏的條件
{
dsp(0xff);
}
else
{
dip[4] = 0;
dip[5] = 0;
dsp(dspc[dip[n]]);
}
}
else
{
if(n==0 || n==1 || n==2 || n==3)
{
dip[0] = ring0 / 1000;
dip[1] = ring0 % 1000 /100;
dip[2] = ring0 % 100 / 10;
dip[3] = ring0 % 10;
}
if(n==4 || n==5)
{
dip[4] = 0;
dip[5] = 0;
}
dsp(dspc[dip[n]]);
}
}
}
else if(ring1_see)
{
for(n=0;n<6;n++)
{
if(set_ring)
{
if(!run && half && ((set_hour && (n == 0 || n == 1))
|| (set_min && (n == 2 || n == 3))
|| (set_sec && (n == 4 || n == 5)))) // 顯示黑屏的條件
{
dsp(0xff);
}
else
{
dip[4] = 0;
dip[5] = 0;
dsp(dspc[dip[n]]);
}
}
else
{
if(n==0 || n==1 || n==2 || n==3)
{
dip[0] = ring1 / 1000;
dip[1] = ring1 % 1000 /100;
dip[2] = ring1 % 100 / 10;
dip[3] = ring1 % 10;
}
if(n==4 || n==5)
{
dip[4] = 0;
dip[5] = 0;
}
dsp(dspc[dip[n]]);
}
}
}
else if(ring2_see)
{
for(n=0;n<6;n++)
{
if(set_ring)
{
if(!run && half && ((set_hour && (n == 0 || n == 1))
|| (set_min && (n == 2 || n == 3))
|| (set_sec && (n == 4 || n == 5)))) // 顯示黑屏的條件
{
dsp(0xff);
}
else
{
dip[4] = 0;
dip[5] = 0;
dsp(dspc[dip[n]]);
}
}
else
{
if(n==0 || n==1 || n==2 || n==3)
{
dip[0] = ring2 / 1000;
dip[1] = ring2 % 1000 /100;
dip[2] = ring2 % 100 / 10;
dip[3] = ring2 % 10;
}
if(n==4 || n==5)
{
dip[4] = 0;
dip[5] = 0;
}
dsp(dspc[dip[n]]);
}
}
}
else if(ring_full)
{
for(n = 0; n < 6; n++)
{
if(!run && half ) // 顯示黑屏的條件
{
dsp(0xff);
}
else
{
dsp(dspc[dip[n]]); // 正常顯示
}
}
}
else if(!ring0_see && !ring1_see && !ring2_see && !ring_full)
{
for(n = 0; n < 6; n++)
{
if(!run && half && ((set_hour && (n == 0 || n == 1))
|| (set_min && (n == 2 || n == 3))
|| (set_sec && (n == 4 || n == 5)))) // 顯示黑屏的條件
{
dsp(0xff);
}
else
{
dsp(dspc[dip[n]]); // 正常顯示
}
}
}
}
void key_func()
{
if (!set) // 設(shè)置鍵
{
if(run)
{
if(set_ring0 || set_ring1 || set_ring2)
{
set_ring = 1;
if(set_ring0)
{
ring0_lock = 0;
hour = ring0 / 100;
minute = ring0 % 100;
}
if(set_ring1)
{
ring1_lock = 0;
hour = ring1 / 100;
minute = ring1 % 100;
}
if(set_ring2)
{
ring2_lock = 0;
hour = ring2 / 100;
minute = ring2 % 100;
}
hour_set_before = hour_ring_before;
minute_set_before = minute_ring_before;
second_set_before = second_ring_before;
}
else
{
hour_set_before = dip[0]*10 + dip[1];
minute_set_before = dip[2]*10 + dip[3];
second_set_before = dip[4]*10 + dip[5];
}
set_sec = 1;
set_min = 0;
set_hour = 0;
run = 0;
}
else if(set_sec)
{
set_sec = 0;
set_min = 1;
set_hour = 0;
}
else if(set_min)
{
set_sec = 0;
set_min = 0;
set_hour = 1;
}
else if(set_hour)
{
if(set_ring0 || set_ring1 || set_ring2)
{
}
else
{
hour = hour_before;
minute = minute_before ;
second = second_before ;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -