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

📄 keymusic.asm

📁 单片机汇编例程学习,大量的汇编例程
💻 ASM
字号:
;///////////////////////////////////////////
;本程序源代码由单片机培训网提供.
;单片机培训网,让更多人学习单片机更容易.
;第一网址----www.mcuedu.com
;第二网址----http://51_train.nease.net
;创办人------刘永忠
;热线电话----(0755)27529998
;email-------aa815@163.com
;本程序实现按键蜂鸣器演奏歌曲功能,按“A”键开始播放,按“B”键停止播放.
;扫描“B”键加在每次播放完一个音调后,因而有时不灵敏。
;///////////////////////////////////////////
	BUZZER EQU P2.4
	org	0000h		;主程序起始地址
	ajmp	main		;跳至主程序
	org	000bh		;timer0中断起始地址
	jmp	tim0		;跳至timer0中断子程序
	org	0030h
main:
	mov	tmod,#01h	;设timer0在MODE1
	mov	ie,#82h		;中断使能
checkkey:
	lcall	key			;8ms when no key pressed.
	cpl	a
	jz	checkkey
	mov	a,34h
	cjne	a,#0ah,checkkey
	ajmp	start0
			
start0:
	mov	30h,#00h	;取简谱码指针
next:	
	lcall	key			;8ms when no key pressed.
	cpl	a
	jz	begm
	mov	a,34h
	cjne	a,#0bh,begm
	ajmp	end0
begm:
	mov	a,30h		;简谱码指针载入A
	mov	dptr,#table	;至table取简谱码
	movc	a,@a+dptr
	mov	r2,a		;取到的简谱码暂存于R2
	jz	end0		;是否取到00(结束码)?
	anl	a,#0fh		;不是,则取低4位(节拍码)
	mov	r5,a		;将节拍码存入R5
	mov	a,r2		;将取到的简谱码再载入A
	swap	a		;高低四位交换
	anl	a,#0fh		;取低四位(音符码)
	jnz	sing		;取到的音符码是否为零?
	clr	tr0		;是,则不发音
	jmp	d1
sing:	dec	a		;取到的音符码减1(不含0).
	mov	22h,a		;存入(22H).
	rl	a		;乘2
	mov	dptr,#table1	;至table1取相对的高位字节计数值
	movc	a,@a+dptr
	mov	th0,a		;取到的高位字节存入TH0
	mov	21h,a		;取到的高位字节存入(21H)
	mov	a,22h		;再载入取的的音符码
	rl	a		;乘2
	inc	a		;加1
	movc	a,@a+dptr	;至table1取相对的低位字节计数值
	mov	tl0,a		;取到的高位字节存入TL0  
	mov	20h,a           ;取到的高位字节存入(20H)
	setb	tr0		;启动timer0
d1:	call	delay		;基本单位时间1/4拍187毫秒
	inc	30h		;取简谱码指针加1
	jmp	next		;取下一个码
end0:	clr	tr0		;停止timer0
	jmp	checkkey		;重复循环

tim0:
	push	acc		;将A的值暂存于堆栈
	push	psw		;将psw的值暂存于堆栈
	mov	tl0,20h		;重设计数值
	mov	th0,21h
	cpl	BUZZER		;将蜂鸣器反相
	pop	psw		;至堆栈取回psw的值
	pop	acc		;至堆栈取回a的值
	reti			;返回主程序

delay:	mov	r7,#02h		;187毫秒
d2:	mov	r4,#187
d3:	mov	r3,#248
	djnz	r3,$
	djnz	r4,d3
	djnz	r7,d2
	djnz	r5,delay	;决定节拍
	ret
KEY: LCALL KS
     JNZ K1
	  ljmp	key_exit
K1:  LCALL delay4ms
     LCALL delay4ms
     LCALL KS
     JNZ K2
	  ljmp	key_exit
K2:	MOV R2,#0EFH
     MOV R4,#00H
K3:	MOV P1,R2
L6:	JB P1.0,L1 
     MOV A,#00H
     AJMP LK
L1:	JB P1.1,L2
     MOV A,#04H
     AJMP LK
L2: JB P1.2,L3              
     MOV A,#08H
     AJMP LK
L3:	JB P1.3,NEXT1
     MOV A,#0cH
LK:	ADD A,R4
		mov	34h,a
K4:	;LCALL delay4ms
;		lcall display
;     LCALL KS
;     JNZ K4
     RET
     
NEXT1:
    INC  R4
    MOV A,R2
    JNB ACC.7,key_exit
    RL A
    MOV R2,A
    AJMP K3
key_exit:
		mov a,#0ffh
		ret

KS:	MOV P1,#0FH
     MOV A,P1
     XRL A,#0FH
     RET
delay4ms:						;4ms
      MOV R5,#08H
L7:	MOV R6,#0FAH
L8:	DJNZ R6,L8
     DJNZ R5,L7
     RET

table1:
	dw	64260,64400,64524,64580
	dw	64684,64777,64820,64898
	dw	64968,65030,65058,65110
	dw	65157,65178,65217

table:
	;1
	db	82h,01h,81h,94h,84h,0b4h,0a4h,04h,82h,01h,81h,94h,84h,0c4h,0b4h,04h
	;2
	db	82h,01h,81h,0f4h,0d4h,0b4h,0a4h,94h,0e2h,01h,0e1h,0d4h,0b4h,0c4h,0b4h,04h
	;3
	db	82h,01h,81h,94h,84h,0b4h,0a4h,04h,82h,01h,81h,94h,84h,0c4h,0b4h,04h
	;4
	db	82h,01h,81h,0f4h,0d4h,0b4h,0a4h,94h,0e2h,01h,0e1h,0d4h,0b4h,0c4h,0b4h,04h,00
	end
															

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -