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

📄 key-led-music-test.asm

📁 89CS51单片机 简单音乐播放器
💻 ASM
字号:
START BIT 01H
PREKEY  BIT 02H
TIMEFLAG BIT 03H
SONGFLAG BIT 04H
KEY_S_FLAG BIT 05H
REPLAYFLAG BIT 06H

OUT EQU P3.5    ;音频信号输出端口    
KEYTEMP EQU 30H
KEYCODE EQU 31H
KEYNUM 	EQU 32H
KEYFLAG EQU 33H
LED1	EQU 34H
LED2	EQU 35H
LED3	EQU 36H
LED4	EQU 37H
LED_SELECT EQU 38H
SONGNUM EQU 39H
RAM_TH0 EQU 40H
RAM_TL0 EQU 41H
NRAM_TH0 EQU 42H
NRAM_TL0 EQU 43H
SONGINDEX EQU 44H
TIMESET   EQU 45H
NTIMESET  EQU 46H
TIMEINC   EQU 47H
SONGADDRH EQU 48H    ;用36H,37H作音乐地址单元  
SONGADDRL EQU 49H
LENADDRH  EQU 50H    ;用38H,39H作节拍地址单元  
LENADDRL  EQU 51H
YINJIE    EQU 52H

ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INT_FRQ
ORG 001BH
LJMP INT_TIME
ORG 0030H
DISPTABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
	   DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0C8H,0BFH
KEYTABLE:  DB 88H,11H,12H,14H,18H,21H,22H,24H,28H
	   DB 41H,42H,44H,48H,81H,82H,84H
SONGCODE:  DB "ABCDEFG1234567"
FCODETAB:  DW 0FC8FH,0FCEFH,0FD36H,0FD74H,0FDB8H,0FDF4H,0FE2DH
	   DW 0FE47H,0FE77H,0FEA2H,0FEB6H,0FEDAH,0FEFAH,0FF17H
SONG1:  DB "1231123134553455565431565431151115110";
LENGTH1:DB "444444444444444422224422224444444444";
SONG2:  DB "12345670"
LENGTH2:DB "1111111"
SONG3:  DB "ABCDEFG1234560"
LENGTH3:DB "2222222222222"
SONG4:  DB "76543217643210"
LENGTH4:DB "3333333333333"

MAIN: 
MOV SP,#52H                  ;设置堆栈地址   
CLR PREKEY
ACALL LEDOFF
MOV SONGINDEX,#00H
CLR F0
CLR SONGFLAG
CLR TIMEFLAG
CLR START


LOOP:                       ;主函数循环部分    
CALL KEY		    ;按键扫描  
JNB F0,LNEXT
ACALL KEYPROC

LNEXT:JNB SONGFLAG,TNEXT     ;选歌部分  
ACALL SECECTSONGADDR
CLR SONGFLAG

TNEXT:JNB TIMEFLAG,DNEXT    ;音乐处理部分  
ACALL MUSICPROC
JB REPLAYFLAG,SNEXT
CLR TIMEFLAG

SNEXT:JNB START,DNEXT        ;定时器初始化   
ACALL INT_INIT
CLR REPLAYFLAG
CLR START

DNEXT:                      ;延时  
ACALL REKEYTIME
AJMP LOOP                   ;返回  

INT_INIT:
MOV TH0,NRAM_TH0
MOV TL0,NRAM_TL0
MOV TIMESET,NTIMESET
MOV TIMEINC,#0H
MOV TH1,#015H
MOV TL1,#0A0H
MOV TMOD,#11H
SETB TR0
SETB ET0
SETB TR1
SETB ET1
SETB EA
RET

INT_FRQ:   ;定时 
CPL OUT
MOV TH0,RAM_TH0
MOV TL0,RAM_TL0
RETI

INT_TIME:   ;60ms中断计数  
MOV TH1,#015H 
MOV TL1,#0A0H
PUSH ACC
INC TIMEINC
MOV A,TIMESET
CJNE A,TIMEINC,INT_RETI     ;若和TIMESET相等,则说明时间到了   
SETB TIMEFLAG      ;通知主程序节拍时间到了   
CPL P0.7
MOV RAM_TH0,NRAM_TH0
MOV RAM_TL0,NRAM_TL0
MOV TIMESET,NTIMESET
MOV TIMEINC,#0
INT_RETI:
POP ACC
RETI

STOPTIMER:
CLR TR0
CLR TR1
RET

DELAY1MS:    ;0.1毫秒延时程序 (
MOV R7,#1
D1:MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET

LEDOFF:
MOV LED1,#0FH
MOV LED2,#0FH
MOV LED3,#0H
MOV LED_SELECT,#07H
RET

LEDON:
MOV LED1,#11H
MOV LED2,#0H
MOV LED_SELECT,#0BH
MOV LED4,SONGINDEX
RET

LEDPAUSE:
MOV LED1,#12H
MOV LED2,#12H
MOV LED3,#12H
MOV LED4,SONGINDEX
MOV LED_SELECT,#0FH
RET

LEDNOS:
MOV LED3,#0H
MOV LED4,#11H
MOV LED_SELECT,#0DH
RET

REKEYTIME:     ;重新按键扫描的延时函数     
MOV R3,#250
RE1:DJNZ R3,RE2
AJMP RE_RET
RE2:ACALL DISPLAY
AJMP RE1
RE_RET:RET

DISPLAY:    ;四位数码管显示函数    它将从指定的缓冲区取数显示    (延时

⌨️ 快捷键说明

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