⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.txt

📁 用c语言开发单片机
💻 TXT
📖 第 1 页 / 共 2 页
字号:
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 + -