📄 key-led-music-test.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 + -