以16位数字

时间:2018-02-04 05:49:09

标签: algorithm assembly microcontroller bit 8051

我正在使用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

1 个答案:

答案 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