;16键电子琴,喇叭p33键盘p1可以任意弹奏音乐 ;*************************************************************************** ;* sxj1974@163.com (51c51 test web) www.8951.com * ;* Create by :石学军 www.51c51.com 更多例程请登陆网站 * ;*************************************************************************** ORG 0000H JMP START ;到主程序 ORG 000BH ;中断入口 jmp tim0 ; START: MOV TMOD,#01H ;设定定时器工作方式 1 MOV IE,#82H ;中断使能 setb tr0 ;启动time0 l1:call key ;调用key clr ea ;中断屏蔽 jb f0,l1 ;没有按那么f0=1否则=0 mov a,22h ;如果按了取码指针存入a rl a ;乘2 MOV DPTR,#table ;表头地址送DPTR 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 ;查表取代码 mov tl0,a ; 低字节存入tl0 mov 20h,a ;再存入20h l2: call key ;调用按键处理 setb ea ;中断使能 jb f0,l1 ;有按否 jmp l2 ;有则跳到l2
key:setb f0 ;f0=1 mov r3,#0f7h ;扫描初值 mov r1,#00h ;取码指针初值 l3:mov a,r3 ;载入扫描指针 mov p1,a ;输入至P2,开始扫描 mov a,p1 ;读入P2 clr c cpl c ;令C=1 mov r5,#04h ;检测P27~24 l4:rlc a ;左移一位 jnc keyin ;检测行C=0 inc r1 ;没有则取码指针加1; djnz r5,l4 ;4列检测完毕? mov a,r3 ;载入扫描指针 clr c cpl c ;C=1 rrc a ;扫描下一行 mov r3,a ;存回R3扫描指针寄存器 jc l3 ;C=0表示扫描完毕 ret keyin: mov 22h,r1 ;取码指针存入22H clr f0 ;令F0=0 ret tim0:push acc ;将A的值暂存于堆栈 push psw ;将PSW的值暂存于堆栈 mov tl0,20h ;重设计数值 mov th0,21h cpl p3.3 ;将P3.3取反 pop psw ;至堆栈取回PSW的值 pop acc ; 至堆栈取回A的值 reti ;返回主程序 table: dw 64021,64103,64260,64400 dw 64524,64580,64684,64777 dw 64820,64898,64968,65030 dw 65058,65110,65157,65178 end
|
|