我制作了一个新的存储器模块电路,最终用于通用读取和写入板载存储器。我想要使用的是一个芯片,我用不同的编程器编程,但该编程器将不同的位视为芯片上的第一位。我想以最有效的方式做的是在8051中编写解码另一个芯片的代码。
存储器模块接受两个字节,两个移位寄存器中一次两个字节,最高有效位优先。
每次设置和复位时钟,两位都会自动移位到芯片上。
这是我的代码,其中的注释说明了用于映射内存的公式:
; user requests address of HighByte * 256 + LowByte
mov A,HighByte ; Access user high byte
mov C,ACC.6 ; take 6th bit (which is really bit 14)
mov HighBitAddress,C ;and set it up for shifting in high-byte register
mov A,LowByte ; Access user low byte
mov C,ACC.4 ; take 6th bit (which is really bit 4)
mov LowBitAddress,C ;and set it up for shifting in low-byte register
setb Clock
clr Clock ;at this point, High-byte register contains value of user bit 14
;and Low-byte register contains value of user bit 4
这个过程几乎重复了。唯一经常变化的是累加器和进位的值。
mov A,??? ;=HighByte if next bit to load is > 8 or value is LowByte
mov C,ACC.??? ; If A=HighByte, subtract 8 from wanted bit. Value can be 0 through 7.
mov HighBitAddress,C ;and set it up for shifting in high-byte register
mov A,??? ;=HighByte if next bit to load is > 8 or value is LowByte
mov C,ACC.??? ; If A=HighByte, subtract 8 from wanted bit. Value can be 0 through 7.
mov LowBitAddress,C ;and set it up for shifting in low-byte register
setb Clock
clr Clock
代码再重复6次。
这段代码的疯狂之处在于我需要使用8行代码来处理两个字节。我更喜欢在代码存储器中创建定义的地图并访问它,但我不知道如何从中访问位。只有整个字节。
没有推荐疯狂长码的任何想法?
更新
这就是我想要解决的问题。我希望有一个预定义位数组,以便处理简单。
对于整个字节,我可以使用如下代码逐个加载字节:
mov dptr,#mydata
byteloop:
clr A
movc A,@A+DPTR
inc dptr
;byte is stored in accumulator for processing
jnz byteloop
mydata:
db 'F','C','B','A','E','D',0h
这就是我想要实现的目标:
mov A,#5Ch ;our binary value in accumulator is 01011100
mov dptr,#mydata
byteloop:
movcb R1,@DPTR ;get value at DPTR
mov C,@R1 ;get bit value
inc dptr
;bit is stored
jnz byteloop
mydata:
db ACC.7,ACC.3,ACC.2,ACC.5,ACC.1,ACC.0,0h
在上面的例子中,在"位存储的位置"到达时,C(进位标志)的返回值为0,1,1,0,0和0,因为它们是位于位7,位3,位2,位5,位1的值,分别为累加器的第0位。如果我想更改接收的位的顺序或我想要接收的位,我可以修改DB行。
如何使用正确的命令正确地实现上述代码,而不会让我的代码看起来很混乱?