📄 music.txt
字号:
RS BIT P2.0 ;定义液晶显示端口标号
RW BIT P2.1
E BIT P2.2
;********************************************
L50MS EQU 60H
SEC EQU 61H
MIN EQU 62H
;*******************************************
org 0000h
ljmp main
ORG 000BH
LJMP TT0
ORG 001BH
LJMP TT1
org 1000h
main:
;-----------------------;液晶初始化
MOV SP,#70H
MOV P0,#01H ;清屏
CALL ENABLE
MOV P0,#38H ;8位,2行显示
lCALL ENABLE
MOV P0,#0FH ;屏显on,光标on,闪烁on
lCALL ENABLE
MOV P0,#06H ;计数地址加1,显示幕on
lCALL ENABLE
;-------------------------------内存初始化
lcall initil
;-------------------------------
key1: lcall key
lcall xianshi
ljmp key1
;---------------------键盘扫描
key: lcall ks
jnz k2 ;有按键则读键值
lcall open ;显示开机画面
lcall play1 ;运行播放程序
ljmp key
k2: mov R2,#0feh ;读键盘
mov R4,#00h
k3: mov A,R2
mov P1,A
mov A,P1
JB ACC.4,L1 ;为1跳转,第一行无按键
mov a,#00h
ljmp lk
L1: jb acc.5,L2
mov a,#04h
ljmp lk
L2: jb acc.6,L3
mov a,#08h
ljmp lk
L3: jb acc.7,next1
mov a,#0ch
;-------------------------------------------------------
lk: add a,R4
push acc
k4: lcall delay1 ;若同时有其他按键,则等待
lcall ks
jnz k4
;--------------------------------------------------------
mov r3,#07h
clr a
mov r0,#30h
mov r1,#31h
mm1: mov a,@r1
mov @r0,a
inc r0
inc r1
djnz r3,mm1
pop acc
mov @r0,a
RET
;------------------------------------------------------
next1: inc R4 ;列扫描
mov a,R2
JNB acc.3,n2
ljmp n1
n2: ljmp key
n1: rl a
mov R2,a
ljmp k3
;----------------------------------------------
ks: mov a,#0f0h ;判断是否有按键
mov P1,a
nop
nop
mov a,P1
cpl a
anl a,#0f0h
RET
;--------------------------------------------------
DELAY1: ;延时
SETB RS0
dl: mov R5,#0ah
dl2: mov R6,#63
dl3: nop
nop
djnz R6,dl3
djnz R5,dl2
CLR RS0
RET
;---------------------------------------------------
;给30H-37H的区域赋初值为零
;----------------------------------------------------
initil:
mov r3,#08h
mov r0,#30h
m1: mov @r0,#00h
inc r0
djnz r3,m1
RET
;----------------------------------------------------
;显示键值
;---------------------------------------------------
xianshi:
MOV P0,#8EH
CALL ENABLE
mov A,37H
mov DPTR,#TABLE3
MOVC A,@A+DPTR
CALL WRITE2
RET
;--------------------------------------------------
;显示开机画面
;-------------------------------------------------
open: mov a,37h
cjne a,#0fh,DFF
MOV P0,#0C0H ;设光标地址
CALL ENABLE
MOV DPTR,#TABLE1;写数据
CALL WRITE1
DFF: RET
;----------------------------------------------
;播放歌曲的程序
;----------------------------------------------
play1: mov a,37h
cjne a,#01h,play2
LCALL xianshi
MOV 52H,#HIGH TABLE10 ;高位地址传到52H
MOV 53H,#LOW TABLE10 ;低位地址传到53H
LCALL INITILE2
lcall MAIN0
play2: CJNE A,#02H,play3
LCALL xianshi
MOV 52H,#HIGH TABLE20
MOV 53H,#LOW TABLE20
LCALL INITILE2
lcall MAIN0
play3: CJNE A,#03H,play4
LCALL xianshi
MOV 52H,#HIGH TABLE30
MOV 53H,#LOW TABLE30
LCALL INITILE2
lcall MAIN0
play4: CJNE A,#04H,play5
LCALL xianshi
MOV 52H,#HIGH TABLE40
MOV 53H,#LOW TABLE40
LCALL INITILE2
lcall MAIN0
play5: CJNE A,#05H,play6
LCALL xianshi
MOV 52H,#HIGH TABLE50
MOV 53H,#LOW TABLE50
LCALL INITILE2
lcall MAIN0
play6: CJNE A,#06H,play7
LCALL xianshi
MOV 52H,#HIGH TABLE60
MOV 53H,#LOW TABLE60
LCALL INITILE2
lcall MAIN0
play7: CJNE A,#07H,play8
LCALL xianshi
MOV 52H,#HIGH TABLE70
MOV 53H,#LOW TABLE70
LCALL INITILE2
lcall MAIN0
play8: CJNE A,#08H,play9
LCALL xianshi
MOV 52H,#HIGH TABLE80
MOV 53H,#LOW TABLE80
LCALL INITILE2
lcall MAIN0
play9: CJNE A,#09H,play10
LCALL xianshi
MOV 52H,#HIGH TABLE90
MOV 53H,#LOW TABLE90
LCALL INITILE2
lcall MAIN0
play10: CJNE A,#0AH,AAA
LCALL xianshi
MOV 52H,#HIGH TABLE100
MOV 53H,#LOW TABLE100
LCALL INITILE2
lcall MAIN0
AAA: RET
;-----------------------------------------
;显示分秒的初始化
;------------------------------------------
INITILE2:
MOV L50MS,#20
MOV SEC,#00H
MOV MIN,#00H
MOV A,MIN
MOV B,#10
DIV AB
ADD A,#30H
MOV P0,#0CBH ;显示分十位
CALL ENABLE
CALL WRITE2
MOV A,B
ADD A,#30H
MOV P0,#0CCH ;显示分个位
CALL ENABLE
CALL WRITE2
MOV A,#3AH
MOV P0,#0CDH ;显示冒号
CALL ENABLE
CALL WRITE2
MOV A,SEC
MOV B,#10
DIV AB
ADD A,#30H
MOV P0,#0CEH ;显示秒十位
CALL ENABLE
CALL WRITE2
MOV A,B
ADD A,#30H
MOV P0,#0CFH ;显示秒个位
CALL ENABLE
CALL WRITE2
MOV P0,#080H ;设光标地址
CALL ENABLE
MOV DPTR,#TABLE2;写数据
CALL WRITE1
RET
;*********************************液晶屏写指令
ENABLE: CLR RS
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;**********************************液晶屏写数据
WRITE1: MOV R1,#00H
A1: MOV A,R1
MOVC A,@A+DPTR
CALL WRITE2
INC R1
CJNE A,#0FEH,A1 ;未到字符串末尾继续
RET
WRITE2: MOV P0,A
SETB RS
CLR RW
CLR E
CALL DELAY
SETB E
RET
;**********************************************
DELAY: MOV R4,#05 ;延时
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
RET
;----------------------------------------------
TABLE1: DB 'WELCOME',0FEH
TABLE2: DB 'dz2 jgw xcw ',0FEH
TABLE3: DB 30H,31H,32H,33h
DB 34H,35H,36H,37H
DB 38h,39H,41H,42H
DB 43H,44H,45H,46H
;--------------------------------------------------------------------
;播放歌曲程序
;--------------------------------------------------------------------
MAIN0: MOV TMOD,#11H ;定时器T0,T1工作在方式1,且为16位计数
MOV IE,#8aH ;开T0,T1的中断
lcall ks ;判断是否有按键
jnz zanting ;有按键则跳到zanting
MOV 40H,#00H
;---------------------------------------------------------
;该程序执行完后音符传到A,节拍传到R1
NEXT20: MOV A,40H
MOV DPH,52H
MOV DPL,53H
MOVC A,@A+DPTR
MOV R2,A
JZ Again ;a为0则跳,即到歌曲末尾则重复演奏一遍
ANL A,#0FH
MOV R1,A ;节拍传到R1
MOV A,R2
SWAP A
ANL A,#0FH
JNZ SING ;A不为0则跳到sing
CLR TR0 ;A为0则不发音但占一定的节拍
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -