#include #include #include #define SCL TRISA4 // I2C bus #define SDA TRISA0 // #define SCL_IN PORTA,RA4 // #define SDA_IN PORTA,RA0 // #define TMR0_2 (TMR0 & 1<<2) #define LM75AD 0b10010000 __CONFIG (0x3D11); unsigned char mpx_cnt; unsigned char tempmsb; unsigned char templsb; unsigned char tempBCD1; unsigned char tempBCD2; const int pat7seg2[10]= { 0b10000001, //0 0b11011101, //1 0b01000011, //2 0b01010001, //3 0b00011101, //4 0b10110000, //5 0b00100001, //6 0b11010101, //7 0b00000001, //8 0b00010001, //9 }; const int pat7seg3[10]= { 0b00000001, //0 0b00101111, //1 0b01000010, //2 0b00100010, //3 0b00101100, //4 0b00110000, //5 0b00010000, //6 0b00101011, //7 0b00000000, //8 0b00100000, //9 }; const int pat7seg4[10]= { 0b10000001, //0 0b10101111, //1 0b11000010, //2 0b10100010, //3 0b10101100, //4 0b10110000, //5 0b10010000, //6 0b10101011, //7 0b10000000, //8 0b10100000, //9 }; void Wait() { unsigned char i; for(i=0;i<100;i++) _delay(10000); } void i2c_dly(void) { _delay(20); } void i2c_start(void) { SDA = 1; // i2c start bit sequence i2c_dly(); SCL = 1; i2c_dly(); SDA = 0; i2c_dly(); SCL = 0; i2c_dly(); } void i2c_stop(void) { SDA = 0; // i2c stop bit sequence i2c_dly(); SCL = 1; i2c_dly(); SDA = 1; i2c_dly(); } unsigned char i2c_rx(char ack) { unsigned char x, d=0; SDA = 1; for(x=0; x<8; x++) { d <<= 1; do { SCL = 1; } while(SCL_IN==0); // wait for any SCL clock stretching i2c_dly(); if(SDA_IN) d |= 1; SCL = 0; } if(ack) SDA = 0; else SDA = 1; SCL = 1; i2c_dly(); // send (N)ACK bit SCL = 0; SDA = 1; return (d) ; } bit i2c_tx(unsigned char d) { char x; static bit b; for(x=8; x; x--) { if(d&0x80) SDA = 1; else SDA = 0; SCL = 1; i2c_dly(); d <<= 1; SCL = 0; i2c_dly(); } SDA = 1; i2c_dly(); SCL = 1; i2c_dly(); b = SDA_IN; // possible ACK bit SCL = 0; return b; } void ReadI2C() { SDA = SCL = 1; SCL_IN = SDA_IN = 0; i2c_start(); // send start sequence i2c_tx(0xE0); // SRF08 I2C address with R/W bit clear i2c_tx(0x00); // SRF08 command register address i2c_tx(0x51); // command to start ranging in cm i2c_stop(); // send stop sequence } void main() { OPTION_REG = 0b11010111; //Initialize PORTD //PD0 as Output CMCON=0B00000111; TRISA=0B11111111; PORTB=0b11111111; PORTA=0b11100000; tempmsb=0; templsb=0; while(1) { TRISA=0B11111111; PORTB=0b11111111; PORTA=0b11100000; i2c_dly; //Set Pointer to the Temperature Register i2c_start(); i2c_tx(0b10010000); i2c_tx(0b00000000); //Eead temperature sensor i2c_start(); i2c_tx(0b10010001); tempmsb=i2c_rx(1); templsb=i2c_rx(0); i2c_stop(); tempmsb=tempmsb-6; tempBCD1=tempmsb/10; tempBCD2=tempmsb % 10; TRISA=0B11111111; TRISB=0B11111111; for(mpx_cnt=0;mpx_cnt < 1000000/2048/4; mpx_cnt++) { TRISA=0B11111111; TRISB=0B00000000; while(!TMR0_2) ; PORTB=pat7seg4[tempBCD1]; TRISA=0B11110111; PORTA=0B11110111; while(TMR0_2) ; while(!TMR0_2) ; TRISA=0B11111111; PORTB=pat7seg3[tempBCD2]; TRISA=0B11111011; PORTA=0B11111011; while(TMR0_2) ; while(!TMR0_2) ; TRISA=0B11111111; if((templsb & 0B10000000)) { PORTB=pat7seg2[5]; } else { PORTB=pat7seg2[0] ; } TRISA=0B11111101; PORTA=0B11111101; while(TMR0_2) ; while(!TMR0_2) ; TRISA=0B11111111; PORTB=0B00100011; TRISA=0B11111110; PORTA=0B11111110; while(TMR0_2) ; } } }