返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 论坛

;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:dw64021,64103,64260,64400
dw 64524,64580,64684,64777
dw 64820,64898,64968,65030
dw 65058,65110,65157,65178
end

hex格式文件下载(点右键,目标另存为hex即可直接烧写)