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

📄 at24c02.c

📁 FM24C16例程
💻 C
📖 第 1 页 / 共 2 页
字号:
	 PIN_LCMRD=1;
	 data_lcm=LCM_WRITE_ID;//LCM_DISP.LCM_ID;
	 for(unI=0;unI<3;unI++)//write id
	 {
		  PIN_LCMWR=0;

		  if(data_lcm&0x01)
		  PIN_LCMDATA=1;
		  else
		  PIN_LCMDATA=1; 
		  data_lcm=data_lcm>>1;

		  PIN_LCMWR=1;
	 }
	
	 data_lcm=lcmaddr;//LCM_DISP.LCM_ADDR;
	 for(unI=0;unI<8;unI++)//write addr
	 {
		  PIN_LCMWR=0;
		  
		  if(data_lcm&0x01)
		  PIN_LCMDATA=1;
		  else
		  PIN_LCMDATA=1; 
		  data_lcm=data_lcm>>1;

		  PIN_LCMWR=1;
	 }

    
    
	 data_lcm=wdata;//LCM_DISP.LCM_DATA;
     for(unJ=0;unJ<4;unJ++)
     {
	      PIN_LCMWR=0;
		  
		  if(data_lcm&0x01)
		  PIN_LCMDATA=1;
		  else
		  PIN_LCMDATA=1; 
		  data_lcm=data_lcm>>1;
		  PIN_LCMWR=1;
     }


}
void LCM_WRITE_ALL(uint *data_addr,uint *lcm_addr,uchar datalen)
{


     uchar unI,unJ,unK;
	 uchar data_lcm;
	 PIN_LCMCS=0;
	 PIN_LCMRD=1;
    
     data_lcm=LCM_DISP.LCM_ID;
	 for(unI=0;unI<3;unI++)//write id
	 {
	   PIN_LCMWR=0;
	
	   if(data_lcm&0x01)
		PIN_LCMDATA=1;
	   else
		PIN_LCMDATA=1; 
	   data_lcm=data_lcm>>1;
	
	  PIN_LCMWR=1;
	}
		
	 data_lcm=*lcm_addr;//LCM_DISP.LCM_ADDR;
	 for(unI=0;unI<8;unI++)//write addr
	 {
	   PIN_LCMWR=0;
			  
	   if(data_lcm&0x01)
	   PIN_LCMDATA=1;
	   else
	   PIN_LCMDATA=1; 
	   data_lcm=data_lcm>>1;
	
	   PIN_LCMWR=1;
	 }
	
	 for(unK=0;unK<datalen;unK++)
      { 
	    
	     LCM_DATA.vimdata[0]=*data_addr++;//LCM_DISP.LCM_DATA;
         data_lcm=LCM_DATA.DISP.data_h;
	     for(unJ=0;unJ<4;unJ++)
	     {
		      PIN_LCMWR=0;
			  
			  if(data_lcm&0x01)
			  PIN_LCMDATA=1;
			  else
			  PIN_LCMDATA=1; 
			  data_lcm=data_lcm>>1;
			  PIN_LCMWR=1;
	     }
         data_lcm=LCM_DATA.DISP.data_l;
	     for(unJ=0;unJ<4;unJ++)
	     {
		      PIN_LCMWR=0;
			  
			  if(data_lcm&0x01)
			  PIN_LCMDATA=1;
			  else
			  PIN_LCMDATA=1; 
			  data_lcm=data_lcm>>1;
			  PIN_LCMWR=1;
	     }


        }
}
void LCM_READ_MODIFY_WRITE(void)
{


}
void LCM_READ_MODIFY_WRITE_ALL(void)
{

}
void LCM_COMMAND_MODE(void)
{


}


void SendBit_1626(uchar Wdata,uchar cnt) //data 的高cnt 位写入HT1621,高位在前
{
	uchar i;
	for(i =0; i <cnt; i ++)
	{
		if((Wdata&0x80)==0) PIN_LCMDATA=0;
		else PIN_LCMDATA=1;
		PIN_LCMWR=0;
		delay();
		PIN_LCMWR=1;
		Wdata<<=1;
	}
}
void SendDataBit_1626(uchar Wdata,uchar cnt) //data 的低cnt 位写入HT1621,低位在前
{
	uchar i;
	for(i =0; i <cnt; i ++)
	{
		if((Wdata&0x01)==0) PIN_LCMDATA=0;
		else PIN_LCMDATA=1;
		PIN_LCMWR=0;
		delay();
		PIN_LCMWR=1;
		Wdata>>=1;
	}
}

void SendCmd(uchar command)
{
	PIN_LCMCS=0;
	SendBit_1626(0x80,4);    //写入标志码“100”和9 位command 命令于
	SendBit_1626(command,8); //没有使有到更改时钟输出等命令,为了编程方便
	PIN_LCMCS=1;                    //直接将command 的最高位写“0”
}
void Write_1626(uchar addr,uchar Wdata)
{
	PIN_LCMCS=0;
	SendBit_1626(0xa0,3); //写入标志码“101”
	SendBit_1626(addr,8); //写入addr 的8 位
	SendDataBit_1626(Wdata,4); //写入data 的低4 位
	PIN_LCMCS=1;
}
void WriteAll_1626(uchar addr,uchar *p,uchar cnt)
{
	uchar i;
	PIN_LCMCS=0;
	SendBit_1626(0xa0,3); //写入标志码“101”
	SendBit_1626(addr,8); //写入addr 的高8 位
	for(i =0; i <cnt; i++) //连续写入数据
	{
		SendDataBit_1626(*p++,4);
	}
	PIN_LCMCS=1;
}


void delay(void)
{
 uchar unI;
 for(unI=0;unI<100;unI++)
 {
  ;
 }
}
void HW_Intialize(void)
{

	    SYSCLK_Init();                         // 时钟初始化
	    //CP0E ECI0E        PCA0ME         UART0EN SPI0EN SMB0EN
	    //位7  位6   位5    位4     位3    位2     位1    位0
		XBR0 = 0x05;	// XBAR0: Initial Reset Value
		//SYSCKE T2EXE T2E INT1E T1E INT0E T0E CP1E
	    //位7    位6   位5 位4   位3 位2   位1 位0
		XBR1 = 0x04;	// XBAR1: Initial Reset Value
	
		//WEAKPUD XBARE - T4EXE T4E UART1E EMIFLE CNVSTE
	    //位7     位6 位5 位4   位3  位2   位1    位0 
		XBR2 = 0xC4;	// XBAR2: Initial Reset Value
// Select Pin I/0
	   SMB0CN = 0x44;                         // 允许SMBUS, 应答返回AA(低电平
	   SMB0CR = 0xc9;                   // SMBus 速率= 100 kHz,系统时钟为11.0592MHZ
	   EIE1 |= 2;                             // SMBus 中断使能
	   TMOD=0x11;                  //定时器0,1和2设定及开启
	   TH0=(65536-1000)/256;
	   TL0=(65536-1000)%256;
	   TH1=(65536-10000)/256;
	   TL1=(65536-10000)%256;
	   TR0=1;
	   TR1=1;
	   IE=0x8a;                    //定时中断开启
	   EA = 1;                                // 开中断
	   SM_BUSY = 0;                           //  SM_BUSY是忙碌标志位
	   SI = 0;                                //SM_BUSY中断标志位

}
/**********************************************************************
 *  名称: timer0_Interrupt
 *
 *  参数: 
 *
 * 返回: 
 *
 * 描述: 
 *
 *********************************************************************/
void timer0_Interrupt() interrupt 1        //基准定时0中断 1ms
{
    Key_Time_Counter++;
	VFD_Refresh_Time_Counter++;
    TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
}

/**********************************************************************
 *  名称: timer0_Interrupt
 *
 *  参数: 
 *
 * 返回: 
 *
 * 描述: 
 *
 *********************************************************************/

void timer1_Interrupt() interrupt 3       //基准定时1中断10ms
{
    Key_Stuck_Time_Counter++;
    flash_time_counter++;
    TH1=(65536-10000)/256;
    TL1=(65536-10000)%256;
}

void SMBUS_ISR (void) interrupt 7    //中断服务程序
{
   switch (SMB0STA)
{                 // 根据中断状态码跳转
                                     //(SMB0STA 是中断状态寄存器)
       case SMB_START:	             //0x08, (MT & MR) 发送起始位
         SMB0DAT =SLADDR;            // 装入被访问的从芯片的写地址//WW
         STA = 0;                    // 人工清除 STA 位
         SI = 0;                     // 清除中断标志位
         break;
       case SMB_RP_START:	         //0x10,(MT & MR) 重复发送起始位
         SMB0DAT =SLADDR;             // 装入被访问的从芯片的读地址//R
         STA = 0;                    // 人工清除 STA 位
         SI = 0;                     // 清除中断标志位
         break;
       case SMB_MTADDACK:            //0x18 ,(MT) 发送从地址 + W 后收到ACK
         SMB0DAT = WORDADR;
         SI = 0;                     // 清除中断标志位
         break;
       case SMB_MTADDNACK:     	    //0x20,(MT) 发送从地址 + W 后收到NACK
         STO = 1;
         STA = 1;
         SI = 0;                    // 清除中断标志位
         break;
      case SMB_MTDBACK:		        //0x28,(MT) 发送数据后收到ACK
         switch (SENDMODE)
         {         // 检查低1位
	       case 1:
				   sendnumber--;
				   if(sendnumber)
				   SMB0DAT = WORD;
				   else{
				   		STO=1;
					   	SM_BUSY=0;
					}
	              break;             
	       case 0:
				     STO = 0;
	               STA = 1;
	               break;            
	       default:              
	               STO = 1;
	               SM_BUSY = 0;
	               break;
         }
         SI = 0;
         break;
      case SMB_MTDBNACK:	//0x30
         STO = 1;
         STA = 1;
         SI = 0;                          // 清除中断标志
         break;
      case SMB_MRADDACK:	//0x40
         AA = 0;                        
         SI = 0;
         break;
   	  case SMB_MRADDNACK:	//0x48
         STO = 0;
         STA = 1;
         SI = 0;
         break;
     case SMB_MRDBNACK:	    //0x58
         WORD = SMB0DAT;
         STO = 1;
         SM_BUSY = 0;
         AA = 1;                          
         SI = 0;
         break;
      default:
         STO = 1;
         SM_BUSY = 0;
         break;
      }
}

⌨️ 快捷键说明

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