我正在使用8051微控制器,并找到了一种更好的方法将数据传输到移位寄存器。到目前为止,我使用位冲击技术从最高位开始一次一位地移位位。新方法是通过硬件串口完成的,但我了解到数据从最低有效位(完全相反的方向)开始移出。
为了遵守,我将不得不重新安排我的数据。目前,所讨论的数据大小为16位,我也可能需要转换24位数据。
当我只转换8位大小时,我使用了一个只有256字节的查找表。这是我可用代码空间的1/16,因为我把所有代码都塞进了AT89C4051 micro。
如果我尝试使用16位大小,我可能会超过限制,因为256次256等于65K(查询表需要多大?)
所以我正在寻找一种高速算法来完成这项工作。
这是我到目前为止在8051代码中提出的内容,我认为它有点太慢而且难以维护但似乎可以完成这项工作:
;DPTR = 16-bit number to convert
mov R7,#10h ;16 bits
nextbit:
mov A,DPH
rrc A
mov DPH,A
mov A,DPL
rrc A
mov DPL,A
mov A,R2
rlc A
mov R2,A
mov A,R3
rlc A
mov R3,A
djnz R7,nextbit
mov DPH,R3
mov DPL,R2
有人能指出更快的代码,甚至是更好的算法我可以使用而不是逐位移入和移出位吗?
从视觉上看,这就是我试图对二进制位进行排序的方法。假设“a”需要从16位数中的最低位位置到最高位位置,并且“b”需要从第2个最低位位置变为第2个最高位,依此类推。这是一个例子:
ponmlkji:hgfedcba -> abcdefgh:ijklmnop
答案 0 :(得分:3)
至少你可以在每次循环迭代中传输两个位,这就是循环计数的一半:
mov R7,#8
nextbit:
mov A,DPH
rrc A
mov DPH,A
mov A,R2 ;R2 will become the lowbyte of the result
rlc A
mov R2,A
mov A,DPL
rrc A
mov DPL,A
mov A,R3
rlc A
mov R3,A
djnz R7,nextbit
mov DPH,R3
mov DPL,R2
或者查找表包含256个条目(256个字节):
mov R2, DPH
mov A, DPL
mov dptr, LookupTable256
movc a,@a+dptr ;Translate lowbyte into hibyte of result
xch A, R2
movc a,@a+dptr
;lowbyte in a, hibyte in R2
这是一个翻译半字节并使用只有 16 条目的查找表的版本:
mov R2, DPH
mov R3, DPL
mov dptr, LookupTable16
mov a, R3
and a, #0Fh ;=Nibble0
movc a,@a+dptr ;Translate
swap ;swap nibbles
xch A, R3 ; store result nibble 3
swap
and a, #0Fh ;=Nibble1
movc a,@a+dptr ;Translate
orl AR3, A ;R3=Result nibbles 2+3
mov a, R2
and a, #0Fh ;=Nibble2
movc a,@a+dptr ;Translate
swap
xch A, R2 ; store result nibble 1
swap
and a, #0Fh ;=Nibble3
movc a,@a+dptr ;Translate
orl A, R2 ;A=Result nibbles 0+1