?? shuzizhong.asm
字號:
;****************** 主程序*****************************
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP CLOCK ;轉時鐘程序
ORG 0100H
PORT EQU 4400H ;定義8155控制寄存器、A、B、C端口符號地址
PORTA EQU 4401H
PORTB EQU 4402H
PORTC EQU 4403H
SECBIT EQU 08H ;定義各標識位符號地址
MINBIT EQU 09H
HOURBIT EQU 0AH
RMINBIT EQU 0BH
RHOURBIT EQU 0CH
RTIMBIT EQU 0DH
ARMBIT EQU 0EH
TIMDATA EQU 30H
RTIMDATA EQU 31H
MSEC1 EQU 32H
MSEC2 EQU 33H
SEC EQU 34H
MIN EQU 35H
HOUR EQU 36H
RSEC EQU 37H
RMIN EQU 38H
RHOUR EQU 39H
COUNT EQU 3AH
MAIN: MOV SP,#60H
MOV DPTR,#PORT
MOV A,#03H ;設8155A、B口輸出,C口輸入
MOVX @DPTR,A
MOV 21H,#00H ;清零鬧鐘標識位
MOV RHOUR,#00H ;設置鬧鐘單元初值
MOV RMIN,#00H
MOV RSEC,#00H
MOV HOUR,#00H ;設置時鐘單元初值
MOV MIN,#00H
MOV MSEC1,#00H
MOV MSEC2,#00H
MOV TIMDATA,#00H ;時鐘修改記憶單元清零
MOV RTIMDATA,#00H ;鬧鐘修改記憶單元清零
MOV COUNT,#00H ;鬧鐘保持10S計時單元清零
MOV TMOD,#02H ;定時器T0方式2
MOV TL0,#06H ;定時250us初始值
MOV TH0,#06H
SETB EA ;中斷允許
SETB ET0
SETB TR0 ;啟動定時器
MOV B,#SEC ;時鐘單元首地址送B
BEGIN: LCALL KEYTEST ;調用判別鍵入測試程序
JNZ RETEST ;有鍵入則轉去抖程序
LCALL DISPLAY ;無鍵入調用顯示程序
JNB ARMBIT,BEGIN ;判別鬧鐘設定標識位
LCALL ALARM ;調鬧鐘程序
AJMP BEGIN ;返回
RETEST: LCALL DISPLAY ;調用顯示子程序延時去抖
LCALL KEYTEST
JNZ KEDATA ;若無抖動,則查鍵號,否則返回
LJMP BEGIN
KEDATA: LCALL SERCH ;調鍵號測試程序
CJNE A,#00H,NEXT1 ;判別是否時鐘修改功能鍵
LCALL FTION0 ;是時鐘參數修改功能鍵則調用時鐘修改程序
SJMP NEXT3
NEXT1: CJNE A,#01H,NEXT2 ;判別是否鬧鐘修改功能鍵
LCALL FTION1 ;是鬧鐘參數修改功能鍵則調用鬧鐘設定程序
SJMP NEXT3
NEXT2: CJNE A,#02H,NEXT3 ;判別是否加1功能鍵
LCALL CUM ;是加1功能鍵則調用加1修改程序
NEXT3: SJMP BEGIN ;循環返回
;**************************** 時鐘參數修改子程序FTION0*******************************
;功能:根據時鐘修改功能鍵按下的次數,分別將時鐘修改標識位SECBIT、MINBIT、HOURBIT置“1”
;入口:TIMDAT,時鐘修改功能鍵按下次數,每按一次時鐘修改功能鍵,該單元內容加1
;出口:TIMDAT、SECBIT、HOURBIT,根據當前TIMDAT的次數,分別將對應時鐘修改標識位置1
FTION0: CLR TR0 ; 關定時器
CLR RMINBIT ;禁止鬧鐘參數修改,清鬧鐘分修改標識位0BH
CLR RHOURBIT ;清鬧鐘小時修改標識位0CH
MOV B,#SEC ;將時鐘秒單元設為顯示首地址
MOV RTIMDATA,#00H ;清鬧鐘修改位置標識記錄
INC TIMDATA ;將時鐘修改記錄值加1
MOV A,TIMDATA
CJNE A,#01H,TW0 ;若記錄值為1,則將時鐘秒修改標識置1
SETB SECBIT ;時鐘秒標識位08H置1
LJMP BAC0
TW0: CJNE A,#02H,THREE0 ;若記錄值為1,則將時鐘秒個性標識置1
CLR SECBIT ;時鐘秒標識位08H清零
SETB MINBIT ;時鐘分標識位09H置1
LJMP BAC0
THREE0: CJNE A,#03H,BACK ;若記錄值為3,則將時鐘小時修改標識置1
CLR MINBIT ;時鐘分標識位清零
SETB HOURBIT ;時鐘小時標識位0AH置1
LJMP BAC0
BACK: MOV TIMDATA,#00H ;若按4次,則清時鐘單元修改位置記錄
CLR HOURBIT ;時鐘小時標識位0AH清零
SETB TR0 ;定時器重新啟動
BAC0: RET
;**********************鬧鐘參數修改功能鍵設定子程序FTION1*****************************
;功能:根據鬧鐘修改功能鍵按下的次數,分別將鬧鐘修改標識位RMINBIT、RHOURBIT置“1”
;入口:RTIMDAT,鬧鐘修改功能鍵按下次數,每按下一次鬧鐘修改功能鍵,該單元內容加1
;出口:RTIMDAT、ARMBIT、B、RMINBIT、RHOURBIT,根據當前RTIMDAT的次數,分別將對應鬧鐘修改標識位置1,
;并設置鬧鐘參數顯示單元首地址和鬧鐘啟動標志
FTION1: CLR SECBIT ;08H清零,禁止時鐘時間修改
CLR MINBIT ;時鐘秒標識位09H清零
CLR HOURBIT ;時鐘小時標識位0AH清零
MOV B,#RSEC ;將鬧鐘單元地址設為顯示首地址
MOV TIMDATA,#00H
INC RTIMDATA ;將鬧鐘個性記錄值加1
MOV A,RTIMDATA
CJNE A,#01H,TOW1
SETB RMINBIT ;若記錄值為1,則將鬧鐘分單元修改標識位0BH
LJMP BAC1 ;置1
TOW1: CJNE A,#02H,THREE1
CLR RMINBIT ;若記錄值為2,則將鬧鐘分單元修改標識位0BH
SETB RHOURBIT ;清零,將鬧鐘小時單元修改標識位0CH置1
LJMP BAC1
THREE1: CLR RHOURBIT ;將鬧鐘小時單元修改標識位0CH清零
SETB ARMBIT ;F0標識位為1表示鬧鐘已設定
MOV B,#SEC ;恢復時鐘顯示單元首地址
MOV RTIMDATA,#00H ;將鬧鐘修改記錄值清零
BAC1: RET
;************************加1鍵修改子程序CUM*******************************************
;功能:根據時鐘和鬧鐘修改標識位的狀態,將時鐘或鬧鐘對應顯示單元內容加1
;入口:SECBIT、MINBIT、RSECBIT、RMINBIT、RHOURBIT,若其中某標識位已被置“1”,將對應的時鐘或鬧鐘顯示單元內容加1
;出口:34H~39H,時鐘或鬧鐘顯示單元
CUM: JNB SECBIT,CUM0
MOV A,SEC
ADD A,#01H
DA A
MOV SEC,A
CJNE A,#60H,CUMEND
MOV SEC,#00H
LJMP CUMEND
CUM0: JNB MINBIT,CUM1
MOV A,MIN
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,CUMEND
MOV MIN,#00H
LJMP CUMEND
CUM1: JNB HOURBIT,CUM2
MOV A,HOUR
MOV A,#01H
DA A
MOV HOUR,A
CJNE A,24H,CUMEND
LJMP CUMEND
CUM2: JNB RMINBIT,CUM3
MOV A,RMIN
ADD A,#01H
DA A
MOV RMIN,A
CJNE A,#60H,CUMEND
MOV RMIN,#00H
LJMP CUMEND
CUM3: JNB RHOURBIT,CUMEND
MOV A,RHOUR
ADD A,#01H
DA A
MOV RHOUR,A
CJNE A,#24H,CUMEND
MOV RHOUR,#00H
CUMEND: RET
;*******************鬧鐘判斷與啟動程序ALARM*********************
;
;
;
ALARM: MOV A,RMIN
CJNE A,MIN,DONT0
MOV A,RHOUR
CJNE A,HOUR,DONT0
CLR P1.0
SETB RTIMBIT
DONT0: MOV A,COUNT
CJNE A,#10,DONT
MOV COUNT,#00H
SETB P1.0
CLR ARMBIT
CLR RTIMBIT
DONT: RET
;***********************測鍵入子程序KEYTEST*************************
;功能:判斷是否有鍵輸入
;入口:無
;出口:累加器A,A的內容為0表示無鍵輸入,A的內容指針指向8155的A口
KEYTEST: MOV DPTR,#PORTA ;DPTR指針指向8155的A口
MOV A,#00H
MOVX @DPTR,A ;掃描字00H送8155的A口
MOV DPTR,#PORTC ;DPTR指針指向8155的C口
MOVX A,@DPTR ;讀入C口運行狀態
CPL A ;A取反
ANL A,#0FH ;屏蔽高4位
RET
;************************時鐘修正中斷服務子程序CLOCK*****************
;功能:通過定時器中斷,自動修改時鐘參數
;入口:MSEC1、MSEC2、、SEC、MIN、HOUR,時鐘毫秒、秒、分、時單元,存放原時鐘參數
;出口:MSEC1、MSEC2、、SEC、MIN、HOUR,時鐘毫秒、秒、分、時單元,存入修改后的時鐘參數
CLOCK: CLR EA ;關中斷
PUSH PSW ;保護現場
PUSH ACC
SETB RS1
INC MSEC1
MOV A,MSEC1
CJNE A,#28H,BACK1
MOV MSEC1,#00H
INC MSEC2
MOV A,MSEC2
CJNE A,#64H,BACK1
MOV MSEC2,#00H
JNB RTIMBIT,BACK0
INC COUNT
BACK0: MOV A,SEC
ADD A,#01H
DA A
MOV SEC,A
CJNE A,#60H,BACK1
MOV SEC,#00H
MOV A,MIN
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,BACK1
MOV MIN,#00H
MOV A,HOUR
ADD A,#01H
DA A
MOV HOUR,A
CJNE A,#24H,BACK1
MOV HOUR,#00H
BACK1: POP ACC
POP PSW
SETB EA
RETI
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -