📄 th33.asm
字号:
;电子琴
mode equ 082h
PORTA equ 7FFCh
CTL equ 7FFFh
;P1 键盘读入口
Pulse equ 55h ;脉冲
PulseCNT equ 50h ;脉冲计数
ToneHigh equ 51h ;高音调
ToneLow equ 52h ;低音调
Tone equ 53h ;音调
KeyBuf equ 54h
Speaker equ PORTA
ljmp Start
org 000bh
Timer0Int: ;定时中断
push PSW
clr TR0
mov TH0, ToneHigh
mov TL0, ToneLow
setb TR0
mov a, Pulse
mov dptr, #Speaker
movx @dptr,a
inc Pulse
dec PulseCNT
pop PSW
reti
ToneTable:
;dw 64100, 64220, 64340, 64460
;DW 64580, 64700, 64800
DW 64021 64103 64260 64400 64524
DW 64580 64684 64777 64820 64898 64968
DW 65030 65058 65110 65157 65178
TestKey:
MOV P1, #0FH
MOV A, P1
; 读入键状态
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable:DB 0EEH,0DEH,0BEH,07EH
DB 0EDH,0DDH,0BDH,07DH
DB 0EBH,0DBH,0BBH,07BH
DB 0EFH,0D7H,0B7H,077H ; 键码定义
GetKey:
MOV R6,#10
ACALL DELAY
MOV P1, #0FH
MOV A, P1
CJNE A, #0FH, K12
LJMP MLOOP
K12: MOV B,A
MOV P1, #0EFH ;
MOV A, P1
CJNE A, #0EFH,K13 ;
MOV P1, #0DFH
MOV A, P1
CJNE A, #0DFH,K13 ;
MOV P1, #0BFH
MOV A, P1
CJNE A, #0BFH,K13;
MOV P1, #7FH
MOV A, P1
CJNE A, #7FH, K13;
LJMP MLOOP
K13: ANL A, #0F0H;
ORL A, B
MOV B, A
MOV R1, #16
MOV R2, #0
MOV DPTR,#KEYTABLE
K14: MOV A, R2
MOVC A, @A+DPTR
CJNE A, B, K16
MOV P1, #0FH;
K15: MOV A, P1
CJNE A, #0FH, K15;
MOV R6, #10
ACALL DELAY
MOV A, R2
RET
K16: INC R2 ;
DJNZ R1, K14
LJMP MLOOP
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, Delay
ret
;#########################
Start:
mov sp, #70h
mov a, #mode
mov dptr,#CTL
movx @dptr,a
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 ; > 7
;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 PulseCNT, #150
Wait:
mov a,PulseCNT
DEC A
jnz Wait
clr TR0
ljmp MLoop
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -