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

📄 ext_int1.c

📁 PIC18F6720写DAC7612U,TA1604_LCD显示,I2C读写PCF8563,PIC单片机之间模拟I2C通讯,该软件已调试通过,已经在产品上使用,有中文说明.
💻 C
字号:
#define slave_I2C_data   PIN_B1
#define slave_I2C_clk    PIN_B2


void ext_int1_init(){
 bit_set(*0xF93,1); //端口B的方向寄存器地址为0xF93,将RB1设置为输入
 bit_set(*0xF93,2); //端口B的方向寄存器地址为0xF93,将RB2设置为输入
 ext_int_edge(1,H_TO_L);     //将EXT_INT1设置为下降沿中断方式;
 enable_interrupts(INT_EXT1);//使能外部中断1
 enable_interrupts(GLOBAL);  //开总中断
 }

/*
int1 wait_I2C_clk_high(){
  long int sys_couter=10000;
  while( !input(slave_I2C_clk))
       {
       sys_couter--;
       if(sys_couter==0)
         {
          //enable_interrupts(INT_EXT1);//使能外部中断1
          return  FALSE;//超时; 
         }
      }
  return  TRUE; 
}
*/


int1 wait_I2C_clk_low(){
  long int sys_couter2=1000;
  while( input(slave_I2C_clk))//等待slave_I2C_clk变为0;
       {
        sys_couter2--;
        if(sys_couter2==0) return  FALSE;//超时; 
       }
  return  TRUE; 
}


//从IIC读入一个字节
BYTE read_IIC_byte( ) {
long  int sys_couter0=1000;
long  int sys_couter1=1000;
   BYTE i=8,data;

   for(i=0;i<8;i++)
      {while( !input(slave_I2C_clk) )  //等待slave_I2C_clk变为1;
            {sys_couter0--;
             if(sys_couter0==0x0000) return(0);//超时,主机错; 
            }
       shift_left(&data,1,input(slave_I2C_data)); //slave从从主机发送器读入1位,先读入的是发送数据的最高位;
       while( input(slave_I2C_clk) )  //等待slave_I2C_clk变为0;
            {sys_couter1--;
             if(sys_couter1==0x0000) return(0);//超时,主机错; 
            }
       sys_couter0=1000;
       sys_couter1=1000;
     }

   return(data);//接收正确
}

void iic_send_ack()
{
 output_low(slave_I2C_data);    //在slave_I2C_clk变为0时,本从机发送应答ACK;

 while( !input(slave_I2C_clk) );//等待slave_I2C_clk变为1;
 while( input(slave_I2C_clk) ); //等待slave_I2C_clk变为0;
                                //上面两句是等待一个移位时钟到到来
 bit_set(*0xF93,1); //端口B的方向寄存器地址为0xF93,将RB1设置为输入
 bit_set(*0xF93,2); //端口B的方向寄存器地址为0xF93,将RB2设置为输入
}




/*
#INT_EXT1
void ext_int1_service()
{
  BYTE j,SLAVE_address;
  int1 receive_ok;
  char receive_temp[5]; //用来存放接收到的数据,以ASCII格式存放
  if( input(slave_I2C_clk))  //若slave_I2C_clk=1时,在slave_I2C_data脚出现下降沿,表示I2C起动条件满足,则执行下面语句
    {disable_interrupts(INT_EXT1);//不使能外部中断1
     if( wait_I2C_clk_low() )     //等待slave_I2C_clk变为0
       {
        if( wait_I2C_clk_high() )    //等待slave_I2C_clk变高;若slave_I2C_clk=1,表示开始有数据移进来
          {SLAVE_address=read_IIC_byte(); //读到一个字节;
           if(SLAVE_address==0xaa)  //若地址相符合,则执行下面语句
             {
              if( wait_I2C_clk_low() )     //等待slave_I2C_clk变为0
                {output_low(slave_I2C_data);//在slave_I2C_clk变为0时,本从机发送应答ACK;
                 if( wait_I2C_clk_high() )  //等待主机将应答ACK信号取走
                   {if( wait_I2C_clk_low() )     //等待slave_I2C_clk变为0
                      {
                       if( wait_I2C_clk_high() ) //等待slave_I2C_clk变高;若slave_I2C_clk=1,表示开始有数据移进来
                         {for(j=0;j<=4;j++)
                             {receive_temp[j]=read_IIC_byte();//读到一个字节;
                              if(receive_temp[j]!=0) receive_ok=1;
                                else{ 
                                     receive_ok=0;
                                     break;
                                    }
                             }
                           if(receive_ok)
                             {strcpy( receive_string_buffer,receive_temp );//将receive_temp所指内容拷贝到receive_string_buffer中;
                              write_string_to_DAC7612U(receive_string_buffer,14);  //将接收到的5位ASCII码写入DAC7612U
                              lcd1604_display(receive_string_buffer);              //将接收到的5位ASCII码写入LCD显示;
                             }
                         }
                      }
                   }
                }
              }
            }
         }
    enable_interrupts(INT_EXT1);//使能外部中断1
    bit_set(*0xF93,1); //端口B的方向寄存器地址为0xF93,将RB1设置为输入
    bit_set(*0xF93,2); //端口B的方向寄存器地址为0xF93,将RB2设置为输入   
    } 
}
*/

⌨️ 快捷键说明

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