assembly - 使用定时器在正确的时间发送和接收保证位 - 8051
问题描述
不知道如何写标题,但这是我的问题。
我正在制作激光标签,目前每件背心都有多个生命值。在代码中,我称之为流。
我想做的是在玩游戏时:
每件背心都会扫描其流或命中点,以查看是否即将开始尝试射击。一旦检测到镜头的第一位,则暂停流扫描,直到镜头的所有位都已到达。然后用另一个常数值扫描该值,以确定镜头是否合法,或者是否有一些噪音进入系统,在这种情况下,镜头无效并被忽略。
每件背心都会有一个功能,从 1 到最大玩家数量不断地遍历每个数字。就我个人而言,我不在乎数字是前进还是后退或以任何方式,只要每个球员的数字都得到持续处理。
外部引脚将定义玩家何时准备好投篮。在函数将号码设置为同一玩家之前,不会发生击球(传输)。然后所有数据一次全部传输出去,然后拍摄完成。
到目前为止,这是我的代码:
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 进行数据交换。
我可以在我的代码中做些什么来解决这个问题?
解决方案
推荐阅读
- java - 反序列化 JSON 请求中包含许多对象的列表期间的性能问题
- r - conda 创建 R 环境
- python - ValueError:对象类型没有名为 1 的轴
- reactjs - event.target.value 句柄为 ENUM
- wordpress - 切换菜单按钮被链接标签包裹
- mysql - 查找与特定优惠券关联的所有订单
- android - Android:在列表视图中禁用元素上的 scolling
- android - 具有水平对齐和自动调整大小的 ConstraintLayout、TextView 和 ImageView
- python - python中多重继承的调用过程
- apache-spark - 结构化流式多水印