MEL PICBASIC Forum - Bits, Bytes Words and Arrays


  • Bits, Bytes Words and Arrays

    1. How can I reference a BIT in a BYTE?
    2. How can I reference a BIT in a WORD?
    3. How can I reference a BIT in a BYTE ARRAY?
    4. How can I reference a BIT in a WORD ARRAY?
    5. How can I reference a BYTE in a WORD ARRAY?


    We all know there’s eight Bits in a Byte, and sixteen Bits in a Word. Sometimes however we need to access a Bit in a Byte, or a Word, or in an Array by using an intermediate VARIABLE rather than a constant.


    1. How can I reference a BIT in a BYTE?

    We know that MyByte.0 references Bit 0 of MyByte, all the way up to MyByte.7 referencing Bit 7 of MyByte… but there’s another way of accessing the bits in a Byte (MyVar is a BYTE variable)…

    MyByte.0(MyVar)

    When MyVar is in the range 0-7, it will access Bits 0-7 of MyByte.

    Example to display all eight BITS of a BYTE sequentially, Bit at a time…

    For MyVar=0 to 7
    MyBit=MyByte.0(MyVar)
    LCDOut $FE,1,"Bit ",#MyVar,"=",#MyBit
    Pause 2000
    Next MyVar


    2. How can I reference a BIT in a WORD?

    We know that Myword.0 references Bit 0 of Myword, all the way up to MyWord.15 referencing Bit 15 of MyWord… but there’s another way of accessing the bits in a word (MyVar is a BYTE variable)…

    MyWord.0(MyVar)

    When MyVar is in the range 0-15, it will access Bits 0-15 of MyWord.

    Example to display all sixteen BITS of a WORD sequentially, Bit at a time…

    For MyVar=0 to 15
    MyBit=MyWord.0(MyVar)
    LCDOut $FE,1,"Bit ",#MyVar,"=",MyBit
    Pause 2000
    Next MyVar


    3. How can I reference a BIT in a BYTE ARRAY?

    Arrays are arranged in memory in BIT ORDER from the LEAST SIGNIFICANT BIT of the first Byte at the bottom end, to the MOST SIGNIFICANT BIT of the last Byte at the top end. Consider this…

    MyByteArray var BYTE [40]

    There are 40 Bytes in this array (0-39), each with eight Bits. That means this array has a total of 320 Bits (numbered 0-319 sequentially). All the Bits in this Byte Array can be referenced individually like so…

    MyByteArray.0(MyVar)

    Where MyVar in this instance is a WORD (because there’s more than 256 Bits in the array). When…

    MyVar=0 it references Bit 0 of MyByteArray(0)
    MyVar=7 it references Bit 7 of MyByteArray(0)
    MyVar=8 it references Bit 0 of MyByteArray(1)
    MyVar=15 it references Bit 7 of MyByteArray(1)
    All the way, when…
    MyVar=312 it references Bit 0 of MyByteArray(39)
    MyVar=319 it references Bit 7 of MyByteArray(39)

    If MyVar was a BYTE rather than a WORD, you will only be able to access Bits 0-255.


    4. How can I reference a BIT in a WORD ARRAY?

    Just like the Byte Arrays, Word Arrays are arranged in memory in BIT ORDER from the LEAST SIGNIFICANT BIT of the first Word at the bottom end, to the MOST SIGNIFICANT BIT of the last Word at the top end. Consider this…

    MyWordArray var WORD [25]

    There are 25 WORDS in this array (0-24), each with sixteen Bits. That means this array has a total of 400 Bits (numbered 0-399 sequentially). All the Bits in this Byte Array can be referenced individually like so…

    MyWordArray.0(MyVar)

    Where MyVar in this instance is a WORD (because there’s more than 256 Bits in the array). When…

    MyVar=0 it references Bit 0 of MyWordArray(0)
    MyVar=15 it references Bit 15 of MyWordArray(0)
    MyVar=16 it references Bit 0 of MyWordArray(1)
    MyVar=31 it references Bit 15 of MyWordArray(1)
    All the way, when…
    MyVar=384 it references Bit 0 of MyWordArray(24)
    MyVar=399 it references Bit 15 of MyWordArray(24)

    If MyVar was a BYTE rather than a WORD, you will only be able to access Bits 0-255.


    5. How can I reference a BYTE in a WORD ARRAY?

    As can be previously seen, all the bits in an array are stored sequentially in memory. It follows that the BYTES in a WORD ARRAY also follow sequentially. This means we can easily extract any BYTE we want to out of a WORD Array in a similar manner. Consider again…

    MyWordArray var WORD [25]

    There are actually 50 Bytes in this array (0-49). The first byte (0) being the LOWBYTE of MywordArray(0), and the last byte (49) being the HIGHBYTE of MyWordArray(24). Using a similar manner to Bit access, we can access all fifty Bytes of this Word array like so…

    MyWordArray.Lowbyte(MyVar)

    Where MyVar is in the range 0-49 for my previously defined example Array of 25 Words.

    This is really handy, because we can use this method of loading or unloading Word Arrays from EEPROM for example very easily.

    Note that HIGHBYTE cannot be used in this instance, because it cannot access the LowByte of the first array element… ie..

    MyWordArray.HighByte(0)=MywordArray.LowByte(1)
    all the way to…
    MyWordArray.HighByte(48)=MywordArray.LowByte(49)

    More dangerously, MyWordArray.HighByte(49) will actually perform an unauthorised access on an unknown byte OUTSIDE the MyWordArray structure.

    Melanie
    This article was originally published in forum thread: Bits, Bytes Words and Arrays started by Melanie View original post