Frequently Asked Questions
How does one map a variable to an I/O port?
Two methods are as follows:
#byte PORTB = 6
#define ALL_OUT 0
#define ALL_IN 0xff
main() {
int i;
set_tris_b(ALL_OUT);
PORTB = 0; // Set all pins low
for(i=0;i<=127;++i) // Quickly count from 0 to 127
PORTB=i; // on the I/O port pin
set_tris_b(ALL_IN);
i = PORTB; // i now contains the portb value.
}
Remember when using the #BYTE, the created variable is treated like memory. You must maintain the tri-state control registers yourself via the SET_TRIS_X function.
Following is an example of placing a structure on an I/O port:
struct port_b_layout {int data:4; int rw:1; int cd:1; int enable:1; int reset:1; };
struct port_b_layout port_b;
#byte port_b = 6
struct port_b_layout const INIT_1 = {0, 1,1,1,1};
struct port_b_layout const INIT_2 = {3, 1,1,1,0};
struct port_b_layout const INIT_3 = {0, 0,0,0,0};
struct port_b_layout const FOR_SEND = {0,0,0,0,0}; // All outputs
struct port_b_layout const FOR_READ = {15,0,0,0,0}; // Data is an input
main() {
int x;
set_tris_b((int)FOR_SEND); // The constant structure is
// treated like a byte and
// is used to set the data direction
port_b = INIT_1;
delay_us(25);
port_b = INIT_2; // These constant structures
delay_us(25); // are used to set all fields
port_b = INIT_3; // on the port with a single command
set_tris_b((int)FOR_READ);
port_b.rw=0; // Here the individual
port_b.cd=1; // fields are accessed
port_b.enable=0; // independently.
x = port_b.data;
port_b.enable=0;
}





