?? keymusic.asm
字號:
;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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -