我正在制作lazer标签,目前每件背心都有多个生命值。在代码中,我称之为流。
-
每件背心都会扫描其流或生命点,以查看是否即将开始尝试射击。一旦检测到快照的第一位,则暂停流扫描,直到快照的所有位都已到达。然后用另一个常量值扫描该值,以确定放炮是否合法,或者是否有噪声进入系统,在这种情况下,放炮无效且被忽略。
-
每件背心都有一个功能,可以不断地通过从1到最大玩家数的每个数字。就我个人而言,我不在乎数字是向前还是向后,或者以任何方式,只要每个球员的数字是在一个恒定的基础上处理的。
-
一个外部pin将定义玩家何时准备好投篮。只有在函数将数字设置为同一玩家时,才能进行放炮(传输)。然后所有数据一次全部传输出去,然后拍摄完成。
TXDP equ P3.1 ;pin to output data on
LCTR equ 30h ;data selector counter
MYDATA equ 31h ;data to send out
LI1 equ P3.5 ;bit to select data
LI2 equ P3.5 ;bit to select data
timer_interrupt:
;Save registers
push ACC
push PSW
;R7 = player# from 1 to MAX
djnz R7,notstart
mov R7,#MAX
notstart:
;Send out my data one bit at a time
;if current player number is me
cjne R7,#ME,notme
mov A,MYDATA
jz nodato
;As data is sent, 0's fill in and MYDATA eventually becomes 0.
clr C
rrc A
mov MYDATA,A
mov TXDP,C
nodato:
notme:
;Start the receiving process if flag is set
jnb STARTB,rcvst
;?? something needs to go here ??
clr STARTB
;?? and here ??
sjmp exittimer
rcvst:
;At this point we move on to the next stream
acall selectnextstream
;And see if there is incoming data
jb RCVP,norcv
;there is, so set the flag
setb STARTB
norcv:
exittimer:
;restore registers
pop PSW
pop ACC
reti
selectnextstream:
inc LCTR
mov A,LCTR
rrc A
mov LI1,C
rrc A
mov LI2,C
ret
而我最大的问题是让#3成功运作。
我不能一次拍两张或更多的照片,因为这会把接收机搞得一团糟。
另外,我使用大量位进行数据I/O的原因是因为我想创建数据保证。最好的定义方法更像是按键去抖动(如果你按下一个按钮,这个值直到很长一段时间后才会被识别)。
01111110
对于接收端,期望以下任一值符合接收到的有效放炮:
00011000
00111100
01111110
但这些都是例子。
另外,由于激光的速度限制,我不能使用UART进行数据交换。
我可以在代码中做些什么来解决这个问题?