STC单片机电子琴如何做力度运算

2019-07-15 08:54发布

各位好!

我是新手,请大家多关照,最近想设计一台用STC单片机做的61键无线蓝牙电子琴,用现成的廉价电子琴来改装,打算直接扫描16X8行列的状态加以处理,这部分程序已经写好测试妥当了(附程序),由于这是一个有力度感的键盘,一个键有2个触点,通过测定触点的接触时间差计算出速度而换算为力度,原理是很简单,但实施起来很困难,怎样也想不通,所以特地来请教各位高手,原理是:运行单片机内的计时器(向上),当检测到第一个接触点时,读取定时器数值存入相应的记忆1,等检测到第二个接触点时, 再读取定时器数值存入相应的记忆2,两个数字的差就是力度了。硬件上的设计确定一个琴键按下时,第一触点一定比第二触点快,所以记忆2的数值一定比记忆1的数值大,问题在于计数器溢出时就会是记忆2的数值一定比记忆1的数值小了,更大的问题是如果时间再长些,记忆2的数值又会比记忆1的数值大,变成无法分析而确定的难题了。不知道各位是否看过这方面的文献介绍过解决这问题的方法,现实是有力度的电子琴满街都在卖,厂家肯定已经解决问题了,就是我这新手笨,想不通,特来请教大家。

SCANNER:
;CPL P1.2
SCANP2:              ; SHIFT P2 AND READ P0
MOV 32H, #8          ;8 BITS TO SHIFT
MOV 30H, #11111111B  ;THIS BYTE FOR SHIFT AND OUTPUT TO P2
MOV 35H, #0          ;THIS WILL ADD TO ROW TO MAKE 0-7
CLR C
SCANP2A:
MOV A, 30H
RRC A
MOV 30H, A
MOV P2, A            ;P2 ONE ROW LOW
LCALL DELAY4         ;MUST WAIT STABLE
MOV A, P0            ;READ FROM P0
CPL A
JZ SCANNEXT1           ;NO KEY PRESS FOUND, READP1
LCALL STOREDATA
SCANNEXT1:
;LCALL DELAY2
DJNZ 32H, SCANP2A
MOV P2, #11111111B   ;END OF SCANP2
;JMP SCANNER

SCANP3:              ; SHIFT P3 AND READ P0
MOV 32H, #8          ;8 BITS TO SHIFT
MOV 30H, #11111111B  ;THIS BYTE FOR SHIFT AND OUTPUT TO P2
MOV 35H, #8          ;THIS WILL ADD TO ROW TO MAKE 0-7
CLR C
SCANP3A:
MOV A, 30H
RRC A
MOV 30H, A
MOV P3, A            ;P2 ONE ROW LOW
LCALL DELAY4         ;MUST WAIT STABLE
MOV A, P0            ;READ FROM P0
CPL A
JZ SCANNEXT2           ;NO KEY PRESS FOUND, READP1
LCALL STOREDATA
SCANNEXT2:
;LCALL DELAY2
DJNZ 32H, SCANP3A
MOV P3, #11111111B   ;END OF SCANP
;LCALL DELAY5
JMP SCANNER

STOREDATA:           ;32H CONTAIN ROW NUMBER THAT CAUSE LOW
PUSH PSW
MOV 34H, #8          ;8 BIT TO SHIFT
MOV 33H, A           ;A CONTAIN 8BITS WITH FEW HIGH(CAUSE BY KEYPRESS)
STOREDATA1:
MOV A, 33H
;MOV P0, A
CLR C
RLC A
MOV 33H, A
JNC NEXTBIT ;NOT PRESSED
LCALL COUNTPOSItiON
LCALL KEYMAP
;LCALL SENTONEBYTE2
NEXTBIT:
DJNZ 34H, STOREDATA1

POP PSW
RET

KEYMAP:
MOV DPH, #10H
MOV DPL, #00H
MOVC A,@A+DPTR
RET

COUNTPOSITION:
;ROWxCOLxCOL
PUSH PSW
MOV A, 32H        ;1-8
ADD A, 35H        ;+0=old or +8=16LEFT8(0-7) SO 1=16
MOV 37H, A
MOV A, #0
COUNT1:
ADD A, #8
DJNZ 37H, COUNT1  ;A WILL BE 8,16,24,32,40.......128
CLR C
SUBB A, #8        ;MAKE A 0-120
ADD A, 34H        ;(1-8)  A=1 TO 128
DEC A             ;MAKE 0-127 SYSTEM
POP PSW
RET
0条回答

一周热门 更多>