⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24_256_2.c

📁 Low End Microchip PICs C函数
💻 C
字号:
// 24_256_2.C
//
// Interface with 24LC256 using MSSP Module in I2C Master Mode
//
//
// copyright, Peter H. Anderson, Baltimore, MD, Jan, '01

#case

#device PIC16F877 *=16 ICD=TRUE

#include <defs_877.h>
#include <lcd_out.h>
#include <i2c_mstr.h>

#define TRUE !0
#define FALSE 0

void random_write(byte dev_adr, int mem_adr, byte dat);
byte random_read(byte dev_adr, int mem_adr);

// routines used for 24LC256
void make_meas_seq(byte *d);
void seq_write(byte dev_adr, unsigned long mem_adr, byte *d, byte num_vals);
void seq_read(byte dev_adr, unsigned long mem_adr, byte *d, byte num_vals);

void main(void)
{
   long mem_adr;
   byte dat, m, n, line;
   byte d[4];

   i2c_master_setup();

   lcd_init();
   printf(lcd_char, "Byte Demo");
   delay_ms(2000);

   lcd_clr_line(0);
   mem_adr=0x0700;
   for(n=0; n<16; n++)	// write some data to the EEPROM
   {
      dat = 0xff - n;
      random_write(0x00, mem_adr, dat);
      ++mem_adr;
      lcd_char('!');		// to show something is going on
   }

   // now, read the data back and display
   lcd_init();

   mem_adr=0x0700;
   for(n=0, m=0, line = 0; n<16; n++, m++)
   {
      if (m==4)
  	  {
	 	  m = 0;
		  ++line;
		  lcd_clr_line(line);
	  }
      dat = random_read(0x00, mem_adr);
      lcd_hex_byte(dat);
      lcd_char(' ');
      ++mem_adr;
   }
   delay_ms(2000);
   lcd_init();
   printf(lcd_char, "Seq Byte Demo");
   delay_ms(2000);

   lcd_init();

   mem_adr = 0x0700;		// write the data
   for(n=0; n<3; n++)		// three chuncks of 4 data bytes
   {
       make_meas_seq(d);
       seq_write(0x00, mem_adr, d, 4);
       mem_adr +=4;
   }

   mem_adr=0x0700;			// now read it back

   for(n=0; n<3; n++)
   {
      seq_read(0x00, mem_adr, d, 4);
      lcd_clr_line(n);
      for(m=0; m<4; m++)
      {
         lcd_hex_byte(d[m]);
         lcd_char(' ');
      }
      mem_adr +=4;
   }

   while(1)			;
}

void random_write(byte dev_adr, int mem_adr, byte dat)
{
   i2c_master_start();
   i2c_master_out_byte(0xa0 | (dev_adr << 1));
   i2c_master_out_byte((mem_adr >> 8) & 0xff);	// high byte of memory address
   i2c_master_out_byte(mem_adr & 0xff);	// low byte of mem address
   i2c_master_out_byte(dat);			// and finally the data
   i2c_master_stop();
   delay_ms(25); // allow for the programming of the eeprom
}

byte random_read(byte dev_adr, int mem_adr)
{
   byte y;
   i2c_master_start();
   i2c_master_out_byte(0xa0 | (dev_adr << 1));
   i2c_master_out_byte((mem_adr >> 8) & 0xff);
   i2c_master_out_byte(mem_adr & 0xff);

   i2c_master_repeated_start();	// no intermediate stop
   i2c_master_out_byte(0xa1 | (dev_adr << 1));	// read operation
   y=i2c_master_in_byte(1);
   i2c_master_stop();
   return(y);
}

void make_meas_seq(byte *d)
{
   static byte n = 0;
   d[0]=0xf0+n;
   d[1]=0xa0+n;
   d[2]=0x80+n;
   d[3]=0x40+n;
   n+=2;
}

void seq_write(byte dev_adr, unsigned long mem_adr, byte *d, byte num_vals)
{
   byte n;
   i2c_master_start();
   i2c_master_out_byte(0xa0 | (dev_adr << 1));
   i2c_master_out_byte((mem_adr >> 8) & 0xff);
   i2c_master_out_byte(mem_adr & 0xff);
   for (n=0; n<num_vals; n++)
   {
      i2c_master_out_byte(d[n]);
   }
   i2c_master_stop();
   delay_ms(10);
}

void seq_read(byte dev_adr, unsigned long mem_adr, byte *d, byte num_vals)
{
   byte n;

   i2c_master_start();
   i2c_master_out_byte(0xa0 | (dev_adr << 1));
   i2c_master_out_byte((mem_adr >> 8) & 0xff);
   i2c_master_out_byte(mem_adr & 0xff);

   i2c_master_repeated_start();
   i2c_master_out_byte(0xa1 | (dev_adr << 1));

   for(n=0; n<num_vals; n++)
   {
      if(n!=(num_vals-1))
      {
		 d[n] = i2c_master_in_byte(1);
      }
      else
      {
		 d[n] = i2c_master_in_byte(0);
	  }
   }
   i2c_master_stop();
}


#include <lcd_out.c>
#include <i2c_mstr.c>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -