?? zhonghe.asm
字號:
MOV L3,#00H
SETB LED4
MOV DSPLYP,#L0 ; 指針指向顯存
SETB LPLMOD ; 設定顯示方式不閃爍
SETB HPLMOD
MOV A,R4 ; 移入工作模式選擇數
RL A ;
MOV DPTR,#A_TAB
JMP @A+DPTR ; 根據工作模式選擇數跳轉
A_TAB: AJMP ACTF1 ; 工作模式一
AJMP ACTF1 ; 工作模式二
AJMP ACTF3 ; 工作模式三
AJMP ACTF3 ; 工作模式四
NOP
NOP
LJMP ERR ; 軟件陷阱
ACTF1: SETB SWITCH ; 工作模式一(或二): 開繼電器
LJMP AAA
BBB: MOV R_MOD,#82H ; 響鈴模式參數#82H
MOV R2,#96H ; 響鈴次數參數#96H
ACTF11: ACALL RING ; 調用響鈴子程序
JNB MKEY,ENDACT ; 等待鍵按下
JNB FKEY,ENDACT ; 有鍵按下則結束響鈴
DJNZ R2, ACTF11 ; 次數未滿繼續響鈴
MOV R_MOD,#0FFH ; 參數#0FF使響鈴無效
AJMP ACTF11 ; 無鍵按下返回
NOP
NOP
LJMP ERR ; 軟件陷阱
ACTF3: CLR SWITCH ; 工作模式三(或四): 開繼電器
CLR BELL ; 蜂鳴器短鳴一聲
ACALL DL1S
SETB BELL
MOV R_MOD,#0FFH ; 響鈴模式參數#0FFH
MOV R2,#96H ; 響鈴時間參數#96H
ACTF31: ACALL RING ; 調用響鈴子程序
JNB MKEY,ENDACT ; 等待鍵按下
JNB FKEY,ENDACT ; 有鍵按下則結束
DJNZ R2,ACTF31 ; 次數未滿繼續
MOV R2,#96H ; 重新賦值
CLR BELL ; 短鳴一聲(說明: 響鈴模式參數#0FFH使
ACALL DL100 ; 響鈴程序無效,僅起延時作用,
SETB BELL ; 每延時一段時間短鳴一聲,以
AJMP ACTF31 ; 提醒使用者繼電器仍在工作)
NOP
NOP
LJMP ERR ; 軟件陷阱
ENDACT: SETB SWITCH ; 關繼電器
AWAITF: ACALL DISPLY ; 調用顯示
JNB FKEY,AWAITF ; 等待鍵釋放
AWAITM: ACALL DISPLY ; 調用顯示
JNB MKEY,AWAITM ; 等待鍵釋放
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
;**************
; 響鈴程序 ;
;**************
RING: MOV R5,#18H ; R5為循環控制變量
RING1: JNB MKEY,R_EXIT ; 鍵掃描
JNB FKEY,R_EXIT ; 有鍵按下則退出
MOV A,R_MOD ; 移入響鈴模式參數
MOV C,ACC.7 ; 根據響鈴模式參數改變響鈴
MOV BELL,C
RL A
MOV R_MOD,A
ACALL DL100 ; 延時
DJNZ R5,RING1 ; 循環次數控制
R_EXIT: SETB BELL ; 關閉響鈴
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
;**************
; 顯示程序 ;
;**************
DISPLY: PUSH ACC ; 數據壓棧保護
PUSH PSW
MOV PSW,#10H ; 選用寄存器組2
MOV R0,DSPLYP ; 移入顯示指針
MOV R2,#0FDH ; R2寄存的是數碼管選通數
MOV A,PLYTS ; 移入顯示循環控制量
JNZ PLAY ; 不為0則轉PLAY
MOV PLYTS,#64H ; 否則從新賦值
CPL BRIGHT ; 亮滅指示位取反
PLAY: DEC PLYTS ; 顯示循環控制量減1
JNB LPLMOD,PLAYL ; 低兩位數碼管不閃則"PLAYL"
JB BRIGHT,PLAYL ; 亮滅指示為1也"PLAYL"
ACALL NOPLAY ; 否則滅燈延時
AJMP PLAY1 ; 轉顯示高位數碼管
NOP
NOP
LJMP ERR ; 軟件陷阱
;用來顯示低位
PLAYL: ORL P1,#7FH ; 清原顯示數據
ORL P3,#3CH ; 清原選通數據
MOV A,R2 ; 移入數碼管位選數
RL A ; 換一位
ANL P3,A ; 選通低位的個位數碼管
MOV R2,A ; 暫存位選數
MOV A,@R0 ; 移入顯示數值
MOV DPTR,#TABLE1 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送顯示數據
ACALL DL1MS ; 延時
INC R0 ; 指向低位的十位數
JB P3.3,PLAYL ; 顯示低位的十位數
;
PLAY1: JNB HPLMOD,PLAYH ; 高兩位數碼管不閃則"PLAYH"
JB BRIGHT,PLAYH ; 亮滅指示為1也"PLAYH"
ACALL NOPLAY ; 否則滅燈延時
AJMP OUTPLY ; 轉結束
NOP
NOP
LJMP ERR ; 軟件陷阱
;
;用來顯示高位
PLAYH: ORL P1,#7FH ; 清原顯示數據
ORL P3,#3CH ; 清原選通數據
ANL P3,#0EFH ; 選通高位的個位數數碼管
MOV A,@R0 ; 移入顯示數值
MOV DPTR,#TABLE1 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送顯示數據
ACALL DL1MS ; 延時
INC R0 ; 指向高位的十位數
; ; 顯示高位的十位數
ORL P1,#7FH ; 清原顯示數據
ORL P3,#3CH ; 清原選通數據
ANL P3,#0DFH ; 選通高位的十位數
MOV A,@R0 ; 移入顯示數值
MOV C,LED4 ; 指針放大+小燈狀態
RLC A ;
MOV DPTR,#TABLE2 ; 移入表首地址
MOVC A,@A+DPTR ; 查表
ANL P1,A ; 送顯示數據
ACALL DL1MS ; 延時
;
OUTPLY: POP PSW ; 恢復數據
POP ACC
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
; "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
;
TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH
; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:"
;
;
;
;**********************
; 無顯示(滅燈)程序 ;
;**********************
NOPLAY: ORL P1,#7FH ; 清顯示數據
ORL P3,#3CH ; 清選通數據
INC R0 ; 指針自增2
INC R0
ACALL DL1MS ; 延時
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
;******************
; 延時程序 ;
;******************
DL1MS: MOV R3,#0F9H ; 延時 1250US 只為DISPLY所調用
DL1MS1: NOP
NOP
NOP
DJNZ R3,DL1MS1
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
KEYDLY: CLR BELL ; 按鍵消抖動專用延時程序,
ACALL DISPLY ; 在消除抖動的同時發出按鍵提示音
SETB BELL
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
DL50MS: MOV R7,#0AH ; 50毫秒延時程序
DL50M1: ACALL DISPLY ; 每調用一次顯示程序5MS
DJNZ R7,DL50M1 ; 調用10次
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
DL100: ACALL DL50MS ; 延時100毫秒
ACALL DL50MS
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
DL05S: ACALL DL100 ; 延時0.5秒
ACALL DL100
ACALL DL100
ACALL DL100
ACALL DL100
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
DL1S: ACALL DL05S ; 延時1秒
ACALL DL05S
RET
NOP
NOP
LJMP ERR ; 軟件陷阱
;
;****************************
; ERR(出錯處理) 程序 ;
;****************************
ERR: CLR EA ; 關中斷
MOV DPTR,#ERR1 ; 準備返回地址
PUSH DPL ; 壓棧
PUSH DPH ;
RETI ; 中斷返回
ERR1: MOV 56H,#0AAH ; 建立上電標志(出錯標志)
MOV 57H,#55H
MOV A,#00H ; 準備返回地址
PUSH ACC ; 壓棧
PUSH ACC
RETI ; 中斷返回
NOP
NOP
LJMP ERR ; 軟件陷阱
;
ORG 07FAH
NOP
NOP
NOP
LJMP ERR ; 軟件陷阱
;AAA:JNB P0.6,CCC
;CCC:LJMP YINYUE
;LJMP DIANZIQIN
DIANZIQIN:;MOV P0,#00H
;clr p3.6
;setb P0.1
SETB EA
SETB ET1 ;計數器0
MOV TMOD,#20H
MOV TH1,#09CH
MOV TL1,#09CH ;定時器初植
CLR TR1 ;定時器不允許
SCAN: ;鍵盤掃描
MOV A,P2 ;判斷鍵盤按下,跳到SCAN_1,若未按,繼續掃描
CJNE A,#0FFH,SCAN_1
NOP
SJMP SCAN
SCAN_1:
ACALL DELAY ;是不是真的要按下?如果是,則跳轉SU_KEY查詢是哪個按下?
MOV A,P2
CJNE A,#0FFH,SU_KEY
NOP
SJMP SCAN
SU_KEY:JNB P0.6,LOOP11
;SJMP LOOP2
;LOOP11:LJMP AAA
JNB P2.1,MU_1 ;判斷是哪個鍵按下?
JNB P2.2,MU_2
JNB P2.3,MU_3
JNB P2.4,MU_4
JNB P2.5,MU_5
JNB P2.6,MU_6
JNB P2.7,MU_7
SJMP SCAN
LOOP11:LJMP AAA
;R1信號周期
MU_1: MOV R1,#19 ;如果第一個按鍵按下,則R1=19,同時程序轉NEXT
SJMP NEXT
MU_2: MOV R1,#17
SJMP NEXT
MU_3: MOV R1,#15
SJMP NEXT
MU_4: MOV R1,#14
SJMP NEXT
MU_5: MOV R1,#13
SJMP NEXT
MU_6: MOV R1,#11
SJMP NEXT
MU_7: MOV R1,#10
SJMP NEXT
NEXT: MOV A,R1
MOV R0,A
SETB TR1 ;啟動定時器0
NEXT_1:MOV A,P2 ; 沒鍵按下繼續執行,有鍵按下,返回讀引腳
CJNE A,#0FFH,NEXT_1
ACALL DELAY
MOV A,P2 ;真的沒鍵按下?
CJNE A,#0FFH,NEXT_1
CLR TR1 ;不響
AJMP SCAN ;掃描鍵盤去
INT_1: ;中斷程序
DJNZ R0,RE ;R0不等于0時,返回
CPL P0.0
MOV A,R1
MOV R0,A
RE: RETI
DELAY:MOV R7,#100 ;延長時間等待,鍵盤消抖
D1: MOV R6,#10
D2: DJNZ R6,D2
DJNZ R7,D1
;LJMP BBB
RET
AAA:
SETB P3.6
;CLR P0.6
MOV SP,#50H
MOV TH1,#0D8H
MOV TL1,#0EFH
MOV TMOD,#10H
MOV IE,#88H
LJMP TIAO
MUSIC0:;JB P0.6,QIN
;LJMP BBB
TIAO:
NOP
MOV DPTR,#DAT ;表頭地址送DPTR
MOV 20H,#00H ;中斷計數器清0
MOV B,#00H ;表序號清0
MUSIC1:
;JnB P0.1,duan
NOP
CLR A
MOVC A,@A+DPTR ;查表取代碼
JZ END0 ;是00H,則結束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
duan:ljmp BBB
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取節拍代碼送R7
MOV R7,A
SETB TR1 ;啟動計數
MUSIC2:
;clr P3.6
NOP
CPL P0.0
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中斷計數器(20H)=R7否?
;不等,則繼續循環
;JB P0.6,QIN
;jb p0.6,QIN
;jnb p0.4,ting
MOV 20H,#00H ;等于,則取下一代碼
INC DPTR
;JB P0.6,QIN
; INC B
LJMP MUSIC1
;ting:ljmp BBB
;QIN:CLR TR1
;QIN:LJMP DIANZIQIN
;DIANZIQIN
MUSIC3:
NOP
CLR TR1 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲結束,延時1秒后繼續
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -