基于单片机的带存储的电子琴
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的带存储的电子琴
org00hsjmpmainorg0bh
ljmptime0;定时器0中断服务程序org1bh
ljmptime1;定时器1中断服务程序org30hmain:movsp,#5fhmov9h,#0mov0ah,#0
movdptr,#1000hmovtmod,#11hmovie,#8ahloop:clrtr0clrtr1aaa:jbp3.3,loop5mova,#0mo vx@dptr,a
lcalldelay1jnbp3.3,$lcalldelay1
ljmpsing0loop5:jbp3.2,loop4lcalldelay1jnbp3.2,$lcalldelay1
ljmpsing0loop4:clrp3.1movr0,#4movr3,#11101111bmovr2,#11111111bnline:mova,r3mov p1,amova,p1orla,#0f0h
cjnea,#0ffh,keyinmova,r3rlamovr3,a
djnzr0,nlineljmploopkeyin:movr2,a
lcalldelay1lcalltranf;存储器6264首地址
;预设定时器0和定时器1的工作方式为1;上开中断t0、t1;第一关中断t0;第一关中断t1;未按键转回
;按了键则转\写入6264中,以表示结束音乐;消除按键抖动;转复奏音乐
;未按键转回读取按键;消解按键晃动;Balaghat疏音乐;疏音乐指示灯暗;读取键盘子程序;推论有没有按键,存有则转无按键稳步读取
将扫描码转成按键码
;;anla,#0fh;屏蔽低四位swapa;半字节重新排列
mov09h,a;存放于09h单元中swapa;09h为音符码节拍工作cjnea,#0,zzz;音符码不为0的则转
clrtr1;为0则第一关中断1,不发出声音setbtr0;上开中断
0ljmpzzzzzzz:decamov22h,aclrcrlcapushdphpushdpl
movdptr,#table1movca,@a+dptr
movth1,amov21h,amova,22hclrcrlca
incamovca,@a+dptrpopdplpopdphmovtl1,amov20h,a
movth0,#0a4hmovtl0,#0h
setbtr0setbtr1zzzz:lcallnopenclrtr0clrtr1mova,0ahclrcrrcaclrcrrcaclrcrrca
cjnea,#0fh,nodesjmpdddnode:jcddd
;到table1取相应的高字节值;高字节值存入th0和21h;取低字节并存在tl0和
22h;1/32节拍初值;开中断0;开中断1
;等候按键放宽;第一关中断t0;第一关中断t1
movx@dptr,a;写6264lcalldelay1;延时151msincdptrljmploop
delay1:movr7,#3movr6,#0s1:djnzr6,$djnzr7,s1ret
nopen:mova,p1orla,#0f0hcjnea,#0ffh,nopenlcalldelay1ret
tranf:movb,#0mova,r2c1:rrcajncc2incbincbincbincbljmpc1c2:mova,r3rrarrarrarrac3 :rrcajncc4incbljmpc3
c4:mova,bret
time0:inc0ahmovth0,#0a4hmovtl0,#0hreti
sing0:setbp3.1;延时15ms;等待键盘按键盘放开;消除键盘抖动;将扫描码转换成按键盘子程序;(a)=(b)为按键码;按键盘时间长短,中断服务程序重载初值;复奏时指示灯灭
;next:movdptr,#1000h;至片外rom身侧简码指针nextx:movxa,@dptrpushdphpushdpl
movr2,a;取到的简码暂存于r2中jzendf;取到\则结束anla,#0fh;否,取低四位节拍码movr5,a;将节拍码存于r5中mova,r2;取高4位简符码swapaanla,#0fh
jnzsingclrtr1sjmpdly1sing:decamov22h,a
rlamovdptr,#table1movca,@a+dptr
movth1,amov21h,amova,22hrla
incamovca,@a+dptrmovtl1,amov20h,asetbtr1dly1:incr5acalldelay
popdplpopdphincdptr
sjmpnextxendf:clrtr1clrtr0
ljmpmaintime1:pushaccpushpsw
movtl1,20hmovth1,21h
cplp3.0poppswpopacc
;取到的是非0,则转向sing子程序;取到0则不发声;到table1取高字节计数值;高字节存入th0和21h;取低字节并存入tl0和20h;基本单元时间为1/4拍187s;取下一个码;停止定时器;循环
;定时器1中断服务程序重装计数器;发音;reti
delay:movr7,#187;187ms延时子程序
dly2:movr4,#02dly3:movr3,#248djnzr3,$djnzr4,dly3djnzr7,dly2djnzr5,delayret
table1:
dw63628,63835,64021,64103,64260,64400,64524dw64580,64684,64777,64820,64898,649 68,65030dw65058,65110,65157,65178,65217,65252,65283end。