📄 keyqing.s43
字号:
; 12个按键用做电子琴的输入
; 1,2,3,4,5,6,7作为一个八度音阶
;
#include "msp430x13x.h"
RSEG CSTACK ; System stack
DS 0
RSEG CODE ; Program code 的开始
PUBLIC
Reset mov #SFE(CSTACK),SP ;
SetupWDT mov #WDTPW+WDTHOLD,&WDTCTL ;
SetupTA mov #TASSEL1+TACLR,&TACTL ; SMCLK, Clear TAR
SetupC0 mov #CCIE,&CCTL0 ; 使能CCR0 中断
mov #100,&CCR0 ;
SetupP1 bis #MC1,&TACTL ; 定时器工作在连续模式
MOV.B #0FH,&P1DIR
MOV.B #0FH, &P1OUT
MOV.B #0,&P1IES
MOV.B #70H,P1IE
MOV.B #8,&P4DIR
MOV.B #0FH,&230H
eint ; 开中断
Mainloop bis #LPM1,SR ; 低功耗模式
;---------------------------------------------------------------------------
TA0_isr XOR.B #08H,&P4OUT
add &220H,&CCR0
RETI
P1KEY CALL #KEYJUDGE
JNC P1KEYEND
CALL #DELAY10M
CALL #KEYJUDGE
JNC P1KEYEND
CALL #KEYCODE
RLA R9 ; R9*2
MOV.w F_TAB(R9),&220H ; 查表得到某音的频率数值
; BIS #CCIE,&CCTL0
; ............
P1KEY1 CALL #KEYJUDGE ; 等待按键松开
NOP
MOV.B #0,&P1IFG
MOV.B #0,&P1IE
JC P1KEY1
;.............
MOV.B #70H,&P1IE
; BIC #CCIE,&CCTL0
MOV.B #0FH,&230H
P1KEYEND MOV.B #0FH,&P1OUT
MOV.B #0,&P1IFG
RETI
DELAY10M MOV #300H,R15
DELAY10M1 DEC R15
JNZ DELAY10M1
RET
KEYCODE MOV.B #0,&P5DIR
MOV.B #0FH,&P1DIR ;低4位作为扫描线行输出,高3位作为列线读入
MOV #0,R9
MOV #1,R8
KEYCODELOOP MOV.B R8,&P1OUT ;R8为扫描信号的输出
BIT.B #10H,&P1IN
JC KEYCODE1 ;测试P1.4
BIT.B #20H,&P1IN
JC KEYCODE2 ;测试P1.5
BIT.B #40H,&P1IN
JC KEYCODE3 ;测试P1.6
RLA.B R8
ADD.B #3,R9
CMP.B #12,R9 ;4根行线扫描完了吗
JNZ KEYCODELOOP
KEYCODE1 ADD #0,R9
RET
KEYCODE2 ADD #1,R9
RET
KEYCODE3 ADD #2,R9
RET
KEYJUDGE MOV.B #0FFH,&P1DIR
MOV.B #0,&P1OUT
MOV.B #0FH,&P1DIR
MOV.B #0FH,&P1OUT
BIT.B #070H,&P1IN ; 测试3根列线是否为1,是否有按健
RET ; 若有,C=1
F_TAB DW 0EEFH, 0D4EH, 0BDAH
DW 0B30H, 09F8H, 08E1H, 07E9H
DW 0778H, 06A7H, 05EDH
DW 0598H, 04FCH, 0471H, 03F5H
DW 03BCH ,0354H, 02F7H
DW 02CCH, 027EH, 0239H, 01F8H
COMMON INTVEC ; Interrupt vectors
ORG PORT1_VECTOR
DW P1KEY
ORG TIMERA0_VECTOR
DW TA0_isr
ORG RESET_VECTOR
DW Reset
;---------------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -