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; }