📄 atlast.asm
字号:
SPK EQU P3.7 ; 蜂鸣器所在端口
COUNT50 EQU 39H
SEC EQU R0
MIN EQU R1
SEG EQU P2
NUM EQU P0
SEG7 EQU 30H
SEG6 EQU 31H
SEG5 EQU 32H
SEG4 EQU 33H
SEG3 EQU 36H
SEG1 EQU 3AH
DLAY EQU 34H
H_CNT1 EQU 37H
H_CNT2 EQU 38H
FLAG BIT 00H
KEYVAL EQU 40H
XUN1 EQU 41H
XUN2 EQU 42H
MUSIC EQU 43H
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP PLY_PAU
ORG 0013H
LJMP STOP
ORG 000BH ;定时0中断服务程序
LJMP COUNT
;------------------------------------------------------
ORG 100H
MAIN: MOV SP,#60H ;初始化堆栈
MOV SEC,#0H ;初始化秒
MOV MIN,#0H ;初始化分
MOV COUNT50,#50 ;一秒定时
CLR FLAG
MOV IE,#8FH
MOV TMOD,#11H
MOV TH0,#0A5H
MOV TL0,#0FFH
MOV TH1,#0EDH
MOV TL1,#0FFH
SETB IT0
SETB IT1
MOV KEYVAL,#00H
MOV MUSIC,#01H
MOV DPTR,#TABLE1
MOV 37H,#0FFH
MOV 38H,#05H
;**************欢迎界面**********************
HELLO: MOV 30H,#7FH
MOV 31H,#0BFH
MOV 32H,#0DFH
MOV 33H,#0EFH
MOV 36H,#0F7H
MOV 3AH,#0FDH
MOV P2,SEG3 ;H
MOV P0,#89H
LCALL LDELAY
MOV P2,SEG4 ;E
MOV P0,#86H
LCALL LDELAY
MOV P2,SEG5 ;L
MOV P0,#0C7H
LCALL LDELAY
MOV P2,SEG6 ;L
MOV P0,#0C7H
LCALL LDELAY
MOV P2,SEG7 ;O
MOV P0,#0C0H
LCALL LDELAY
MOV A,KEYVAL
JNZ KEYJDG
DJNZ H_CNT1, HELLO
DJNZ H_CNT2,HELLO
;==========================================================
SETB TR0
LJMP SING
KEYGET: LCALL KEY
MOV A,KEYVAL
JZ KEYGET
KEYJDG: CJNE A,#12H,SECON
FIRST1: MOV DPTR,#TABLE1
MOV MUSIC,#01H
MOV KEYVAL,#00H
;SETB FLAG
MOV SEC,#00H
MOV MIN,#00H
MOV COUNT50,#50
SETB TR0
LJMP SING
SECON: CJNE A,#11H,THIR
SECON1: MOV DPTR,#TABLE2
MOV MUSIC,#02H
MOV KEYVAL,#00H
;SETB FLAG
MOV SEC,#00H
MOV MIN,#00H
MOV COUNT50,#50
SETB TR0
LJMP SING
THIR: CJNE A,#0FH,FORTH
THIR1: MOV DPTR,#TABLE3
MOV MUSIC,#03H
MOV KEYVAL,#00H
;SETB FLAG
MOV SEC,#00H
MOV MIN,#00H
MOV COUNT50,#50
SETB TR0
LJMP SING
FORTH: CJNE A,#0BH,UP
FORTH1: MOV DPTR,#TABLE4
MOV MUSIC,#04H
MOV KEYVAL,#00H
;SETB FLAG
MOV SEC,#00H
MOV MIN,#00H
MOV COUNT50,#50
SETB TR0
LJMP SING
UP: CJNE A,#02H,DOWN
MOV KEYVAL,#00H
MOV R5,MUSIC
CJNE R5,#00H,N1
LJMP KEYGET
N1: CJNE R5,#01H,N2
LJMP FORTH1
N2: CJNE R5,#02H,N3
LJMP FIRST1
N3: CJNE R5,#03H,N4
LJMP SECON1
N4: LJMP THIR1
DOWN: ; LCALL VLDELAY
MOV R5,MUSIC
MOV KEYVAL,#00H
CJNE R5,#00H,M1
LJMP KEYGET
M1: CJNE R5,#01H,M2
LJMP SECON1
M2: CJNE R5,#02H,M3
LJMP THIR1
M3: CJNE R5,#03H,M4
LJMP FORTH1
M4: LJMP FIRST1
;-----------------------------------------------------------
KEY: PUSH ACC
MOV P1,#0F0H ;置列线为0,行线为1 ;^^^^^^^^^^^^
MOV A,P1
ANL A,#0F0H
MOV B,A
MOV P1,#0FH ;置列线为1,行线为0
MOV A,P1
ANL A,#0FH
ORL A,B
CJNE A,#0FFH,UUU
AJMP QICH
UUU: CLR C
SUBB A,#0DCH
JNC HAHA
QICH: CLR A
HAHA: MOV KEYVAL,A
POP ACC
RET
;-------------------------------------------------------------
;-------------------------------------------------------------
;**************定时中断服务程序***********************
COUNT: MOV TH0,#0A5H
MOV TL0,#0FFH
LCALL KEY
JNB FLAG,RETURN
DJNZ COUNT50,RETURN ;是否到一秒
;*****一秒处理****************
MOV COUNT50,#50
INC SEC
CJNE SEC,#60,RETURN
MOV SEC,#0H
INC MIN
CJNE MIN,#100,RETURN ;一百分钟以后自动清零
MOV MIN,#00H
RETURN: LCALL DISPLAY
RETI
;**************************************************
;**************显示子程序*******************
DISPLAY: PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
MOV A,MIN
MOV B,#0AH
DIV AB
MOV SEG,SEG4
LCALL TODIS
LCALL DELAY
MOV SEG,SEG5
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ANL A,#7FH
MOV NUM,A
LCALL DELAY
MOV A,SEC
MOV B,#10
DIV AB
MOV SEG,SEG6
LCALL TODIS
LCALL DELAY
MOV SEG,SEG7
MOV A,B
LCALL TODIS
LCALL DELAY
MOV A,MUSIC
MOV SEG,SEG1
LCALL TODIS
POP DPL
POP DPH
POP B
POP ACC
RET
;******数字到字型*****************
TODIS: PUSH DPH
PUSH DPL
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV NUM,A
POP DPL
POP DPH
RET
;******************************************
;*********短延时子程序1.38毫秒*****************
DELAY: PUSH ACC
MOV DLAY,#01H
LOOP: MOV ACC,#0FFH
DJNZ ACC,$
DJNZ DLAY,LOOP
POP ACC
RET
;******************************************
;*********长延时子程序24.9毫秒*****************
LDELAY: PUSH ACC
MOV DLAY,#01H
LLOOP: MOV ACC,#0FDH
DJNZ ACC,$
DJNZ DLAY,LLOOP
POP ACC
RET
;******************************************
;****************外部中断0服务程序(播放/暂停)***************************
PLY_PAU:
SETB TR0
CPL FLAG
RETI
;***************外部中断1服务程序(停止)***********************************
STOP:
MOV SEC,#00H
MOV MIN,#00H
MOV COUNT50,#50
CLR FLAG
MOV R3,#02H
; CLR TR0 ;*******
RETI
;**************************************************
;==============================================================
SING: MOV R3,#02H
NEXT:
MOV A,KEYVAL
JZ PPB
LJMP KEYJDG
PPB: JNB FLAG,NEXT ;?
MOV A,R3
CJNE A,#00H,XIA
INC DPH
XIA: MOVC A,@A+DPTR ;?
JZ START
MOV R7,A
INC R3
MOV A,R3
MOVC A,@A+DPTR
MOV R2,A
ACALL SONG
INC R3
SJMP NEXT
START: CLR FLAG
LJMP KEYGET
;===============================================================================
;=== 歌曲播放子程序 ===
SONG: PUSH DPH
PUSH DPL
MOV A,R2 ; 取出节拍
RL A
; RL A
JNZ KEEP
MOV A,#01H
KEEP: MOV R2,A
REPEAT: ACALL EIGHTH
DJNZ R2,REPEAT
SETB SPK
MOV R6,#05H
YU: MOV R4,0FFH
ACALL SDELAY
DJNZ R6,YU
POP DPL
POP DPH
RET
;===============================================================================
;=== 产生1/8拍延时子程序 ===
EIGHTH: CJNE R7,#20H,NEXT1
MOV R5,15H
Y3: MOV R4,0FAH
Y2: MOV R6,#09H
NOP
Y1: DJNZ R6,Y1
DJNZ R4,Y2
DJNZ R5,Y3
RET
NEXT1: MOV A,R7 ; 查表取出廷时参数,保存到R4
MOV DPTR,#DELAY_T
MOVC A,@A+DPTR
MOV R4,A
MOV A,R7 ; 查表取出1/8拍周期数,保存到R5
MOV DPTR,#S_PARA
MOVC A,@A+DPTR
MOV R5,A
NEXTCYC: ACALL SOUND
DJNZ R5,NEXTCYC
RET
;===============================================================================
;=== 发声子程序 ===
SOUND: SETB SPK
ACALL SDELAY
CLR SPK
ACALL SDELAY
RET
;===============================================================================
;=== 延时子程序 ===
SDELAY:
MOV A,R4 ; 廷时值在R4内
MOV XUN1,A
XL2: MOV XUN2,#03H
DL1: DJNZ XUN2,DL1
DJNZ XUN1,XL2
RET
;===============================================================================
;=== 1/8拍周期表 ===
S_PARA: DB 10H,12H,14H,16H,18H,1BH,1FH
DB 21H,24H,29H,2CH,31H,37H,3EH
DB 3FH,45H,52H,57H,62H,6EH,7BH
;===============================================================================
;=== 延时参数表 ===
DELAY_T: DB 0C3H,0AEH,9BH,92H,83H,74H,68H ;00-06
DB 62H,57H,4DH,49H,41H,3AH,34H ;07-0DH
DB 31H,2EH,27H,24H,20H,1DH,19H ;0E-14H
;===============================================================================
;**************************************************
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,83H
;=== 歌曲表 ===
TABLE1: DW 0000H,0504H,0806H,0802H,0802H,0802H,0702H,0802H,0906H,0702H,0506H
DW 0502H,0A04H,0804H,0302H,0302H,0402H,0402H,0504H,0504H,0504H,2004H
DW 0502H,0806H,0902H,0A02H,0902H,0801H,0701H,0601H,0501H,0406H,0602H,0804H,0902H
DW 0802H,0506H,0602H,0502H,0402H,0202H,0302H,0104H,0102H,2004H
DW 0504H,0806H,0802H,0802H,0802H,0702H,0802H,0B06H,0A01H,0901H,0906H
DW 0902H,0A04H,0804H,0302H,0302H,0402H,0402H,0504H,0504H,0504H,2004H
DW 0502H,0806H,0902H,0A02H,0902H,0801H,0701H,0601H,0501H,0406H,0602H,0804H,0902H
DW 0802H,0506H,0602H,0502H,0402H,0202H,0302H,0104H,2002H
DW 0502H,0806H,0902H,0A02H,0902H,0801H,0701H,0601H,0501H,0406H,0602H,0804H,0902H
DW 0802H,0506H,0602H,0502H,0402H,0202H,0302H,0106H,2004H
DW 0000H
TABLE2:
DW 0000H,0901H,0A01H,0B02H,0B02H,0B02H,0702H,0801H,0702H,0904H,2002H ;人生路上甜苦和喜忧
DW 0801H,0702H,0702H,0502H,0701H,0502H,0403H,2004H ;辉赣肽惴值K
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -