Advertisement
Guest User

Untitled

a guest
Mar 13th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 2.49 KB | None | 0 0
  1. // PIC16F877A Configuration Bit Settings
  2. // 'C' source line config statements
  3. #include <xc.h>
  4. #include <pic16f877a.h>
  5.  
  6. #define _XTAL_FREQ 8000000
  7.  
  8. // #pragma config statements should precede project file includes.
  9. // Use project enums instead of #define for ON and OFF.
  10.  
  11. // CONFIG
  12. #pragma config FOSC = XT   // Oscillator Selection bits (XT oscillator)
  13. #pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled)
  14. #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
  15. #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
  16. #pragma config LVP = OFF   // Low-Voltage In-Circuit Serial Programming Enable bit
  17. #pragma config CPD = OFF   // Data EEPROM Memory Code Protection bit
  18. #pragma config WRT = OFF   // Flash Program Memory Write Enable bits
  19. #pragma config CP = OFF    // Flash Program Memory Code Protection bit
  20.  
  21. void I2C_Master_Init(const unsigned long c)
  22. {
  23.   SSPCON = 0b00101000;
  24.   SSPCON2 = 0;
  25.   SSPADD = (_XTAL_FREQ/(4*c))-1;
  26.   SSPSTAT = 0;
  27.   TRISC3 = 1;        //Setting as input as given in datasheet
  28.   TRISC4 = 1;        //Setting as input as given in datasheet
  29. }
  30.  
  31. void I2C_Master_Wait()
  32. {
  33.   while ((SSPSTAT & 0x04) || (SSPCON2 & 0x1F));
  34. }
  35.  
  36. void I2C_Master_Start()
  37. {
  38.   I2C_Master_Wait();
  39.   SEN = 1;
  40. }
  41.  
  42. void I2C_Master_RepeatedStart()
  43. {
  44.   I2C_Master_Wait();
  45.   RSEN = 1;
  46. }
  47.  
  48. void I2C_Master_Stop()
  49. {
  50.   I2C_Master_Wait();
  51.   PEN = 1;
  52. }
  53.  
  54. void I2C_Master_Write(unsigned d)
  55. {
  56.   I2C_Master_Wait();
  57.   SSPBUF = d;
  58. }
  59.  
  60. unsigned short I2C_Master_Read(unsigned short a)
  61. {
  62.   unsigned short temp;
  63.   I2C_Master_Wait();
  64.   RCEN = 1;
  65.   I2C_Master_Wait();
  66.   temp = SSPBUF;
  67.   I2C_Master_Wait();
  68.   ACKDT = (a)?0:1;
  69.   ACKEN = 1;
  70.   return temp;
  71. }
  72.  
  73. void main()
  74. {
  75.   nRBPU = 0;                    //Enable PORTB internal pull up resistor
  76.   TRISB = 0xFF;                 //PORTB as input
  77.   TRISD = 0x00;                 //PORTD as output
  78.   PORTD = 0x00;                 //All LEDs OFF
  79.   I2C_Master_Init(100000);      //Initialize I2C Master with 100KHz clock
  80.   while(1)
  81.   {
  82.     I2C_Master_Start();         //Start condition
  83.     I2C_Master_Write(0x30);     //7 bit address + Write
  84.     I2C_Master_Write(PORTB);    //Write data
  85.     I2C_Master_Stop();          //Stop condition
  86.     __delay_ms(200);
  87.     I2C_Master_Start();         //Start condition
  88.     I2C_Master_Write(0x31);     //7 bit address + Read
  89.     PORTD = I2C_Master_Read(0); //Read + Acknowledge
  90.     I2C_Master_Stop();          //Stop condition
  91.     __delay_ms(200);
  92.   }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement