iic_app.c

来自「菜鸟,详细NRF24E1运用,程序,电路」· C语言 代码 · 共 204 行

C
204
字号
#include "reg24le1.h"
#include "IIC_app.h"
#include "intrins.h"

void delay(unsigned int dx)
{
unsigned int di;
  for(;dx>0;dx--)
    for(di=120;di>0;di--)
	    {
		;
		}
 }
				
void IIC_init()
{
FREQSEL(2);
MODE(MASTER);
W2CON1|=0x20;     //屏蔽所有的中断
W2SADR=0x00;
EN2WIRE();        //使能2-wire
}

void Io_config()
{
//LED p00
P0DIR&=0XFE;      //LED 输出
P00=0;
P1DIR|=0X01;
P10=0X01;
}

void uart_init()
{
    CLKCTRL = 0x28;			    // 设置时钟源为16M	
	CLKLFCTRL = 0x01; 

	P0DIR &= 0xF7;				// P03 (TxD) 
  	P0DIR |= 0x10;     			// P04 (RxD)  
	P0|=0x18;	 
		
	S0CON = 0x50;  
   	PCON |= 0x80; 				// 波特率倍增
  	WDCON |= 0x80;   			// 选择内部波特率发生器
	
	S0RELL = 0xFB; 	
  	S0RELL = 0xF3;              // 波特率38400
	
//	ES0=1;
}

void ex_int(void)
{
IEN0|=0X80;
IEN0|=0X01;
TCON|=0X01;       //下降沿触发
INTEXP|=0x08; 	  //从P05输入中断
P0DIR|=0X20;	  //P05输入
P0DIR|=0x40;	  //P06输入
P05=1;
P06=1;
}

void send(unsigned char ch)
{

S0BUF=ch;
while(!TI0);
TI0=0;
}

unsigned char readbyte(unsigned int addr)
{
unsigned char byte;
START();
W2DAT=((slaveaddr+0xa0)<<1)+0;//write from slave
while(ACK);
W2DAT=addr;
while(ACK);
START();
W2DAT=((slaveaddr+0xa0)<<1)+1;//read from slave
while(ACK);
while(!READY);
byte=W2DAT;
STOP();
return byte;

}
//选择写
void writebyte(unsigned int addr,unsigned char dat)
{
unsigned char byte=dat;
START();
W2DAT=((slaveaddr+0xa0)<<1)+0;//write
if(!ACK) //IF ACK
W2DAT=addr;
if(!ACK)
W2DAT=byte;
STOP();
}

//立即读
void multyread(char *buffer,int len)
{
char *cbuffer=buffer;
W2DAT=((slaveaddr+0xa0)<<1)+1;//read from slave
if(!ACK) //IF ACK
{
while(len--)
{
while(!READY);
*cbuffer++=W2DAT;
}

STOP();
}

}

 //页写
void multwrite(char *buffer,int addr)
{
char * cbuffer=buffer;
char numlimit=0;
START();
W2DAT=((slaveaddr+0xa0)<<1)+0;//write from slave
if(!ACK) //IF ACK
W2DAT=addr;
if(!ACK)
{
W2DAT=*cbuffer++ ;
numlimit++;
if(numlimit==16)
return;
}

}

//extern char wbuffer[];
unsigned char wbuffer[0x10]={'a','b','c','d',
                             'e','f','g','h',
							 '0','1','2','3',
							 '4','5','6','7',
							  };
void uart_service() interrupt  INTERRUPT_UART 
{
static int i=0;
char buf;
if(TI0)
{TI0=0;	}
if(RI0)
 {
RI0=0;
buf=S0BUF;
wbuffer[i++]=buf;
if(i==0x10)
i=0;
 }
 
}

unsigned char keycheck(void)
{
P1CON=0XD0;//P10
if(!P10)
{
delay(10);
if(!P10)
{ while(!P10);
  return true;  //如果按下就返回真
 }
}
return false; // 返回假

}

void puts(char *str)
{
while(*str!='\0')
  {send(*str++);
   }
}

char init_time=0;

void ex_int_service() interrupt  0
{
 
 static char flag=0;
 if(flag)
 flag=0;
 else
 flag=1;
 puts("...IIC test program!by syman...\n");
 LED=flag;
 init_time=1;
}






⌨️ 快捷键说明

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