Sie sind auf Seite 1von 8

////////////////////////////////////////////////////////////////////// ////////// // // PIC16F877 + SRF08 + LCD03 example // Written October 2005 by Gerald Coe, using HITECH PIC16 compiler

// // Performs ranging using same I2C bus as the LCD03 is using // Note - assumes a 20MHz crystal // // This code is Freeware - Use it for any purpose you like. // ////////////////////////////////////////////////////////////////////// ///////// #include <pic.h> #include <stdio.h> __CONFIG(0x3b32); // configuration register - see PIC data sheet for details #define SRF08_ADDR 0xE0 Factory supplied default address void clrscn(void); prototypes void cursor(char pos); void print(char *p); void setup(void); unsigned int get_srf08(void); char s[21]; // buffer used to hold text to print void main(void) { unsigned int range; // sets up the PIC16F877 I2C port clrscn(); // clears the LCD03 disply cursor(2); // sets cursor to 1st row of LCD03 sprintf(s,"SRF08 Ranger Test"); // text, printed into our buffer print(s); // send it to the LCD03 while(1) { // loop forever range = get_srf08(); // get range from srf08 (round trip flight time in 1uS units) cursor(24); // sets cursor to 2nd row of LCD03 sprintf(s,"Range = %dcm ", range/58);// convert to cm print(s); // send it to the LCD03 cursor(44); // sets cursor to 3rd row of LCD03 setup(); // //

sprintf(s,"Range = %dinch convert to inches print(s); // send it to the LCD03 } } unsigned int get_srf08(void) { unsigned int range;

", range/148);

//

// This 1st part send the ranging command to the SRF08 to start it ranging SEN = 1; // send start bit while(SEN); // and wait for it to clear SSPIF = 0; SSPBUF = SRF08_ADDR; SRF08 I2C address while(!SSPIF); // wait for interrupt SSPIF = 0; // then clear it. SSPBUF = 0; // address of register to write to while(!SSPIF); // SSPIF = 0; // SSPBUF = 82; // range in uS command while(!SSPIF); // SSPIF = 0; // PEN = 1; // send stop bit while(PEN); //

//

// now wait for the ranging to complete. This delay is a little over 100mS but // can be reduced to 66ms if required. TMR1H = 0; // delay while the srf08 is ranging TMR1L = 0; T1CON = 0x31; // 1:8 prescale and running (1.6uS/clk) TMR1IF = 0; while(!TMR1IF); // wait for delay time TMR1ON = 0; // stop timer // finally get the range from the SRF08 SEN = 1; // send start bit while(SEN); // and wait for it to clear

ACKDT = 0; // acknowledge bit SSPIF = 0; SSPBUF = SRF08_ADDR; // SRF08 I2C address while(!SSPIF); // wait for interrupt SSPIF = 0; // then clear it. SSPBUF = 2; // address of register to read from - high byte of result while(!SSPIF); // SSPIF = 0; // RSEN = 1; // send repeated start bit while(RSEN); // and wait for it to clear SSPIF = 0; // SSPBUF = SRF08_ADDR+1; // SRF08 I2C address - the read bit is set this time while(!SSPIF); // wait for interrupt SSPIF = 0; // then clear it. RCEN = 1; // start receiving while(!STAT_BF); // wait for high byte of range range = SSPBUF<<8; // and get it ACKEN = 1; // start acknowledge sequence while(ACKEN); // wait for ack. sequence to end RCEN = 1; // start receiving while(!STAT_BF); // wait for low byte of range range += SSPBUF; // and get it ACKDT = 1; // not acknowledge for last byte ACKEN = 1; // start acknowledge sequence while(ACKEN); // wait for ack. sequence to end PEN = 1; // send stop bit while(PEN); // return range; } void clrscn(void) { SEN = 1; // send start bit

while(SEN); and wait for it to clear SSPIF = 0; SSPBUF = 0xc6; I2C address while(!SSPIF); for interrupt SSPIF = 0; then clear it. SSPBUF = 0; address of register to write to while(!SSPIF); SSPIF = 0; SSPBUF = 12; screen while(!SSPIF); SSPIF = 0;

//

// LCD02 // wait // // // //

// clear // // // // //

SSPBUF = 4; cursor off while(!SSPIF); SSPIF = 0; PEN = 1; // send stop bit while(PEN); } void cursor(char pos) { SEN = 1; // send start bit while(SEN); and wait for it to clear SSPIF = 0; SSPBUF = 0xc6; I2C address while(!SSPIF); for interrupt SSPIF = 0; then clear it. SSPBUF = 0; address of register to write to while(!SSPIF); SSPIF = 0; SSPBUF = 2; set cursor while(!SSPIF); SSPIF = 0; SSPBUF = pos; while(!SSPIF); SSPIF = 0;

//

//

// LCD02 // wait // // // // // // // // // //

PEN = 1; // send stop bit while(PEN); } void print(char *p) { SEN = 1; // send start bit while(SEN); and wait for it to clear SSPIF = 0; SSPBUF = 0xc6; I2C address while(!SSPIF); for interrupt SSPIF = 0; then clear it. SSPBUF = 0; address of register to write to while(!SSPIF); SSPIF = 0; while(*p) { SSPBUF = *p++; the data while(!SSPIF); SSPIF = 0; } PEN = 1; // send stop bit while(PEN);

//

//

// LCD02 // wait // // // //

// write // //

//

void setup(void) { unsigned long x; PORTB = 0xfe; (trig) is output TRISB = 0xfe; starts low TRISC = 0xff; PORTC = 0xff; SSPSTAT = 0x80; SSPCON = 0x38; SSPCON2 = 0x00; SSPADD = 50; 91khz with 20Mhz Osc for(x=0; x<300000L; x++); initialise } // RB0 // and

// SCL = // wait for LCD03 to

LCD

////////////////////////////////////////////////////////////////////// / // // PIC16F877 - LCD03 example // Written using HITECH PIC16 compiler // // This code is Freeware - Use it for any purpose you like. // ////////////////////////////////////////////////////////////////////// / #include <pic.h> #include <stdio.h> __CONFIG(0x3b32); void void void void clrscn(void); cursor(char pos); print(char *p); setup(void); // prototypes

char s[21]; hold text to print void main(void) { setup(); PIC16F877 I2C port clrscn(); LCD03 disply cursor(26); center the text on 2nd row of LCD03 sprintf(s,"Hello World"); printed into our buffer print(s); LCD03 while(1); } void clrscn(void) { SEN = 1; while(SEN); it to clear SSPIF = 0; SSPBUF = 0xc6; while(!SSPIF); SSPIF = 0; SSPBUF = 0; register to write to while(!SSPIF); SSPIF = 0; SSPBUF = 12; while(!SSPIF); SSPIF = 0;

// buffer used to

// sets up the // clears the // sets cursor to // Traditional welcome text, // send it to the // just stops

// send start bit // and wait for

// LCD02 I2C address // wait for interrupt // then clear it. // address of // //

// clear screen // //

SSPBUF = 4; while(!SSPIF); SSPIF = 0; PEN = 1; while(PEN); } void cursor(char pos) { SEN = 1; while(SEN); it to clear SSPIF = 0; SSPBUF = 0xc6; while(!SSPIF); SSPIF = 0; SSPBUF = 0; register to write to while(!SSPIF); SSPIF = 0; SSPBUF = 2; while(!SSPIF); SSPIF = 0; SSPBUF = pos; while(!SSPIF); SSPIF = 0; PEN = 1; while(PEN); } void print(char *p) { SEN = 1; while(SEN); it to clear SSPIF = 0; SSPBUF = 0xc6; while(!SSPIF); SSPIF = 0; SSPBUF = 0; register to write to while(!SSPIF); SSPIF = 0; while(*p) { SSPBUF = *p++; while(!SSPIF); SSPIF = 0; } PEN = 1;

//

// cursor off // // send stop bit //

// send start bit // and wait for

// LCD02 I2C address // wait for interrupt // then clear it. // address of // // // set cursor // // // // // send stop bit // //

// send start bit // and wait for

// LCD02 I2C address // wait for interrupt // then clear it. // address of // //

// write the data // // // send stop bit

while(PEN); } void setup(void) { unsigned long x; TRISC = 0xff; PORTC = 0xff; SSPSTAT = 0x80; SSPCON = 0x38; SSPCON2 = 0x00; SSPADD = 10; Osc for(x=0; x<60000; x++); initialise }

//

// SCL = 91khz with 4Mhz // wait for LCD03 to

Das könnte Ihnen auch gefallen