?? ext_int1.c
字號:
#define slave_I2C_data PIN_B1
#define slave_I2C_clk PIN_B2
void ext_int1_init(){
bit_set(*0xF93,1); //端口B的方向寄存器地址為0xF93,將RB1設(shè)置為輸入
bit_set(*0xF93,2); //端口B的方向寄存器地址為0xF93,將RB2設(shè)置為輸入
ext_int_edge(1,H_TO_L); //將EXT_INT1設(shè)置為下降沿中斷方式;
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;//超時(shí);
}
}
return TRUE;
}
*/
int1 wait_I2C_clk_low(){
long int sys_couter2=1000;
while( input(slave_I2C_clk))//等待slave_I2C_clk變?yōu)?;
{
sys_couter2--;
if(sys_couter2==0) return FALSE;//超時(shí);
}
return TRUE;
}
//從IIC讀入一個(gè)字節(jié)
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變?yōu)?;
{sys_couter0--;
if(sys_couter0==0x0000) return(0);//超時(shí),主機(jī)錯(cuò);
}
shift_left(&data,1,input(slave_I2C_data)); //slave從從主機(jī)發(fā)送器讀入1位,先讀入的是發(fā)送數(shù)據(jù)的最高位;
while( input(slave_I2C_clk) ) //等待slave_I2C_clk變?yōu)?;
{sys_couter1--;
if(sys_couter1==0x0000) return(0);//超時(shí),主機(jī)錯(cuò);
}
sys_couter0=1000;
sys_couter1=1000;
}
return(data);//接收正確
}
void iic_send_ack()
{
output_low(slave_I2C_data); //在slave_I2C_clk變?yōu)?時(shí),本從機(jī)發(fā)送應(yīng)答ACK;
while( !input(slave_I2C_clk) );//等待slave_I2C_clk變?yōu)?;
while( input(slave_I2C_clk) ); //等待slave_I2C_clk變?yōu)?;
//上面兩句是等待一個(gè)移位時(shí)鐘到到來
bit_set(*0xF93,1); //端口B的方向寄存器地址為0xF93,將RB1設(shè)置為輸入
bit_set(*0xF93,2); //端口B的方向寄存器地址為0xF93,將RB2設(shè)置為輸入
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -