?? th21_電子琴.asm
字號(hào):
;電子琴 -----------連續(xù)型 查詢式鍵盤
;P3.2(RXD) 接揚(yáng)聲器
;P1 鍵盤讀入口 查詢式
Pulse equ 10h ;脈沖
PulseCNT equ 50h ;脈沖計(jì)數(shù)
ToneHigh equ 40h ;高音調(diào)
ToneLow equ 41h ;低音調(diào)
Tone equ 42h ;音調(diào)
KeyBuf equ 54h
Speaker BIT P3.2
ORG 0000H
ljmp Start
org 000bh
LJMP Timer0Int
ORG 0030H
Timer0Int: ;定時(shí)中斷
push PSW
clr TR0
mov TH0, ToneHigh
mov TL0, ToneLow
setb TR0
mov C, Pulse
MOV Speaker,C
CPL Pulse
pop PSW
reti
ToneTable:
DW 64578,64686,64778,64821
DW 64898,64968,65029
TestKey:
MOV P1, #0FFH
MOV A, P1
CPL A ; 讀入鍵狀態(tài)
ret
KeyTable:DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH ; 鍵碼定義
GETKEY:
MOV R6,#10
ACALL DELAY
MOV A,P1
CJNE A,#0FFH,K01 ;確有鍵按下
LJMP MLOOP
K01: MOV R3,#8 ;8個(gè)鍵
MOV R2,#0 ;鍵碼
MOV B,A ;暫存鍵值
MOV DPTR,#KeyTable
K02: MOV A,R2
MOVC A,@A+DPTR ;從鍵值表中取鍵值
CJNE A,B,K04 ;鍵值比較
MOV A,R2 ;得鍵碼
INC A
RET
K04: INC R2 ;不相等,到繼續(xù)訪問鍵值表
DJNZ R3,K02
MOV A,#0FFH ;鍵值不在鍵值中,即多鍵同時(shí)按下
LJMP MLOOP
Delay: ; 延時(shí)子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, Delay
ret
;#########################
Start:
mov sp, #70h
mov TMOD, #01 ; Timer
mov IE, #82h ; EA=1, IT0 = 1
mov Tone,#0
MLoop:
call TestKey
jz MLoop
call GetKey
mov b, a
jz MLoop ; = 0, < 1
anl a, #8
jnz MLoop ; > 8
dec b
mov a, b
rl a ; a = a*2
mov b, a
mov dptr, #ToneTable
movc a, @a+dptr
mov ToneHigh, a
mov TH0, a
mov a, b
inc a
movc a, @a+dptr
mov ToneLow, a
mov TL0, a
SETB TR0
MOV P1,#0FFH
WAIT:
MOV A,P1
CJNE A,#0FFH, WAIT
MOV R6,#10
ACALL DELAY
CLR TR0
LJMP MLOOP
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -