Example #1
0
/*******************************************************************************
 * 名    称: HT1621BWrCmd
 * 功    能: 向HT1621B中写指令
 * 入口参数: Cmd为需要发送的指令
 * 出口参数: 无
 * 作  者:
 * 创建日期: 2015-01-05
 * 修    改:
 * 修改日期:
 * 备    注: 写入命令标识位100
 *******************************************************************************/
void HT1621BWrCmd(u8 Cmd)
{
    HT1621B_CS_LOW();
    _Nop();       /*延时10US*/
    HT1621BWriteData(HT_WRITECMD,4); //写入命令标志100
    HT1621BWriteData(Cmd,8);  //写入命令数据
    HT1621B_CS_HIGH();
    _Nop();      /*延时10US*/
}
Example #2
0
/********************************************************
函数名称:void ht1621_wr_cmd(char Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无

说 明:写入命令标识位100
********************************************************/
void ht1621_wr_cmd(char cmd)
{
	HT1621_CS=0;
	_Nop();
	ht1621_wr_dat(0x80,4); //写入命令标志100
	ht1621_wr_dat(cmd,8); //写入命令数据
	HT1621_CS=1;
	_Nop();
}
Example #3
0
File: i2c.c Project: Harry-Wu/C51
static void i2c_sendnack(void) {
	SCL = 0;
	_Nop();
	SDA = 1;
	_Nop();
	SCL = 1;
	_Nop();
	SCL = 0;
	_Nop();
}
Example #4
0
File: i2c.c Project: Harry-Wu/C51
static void i2c_sendbit(bool v) {
	SCL = 0;
	_Nop();
	SDA = v;
	_Nop();
	SCL = 1;
	_Nop();
	SCL = 0;
	_Nop();
}
Example #5
0
File: i2c.c Project: Harry-Wu/C51
static bool i2c_recvbit(void) {
	bool v;
	SCL = 0;
	_Nop();
	SCL = 1;
	_Nop();
	v = SDA;
	SCL = 0;
	_Nop();
	return v;
}
Example #6
0
File: i2c.c Project: Harry-Wu/C51
static void i2c_waitack(void) {
	SCL = 0;
	_Nop();
	SDA = 1;
	_Nop();
	SCL = 1;
	_Nop();
	while (SDA)
		;
	SCL = 0;
	_Nop();
}
Example #7
0
/*******************************************************************
结束总线函数
函数原型: void Stop_COM();
功能: 命令发送结束信号
********************************************************************/
void Stop_COM(void)
{
    _CardSetCLK_LOW;
    _CardPutIO_LOW(); /*发送结束条件的数据信号*/
    _Nop(); /*发送结束条件的时钟信号*/
    _Nop();
    _Nop();
    _CardSetCLK_HIGH; /*结束条件建立时间大于4 s*/
    DELAY5us();
    _CardPutIO_HIGH(); /*发送总线结束信号*/
    _Nop();
    _Nop();
}
Example #8
0
/******************************************************
写数据函数,cnt为传送数据位数,数据传送为低位在前
*******************************************************/
void ht1621_wr_dat(char dat,char cnt)
{
	char i;
	for (i=0;i<cnt;i++)
	{
		HT1621_WR=0;
		_Nop();
		HT1621_DAT=dat&0x80;
		_Nop();
		HT1621_WR=1;
		_Nop();
		dat<<=1;
	}

}
Example #9
0
/*******************************************************************
起动总线函数
函数原型: void Start_COM();
功能: 启动发送命令起始条件.
********************************************************************/
void Start_COM(void)
{
    _CardPutIO_HIGH(); /*发送起始条件的数据信号*/
    _CardSetCLK_LOW;
    _Nop();
    _Nop();
    _Nop();
    _CardSetCLK_HIGH;
    DELAY5us(); /*起始条件建立时间大于4.7us,延时*/
    _CardPutIO_LOW(); /*发送起始信号*/
    DELAY5us(); /*起始条件锁定时间大于4 s*/
    _CardSetCLK_LOW; /*钳住总线准备发送或接收数据 */
    _Nop();
    _Nop();
}
Example #10
0
File: I2C.c Project: marxsu/IFMA
/*******************************************************************
                      结束总线函数               
函数原型: void  Stop_I2c();  
功能:     结束I2C总线,即发送I2C结束条件.  
********************************************************************/
void Stop_I2c()
{
  SDA=0;      /*发送结束条件的数据信号*/
  _Nop();       /*发送结束条件的时钟信号*/
  SCL=1;      /*结束条件建立时间大于4μs*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  SDA=1;      /*发送I2C总线结束信号*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();
}
Example #11
0
/*----------------------------------------------------------------
                     非应答子函数
原型:  void NoAck_I2c(void);
 
----------------------------------------------------------------*/
void NoAck_I2c(void)
{
  
    SDA(1);
    _Nop();
    _Nop();
    _Nop();      
    SCL(1);
    _Nop();
    _Nop();              //时钟低电平周期大于4μ
    _Nop();
    _Nop();
    _Nop();  
    SCL(0);                //清时钟线,钳住I2C总线以便继续接收
    _Nop();
    _Nop();    
}
Example #12
0
/********************************************************
函数名称:void ht1621_wr_one(char addr,char dat)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:addr为写入初始地址SEG[31:0],Data为写入数据COM[3:0]
返回说明:无
说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/
void ht1621_wr_one(char addr,char dat)//
{
	HT1621_CS=0;
	ht1621_wr_dat(0xa0,3); //写入数据标志101
	ht1621_wr_dat(addr<<2,6); //写入地址数据
	ht1621_wr_dat(dat<<4,4); //写入数据
	HT1621_CS=1;
	_Nop();
}
Example #13
0
File: I2C.c Project: marxsu/IFMA
/********************************************************************
                     应答子函数
函数原型:  void Ack_I2c(bit a);
功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
{
  
  if(a==0)SDA=0;              /*在此发出应答或非应答信号 */
  else SDA=1;
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();                    /*时钟低电平周期大于4μs*/
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
  _Nop();
  _Nop();    
}
Example #14
0
/*******************************************************************************
 * 名    称: HT1621BWrOneData
 * 功    能: HT1621B在指定地址写入数据函数
 * 入口参数: Addr为写入初始地址,Data为写入数据
 * 出口参数: 无
 * 作  者:
 * 创建日期: 2015-01-05
 * 修    改:
 * 修改日期:
 * 备    注: 因为HT1621B的数据位4位,所以实际写入数据为参数的后4位 、
 *                HT1621B的地址位6位,所以实际写入数据为参数的后6位 、
 *******************************************************************************/
void HT1621BWrOneData(u8 Addr,u8 Data)
{
    HT1621B_CS_LOW();
    HT1621BWriteData(HT_WRITEDATA,3);    //写入数据标志101
    HT1621BWriteData(Addr<<2,6); //写入地址数据
    HT1621BWriteData(Data<<4,4); //写入数据
    HT1621B_CS_HIGH();
    _Nop();                   /*延时10US*/
}
Example #15
0
	/*******************************************************************
	字节数据传送函数
	函数原型: void SendByte(unsigned char c);
	功能: 将数据c 发送出去,可以是命令,也可以是数据
	********************************************************************/
	void SendByte(unsigned char c)
	{
	   unsigned char BitCnt;
	   for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8 位*/
	   {
		  if((c>>BitCnt)&0x01)
		  {
			 _CardPutIO_HIGH(); /*判断发送位*/
		  }
		  else
		  {
			 _CardPutIO_LOW();
		  }
		 _Nop();_Nop();
		 _CardSetCLK_HIGH; /*置时钟线为高通知被控器开始接收数据位*/
		 DELAY5us(); /*保证时钟高电平周期大于4 s*/
		 _CardSetCLK_LOW;
	   }
Example #16
0
/*******************************************************************************
 * 名    称: HT1621BWriteData
 * 功    能: 向HT1621B中写指定位数的数据函数
 * 入口参数: Data为需要传送的数据
 *            cnt为传送数据位数,数据传送为低位在前
 * 出口参数: 无
 * 作  者:
 * 创建日期: 2015-01-05
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
static void HT1621BWriteData(u8 Data,u8 cnt)
{
    for (u8 i=0;i<cnt;i++)
    {
        HT1621B_WR_LOW();
        _Nop();     /*延时10US*/
        if(Data&0x80)
        {
            HT1621B_DATA_HIGH();
        }else
        {
            HT1621B_DATA_LOW();
        }
        _Nop();     /*延时10US*/
        HT1621B_WR_HIGH();
        _Nop();     /*延时10US*/
        Data<<=1;
    }
}
Example #17
0
/*******************************************************************************
 * 名    称: HT1621BWrStrData
 * 功    能: HT1621B连续写入数据函数
 * 入口参数: Addr为写入初始地址,*p为连续写入数据指针,cnt为写入数据总数
 * 出口参数: 无
 * 作  者:
 * 创建日期: 2015-01-05
 * 修    改:
 * 修改日期:
 * 备    注: HT1621的数据位4位,此处每次数据为8位,写入数据总数按8位计算
 *******************************************************************************/
void HT1621BWrStrData(u8 Addr,u8 *p,u8 cnt)
{
    HT1621B_CS_LOW();
    HT1621BWriteData(HT_WRITEDATA,3); //写入数据标志101
    HT1621BWriteData(Addr << 2,6); //写入地址数据
    for (u8 i=0;i<cnt;i++)
    {
        HT1621BWriteData(*p,8); //写入数据
        p++;
    }
    HT1621B_CS_HIGH();
    _Nop();               /*延时10US*/
}
Example #18
0
/********************************************************
HT1621测试程序,2008-2-13, 22:41:43
函数名称:void ht1621_wr_cnt(char addr,char *p,char cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:addr为写入初始地址,*p为连续写入数据指针,
cnt为写入数据总数
返回说明:无
说 明:HT1621的数据位4位,此处每次数据为8位,写入数据
总数按8位计算
********************************************************/
void ht1621_wr_cnt(char addr,char *p,char cnt)
{
	char i;
	HT1621_CS=0;
	ht1621_wr_dat(0xa0,3); //写入数据标志101
	ht1621_wr_dat(addr<<2,6); //写入地址数据
	for (i=0;i<cnt;i++)
	{
		ht1621_wr_dat(*p,8); //写入数据
		p++;
	}
	HT1621_CS=1;
	_Nop();
}
Example #19
0
/*----------------------------------------------------------------
                 字节数据传送函数               
函数原型: unsigned char  I2C_RcvByte();
功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
     发完后请用应答函数。  
------------------------------------------------------------------*/	
unsigned char  I2C_RcvByte(void)
{
    unsigned char retc;
    unsigned char BitCnt;

    retc=0; 
    SDA(1);             //置数据线为输入方式
    for(BitCnt = 0; BitCnt < 8; BitCnt++)
    {
        _Nop();           
        SCL(0);       //置时钟线为低,准备接收数据位
        _Nop();
        _Nop();      //时钟低电平周期大于4.7us
        _Nop();
        _Nop();
        _Nop();
        SCL(1);       //置时钟线为高使数据线上数据有效
        _Nop();
        _Nop();
        retc = retc << 1;
        if(Read_SDA())
            retc = retc + 1; //读数据位,接收的数据位放入retc中
        _Nop();
        _Nop(); 
    }
    SCL(0);    
    _Nop();
    _Nop();
    return(retc);
}
Example #20
0
File: I2C.c Project: marxsu/IFMA
/*******************************************************************
                     起动总线函数               
函数原型: void  Start_I2c();  
功能:     启动I2C总线,即发送I2C起始条件.  
********************************************************************/
void Start_I2c()
{
  SDA=1;         /*发送起始条件的数据信号*/
  _Nop();
  SCL=1;
  _Nop();        /*起始条件建立时间大于4.7us,延时*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();    
  SDA=0;         /*发送起始信号*/
  _Nop();        /* 起始条件锁定时间大于4μs*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();       
  SCL=0;       /*钳住I2C总线,准备发送或接收数据 */
  _Nop();
  _Nop();
}
Example #21
0
File: I2C.c Project: marxsu/IFMA
/*******************************************************************
                 字节数据发送函数               
函数原型: void  SendByte(UCHAR c);
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
          此状态位进行操作.(不应答或非应答都使ack=0)     
           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  SendByte(unsigned char  c)
{
 unsigned char  BitCnt;
 
 for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
       else  SDA=0;                
     _Nop();
     SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
      _Nop(); 
      _Nop();             /*保证时钟高电平周期大于4μs*/
      _Nop();
      _Nop();
      _Nop();         
     SCL=0; 
    }
    
    _Nop();
    _Nop();
    SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/
    _Nop();
    _Nop();   
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;     
       else ack=1;        /*判断是否接收到应答信号*/
    SCL=0;
    _Nop();
    _Nop();
}
Example #22
0
File: I2C.c Project: marxsu/IFMA
/*******************************************************************
                 字节数据接收函数               
函数原型: UCHAR  RcvByte();
功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),
          发完后请用应答函数应答从机。  
********************************************************************/    
unsigned char   RcvByte()
{
  unsigned char  retc;
  unsigned char  BitCnt;
  
  retc=0; 
  SDA=1;                     /*置数据线为输入方式*/
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;                  /*置时钟线为低,准备接收数据位*/
        _Nop();
        _Nop();                 /*时钟低电平周期大于4.7μs*/
        _Nop();
        _Nop();
        _Nop();
        SCL=1;                  /*置时钟线为高使数据线上数据有效*/
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
        _Nop();
        _Nop(); 
      }
  SCL=0;    
  _Nop();
  _Nop();
  return(retc);
}