帶有時間設(shè)置和秒顯示的數(shù)字鬧鐘
——
; 帶有時間設(shè)置和秒顯示的數(shù)字鬧鐘
; Date : 2006.3.13 12MHZ晶振
; Create by :塵封往事 逸飛
; P3.2設(shè)置鍵 P3.3小時調(diào)整鍵 P3.5分鐘調(diào)整鍵 P1.7定時輸出指示
;**************************************************************
;*********************************************************
; 變量地址分配
;*********************************************************
SwDelay equ 2; 設(shè)置按鍵時去抖動時間
DisplayBuffer equ 30h; 設(shè)置顯示緩沖區(qū)的地址為30h-35h共6個字節(jié)
BeepVal equ 36h; 蜂鳴時間長短存儲器地址
OneSecondCounter equ 39h; 設(shè)置1秒計數(shù)器的地址,1秒計數(shù)器是用來計數(shù)1秒內(nèi)計時器的中斷次數(shù)
Hour equ 3ah; 設(shè)置小時計數(shù)器的地址
Minute equ 3bh; 設(shè)置分鐘計數(shù)器的地址
Second equ 3ch; 設(shè)置秒計數(shù)器的地址
P1Val equ 3dh; 設(shè)置數(shù)碼管位驅(qū)動值的地址
ClockMode equ 20h.0; 模式(正常走時/鬧時)設(shè)置寄存器地址,值為0時正常走時,為1時鬧時設(shè)定
AlarmOnOff equ 20h.1; 鬧鐘開啟/關(guān)閉標志,為0關(guān)閉,為1開啟
AlarmTimeOn equ 20h.2; 此位為1時表示鬧時時間到
DispHour equ 21h; 設(shè)置小時顯示寄存器的地址
DispMinute equ 22h; 設(shè)置分鐘顯示寄存器的地址
DispSecond equ 23h; 設(shè)置秒顯示寄存器的地址
AlarmHour equ 2eh; 設(shè)置鬧時小時計數(shù)器的地址
AlarmMinute equ 2fh; 設(shè)置鬧時分鐘計數(shù)器的地址
AlarmSetKey bit P3.2; 鬧鐘設(shè)置鍵
MinuteKey bit P3.5; 定義分設(shè)置鍵
HourKey bit P3.3; 定義小時設(shè)置鍵
RelayOut equ P1.7; 定義輸出引腳
;**********************************************************************
; 程序開始
;**********************************************************************
org 00h
ajmp Reset; 程序開始
org 0bh ; Timer0中斷向量地址
ajmp TimeInt; 跳到中斷處理程序
org 0020h
Reset: ; 以下為初始化程序,為各個變量賦初值
mov sp,#70h;
setb RelayOut
mov OneSecondCounter,#125
;
mov Hour,#12;
mov Minute,#00;
mov Second,#00; 設(shè)置上電時時鐘顯示的初值
;
mov AlarmHour,#06;
mov AlarmMinute,#00; 設(shè)置上電時鬧時時間的初值
;
clr AlarmOnOff; 上點復(fù)位后鬧時功能處于關(guān)閉狀態(tài)
clr ClockMode; 正常走時模式
clr AlarmTimeOn;
setb RelayOut; 清鬧時輸出
;************************************
; Use Timer 0 Mode 1
; 400us interrupt
;************************************
mov tmod,#00000001b;
mov th0,#0E3h;
mov tl0,#39h;
mov ie, #82h; 開全局中斷
setb tr0; 開定時中斷
;*****************************************
; 以下為主程序
;*****************************************
MainLoop:
jb AlarmSetKey,CheckMinuteKey; 鬧時設(shè)置鍵按下了嗎?沒有則轉(zhuǎn)去檢測秒設(shè)置鍵
;
call Delay;
jb AlarmSetKey,CheckMinuteKey; 按下的時間超過500ms嗎?
setb ClockMode; 置為鬧時設(shè)置模式
call AlarmSet;
CheckMinuteKey:
jb MinuteKey,CheckHourKey; 分設(shè)置鍵按下了嗎?沒有則轉(zhuǎn)去檢測小時設(shè)置鍵
; 如按下調(diào)用蜂鳴器發(fā)音程序
mov a,Minute
add a,#1; 如果按下則將分鐘加一 十進制調(diào)整
mov Minute,a;
cjne a,#3ch,NotOver1; 到60分鐘了嗎?
mov Minute,#0; 到60分鐘則將分鐘清0
NotOver1: ;以下等待按鍵釋放及防抖動
jnb MinuteKey,$
CheckHourKey:
jb HourKey,CheckAlarm; 小時設(shè)置鍵按下了嗎?沒有則轉(zhuǎn)去鬧時狀態(tài)檢測
; 如按下調(diào)用蜂鳴器發(fā)音程序
mov a,Hour
add a,#1; 如果按下則將小時加1
mov Hour,a
cjne a,#18h,NotOver2
mov Hour,#0; 到24小時則將小時清0
NotOver2: ;以下等待按鍵釋放及防抖動
jnb HourKey,$
CheckAlarm: ;
jnb AlarmTimeOn,ToReturn
call AlarmProcess
ToReturn:
ajmp MainLoop
;**********************************************
; 定時器Timer0中斷服務(wù)程序(此程序每8ms執(zhí)行一次)
;********************************************** {{分頁}}
TimeInt:
mov th0,#0E3h; 重新加載定時參數(shù)
mov tl0,#39h;
push acc
push psw; 保護累加器及程序狀態(tài)字的內(nèi)容
setb rs0; 選擇工作寄存器組1,
clr rs1; 這樣可保護原工作寄存器組(0組)的內(nèi)容
djnz OneSecondCounter,NotoneSecond; 中斷了125次了嗎?即夠1秒了嗎?
mov OneSecondCounter,#125; 如夠1秒則重新設(shè)置"OneSecondCounter"計數(shù)器
call Clock ; 調(diào)用將時鐘內(nèi)容加1秒的子程序
call ConvertoBuffer ; 調(diào)用將時鐘內(nèi)容轉(zhuǎn)換到顯示緩沖區(qū)子程序
NotoneSecond:
call ScanDisplay ; 調(diào)用掃描顯示子程序
pop psw
pop acc ; 恢復(fù)累加器及程序狀態(tài)字的內(nèi)容
reti ; 中斷返回
;*********************************************
; 掃描顯示子程序
;*********************************************
ScanDisplay:
MOV R1,#DisplayBuffer ;指向顯示數(shù)據(jù)首址
MOV R4,#11111011b ;掃描控制字初值
PLAY: MOV A,R4 ;掃描字放入A
MOV P2,A ;從P2口輸出
MOV A,@R1 ;取顯示數(shù)據(jù)到A
MOV DPTR,#TAB ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數(shù)據(jù)對應(yīng)段碼
MOV P0,A ;段碼放入P1口
LCALL Delay
INC R1 ;指向下一地址
MOV A,R4 ;掃描控制字放入A
JNB ACC.7,ENDOUT ;掃到第六位時結(jié)束
RL A ;A中數(shù)據(jù)循環(huán)左移
MOV R4,A ;放回R5內(nèi)
AJMP PLAY ;跳回PLAY循環(huán)
ENDOUT: SETB P2.7 ;一次顯示結(jié)束,P2口復(fù)位
MOV P0,#0FFH ;P0口復(fù)位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,7FH,0B7H,0FFH
;共陽段碼表 "0""1""2" "3""4""5""6""7" "8""9"".""=""不亮"
;****************************************************
; 時鐘內(nèi)容加1秒的子程序
;****************************************************
Clock:
mov a,Second; 將原秒值送入a
add a,#1; 加1秒
mov Second,a
cjne a,#3cH,NotOverFlow; 夠60秒了嗎?
mov Second,#0; 夠了則將秒值清0
;
mov a,Minute
add a,#1
mov Minute,a; 分鐘加1
cjne a,#3cH,NotOverFlow; 夠60分了嗎?
&n 塵埃粒子計數(shù)器相關(guān)文章:塵埃粒子計數(shù)器原理 蜂鳴器相關(guān)文章:蜂鳴器原理
評論