?? 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 + -