📄 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设置为输入
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 + -