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

📄 testavrkit.c

📁 AVR开发板电路图/PCB/示范程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#define UWR PORTA.1
#define UTE PINA.2
#define URE PINA.3

void InitUSB(void)
{
  PORTC=0x00;
  DDRC=0x00;
  PORTA=0B00000011;
  DDRA= 0B00000011;
  URD=1;
  UWR=1;
}

void TransData(unsigned char Data)
{
  while (UTE==1) ;
  DDRC=0xFF;
  PORTC=Data;
  UWR=0;
  UWR=1;
}

unsigned char ReceiveData(void)
{
  DDRC=0x00;
  while (URE==1) ;
  URD=0;
  URD=1;
  return PINC;
}

void TransStr(flash unsigned char * ss)
{
  while (*ss)
  {
    TransData(*ss);
    ss++;
  }
}

void TestFT245BM(void)
{
  unsigned char i;
  
  TransmitLineF("Cable setting: "); 
  TransmitLineF("-----------------------------------------");
  TransmitLineF("  USBP.UD0~UD7 <--> PortC.P0~P7");
  TransmitLineF("  USBP.URD     <--> PortA.P0");
  TransmitLineF("  USBP.UWR     <--> PortA.P1");
  TransmitLineF("  USBP.UTE     <--> PortA.P2");
  TransmitLineF("  USBP.URE     <--> PortA.P3");
  TransmitLineF("-----------------------------------------");
  Pause();
  
  InitUSB();
  
    for (i=0;i<255;i++)
    {
		TransData(i);
		TransmitByte(i);
	}
	TransData(0xFF);
	TransmitByte(0xFF);
    TransStr("(USB)Hello World");
    
    TransmitStringF("(COM)Hello World");
    delay_ms(100);

  
  while (1)
  {   
    if (URE==0)
	{
		i=ReceiveData();
		TransmitByte(i);
	}
	if (UCSRA&(1<<RXC))
	{
		i=UDR;
		TransData(i);
	}
  }
}

/*****************************************************************************/
#define MAXCMDBUF 17

void TestLCD (void)
{
   unsigned char cnt,i;
   unsigned char ss[3][MAXCMDBUF]={"DELPHI & AVR","CMD:","Command"};
   unsigned char BUFFER[MAXCMDBUF];
   unsigned char Index;
   char *sp;
   unsigned char Cmd;

  TransmitLineF("Cable setting: DLED2 <--> PortA, DLED1 <--> PortC"); 
  Pause();
  
  DDRB=0xFF;
  PORTB=0xFF;

  for (i=1;i<2;i++)
   delay_ms(1000);  //LCD上电中,延迟2秒

  LCD_Init();  //初始化LCD
  
  Index=0;

  cnt=1;
  LCD_Ctrl(LCD_HOME);
  LCD_DELAY(150);

  LCD_Ctrl(LCD_SET_DDRAM);
  sp=&ss[0][0];
  LCD_PutStr(sp);
  LCD_Ctrl(0xC0);
  sp=&ss[1][0];
  LCD_PutStr(sp);
  LCD_DELAY(1000);
  Cmd=0;
  while (1)
  {
      if (UCSRA&(1<<RXC)) //串口有信息吗?
       {
       Cmd=UDR;    //如果有,接收一个字节
       if ((Cmd>=32) && (Cmd<=127))
       {
         BUFFER[Index]=Cmd;
         if (Index++ >MAXCMDBUF ) Index=0;
       }     
       }
      if (Cmd==0x0D )
      {
        LCD_Ctrl(0x90);
        sp=&ss[2][0];
        LCD_PutStr(sp);
        LCD_DELAY(1000);
        
        LCD_Ctrl(0xC0);
        sp=&BUFFER[0];
        LCD_PutStr(sp);
        LCD_DELAY(1000);
        
        Index=0;
        for (i=0;i<MAXCMDBUF;i++) BUFFER[i]=0;
        Cmd=0;
       }
        //if (cnt++>16) cnt=1;
 }
}
/*****************************************************************************/
void TestAT24C04(void)  //初始化各端口
{
	unsigned int i;
  unsigned char CmdBuf[MAXCMDBUF]; //命令缓冲区
  unsigned char Chip;    //芯片地址
  unsigned int Addr;     //内存地址
  unsigned char AddrType;//内存地址格式 8 bit 或16 bit
  unsigned int Cnt;      //读取长度
  unsigned char LED;     //LED显示,作用不大
  
	TransmitLineF("Cable setting: "); 
	
	TransmitLineF("  VCC <--> AT24C04.VCC");
	#if defined _CHIP_ATMEGA128_ | defined _CHIP_ATMEGA128L_
    TransmitLineF("  PortD.0 <--> AT24C04.SCL");
    TransmitLineF("  PortD.1 <--> AT24C04.SDA");
	DDRD=0xFF;
	PORTD.2=0;
	PORTD.3=0;
	#elif defined _CHIP_ATMEGA16_ | defined _CHIP_ATMEGA16L_
    TransmitLineF("  PortC.0 <--> AT24C04.SCL");
    TransmitLineF("  PortC.1 <--> AT24C04.SDA");
	DDRC=0xFF;
	PORTC.2=0;
	PORTC.3=0;
	#endif
    TransmitLineF("  GND <--> AT24C04.WP1");
    TransmitLineF("  GND <--> AT24C04.WP2");
    TransmitLineF("  GND <--> AT24C04.GND");
	TransmitLineF(" ");   
  
    TWI_DefaultInit();

	for (i=0;i<CMD_MAXBUFFER;i++) CmdBuf[i]=0;  //初始化命令缓冲区
	LED=0;
	while (1)
	{
	 ReceiveCMD(CmdBuf);	//读取一条命令行
     if (CmdBuf[0]>0)   //如果命令行长度不为零
    {
           //for (i=0;i<MAXCMDBUF;i++) TransmitByte(CmdBuf[i]);
     TransmitByte(CMD_BEGIN);   //送出命令开始符
     TransmitByte(CmdBuf[1]);  //送出命令
     if (CmdBuf[1]=='H') //如果接收的是帮助命令
     {
       TransmitStringF("Command format(Hex):'1B CMD 1C'");
       TransmitByte(13);
       TransmitStringF("Read EEPROM Data:'R','Addr','Count'");
       TransmitByte(13);
       TransmitStringF("Write EEPROM Data:'W','Addr','Data'");
       TransmitByte(13);
       TransmitStringF("Show Help:'H'");
       TransmitByte(13);
       PORTB=~PORTB;
     }               
     if (CmdBuf[1]=='R') //如果接收的是读取EEPROM命令
     {
       AddrType=HexToByte(&CmdBuf[2]);  //EEPROM地址类型
       Chip=(HexToByte(&CmdBuf[4])&0B00001110)|EEPROM_BUS_ADDRESS; //芯片地址
       Addr=(((unsigned int)HexToByte(&CmdBuf[6]))<<8)|((unsigned int)HexToByte(&CmdBuf[8])); //内存地址
       Cnt=(((unsigned int)HexToByte(&CmdBuf[10]))<<8)|((unsigned int)HexToByte(&CmdBuf[12])); //读写个数
       if (Addr+Cnt>255) Cnt=255-Addr;
       for (i=0;i<Cnt;i++) 
         {
          TransmitString(ByteToHex(EEPROM_Read(Chip,AddrType,Addr+i)));  //送回上位机
          TransmitByte(32);
         }
     }
     if (CmdBuf[1]=='W') //如果接收的是写入EEPROM命令
     { 
       AddrType=HexToByte(&CmdBuf[2]);
       Chip=(HexToByte(&CmdBuf[4])&0B00001110)|EEPROM_BUS_ADDRESS;
       Addr=(((unsigned int)HexToByte(&CmdBuf[6]))<<8)|((unsigned int)HexToByte(&CmdBuf[8]));
       EEPROM_Write(Chip,AddrType,Addr,HexToByte(&CmdBuf[10]));
       delay_ms(5);  //写EEPROM的时候要隔5ms
       TransmitString(ByteToHex(EEPROM_Read(Chip,AddrType,Addr)));  //回送给上位机做检查
     }
   TransmitByte(CMD_END); //送出命令结束符
   for (i=0;i<CMD_MAXBUFFER;i++) CmdBuf[i]=0;  //清空命令缓冲区
   }
	LED++;
	//PORTB&=~((LED>>7)&0x03);
	}
}
/*****************************************************************************/

#define IRBufferMax 64
unsigned char IRTime=0;
unsigned char IRTiger=0;
unsigned char IRIndex=0;
unsigned char IRBuffer[IRBufferMax];

interrupt [TIM2_OVF] void timer2_ovf_isr(void)  //利用时间中断2来取得红外接收头的脉冲宽度
{
    //#asm("cli")
    
    if (IRTime<255)   
    {
        IRTime++;
    }
    else if (IRIndex>1)
    {
        IRTiger=1;
    }
    //#asm("sei")
}

interrupt [EXT_INT2] void ext_int2_isr(void) //利用外部中断0来取得红外接收头的下降沿脉冲
{
    //#asm("cli")
    if ((IRIndex<IRBufferMax)&&(!IRTiger))
    {
        IRBuffer[IRIndex++]=IRTime;
        IRTime=0;
    }
    //#asm("sei")
}
void TestInfrared(void)
{
	unsigned char State=0;
	unsigned char i,j;
    unsigned char IRCmd[4];

    #ifdef _MEGA128_INCLUDED_
	TransmitLineF("Cable setting: IR.IR#--INT2"); 
	#else
	TransmitLineF("Cable setting: IR.IR#--PortB.2(INT2)"); 
	#endif
	Pause();

	// Timer/Counter 2 initialization
	// Clock source: System Clock
	// Clock value: 921.600 kHz
	// Mode: Normal top=FFh
	// OC2 output: Disconnected
	TCCR2=0x02;
	TCNT2=0x00;
	OCR2=0x00;
    
    TIMSK=(1<<TOIE2);
	
    #ifdef _MEGA128_INCLUDED_
	EICRA=0x02;
	EICRB=0x00;
	EIMSK|=(1<<INT2);
	EIFR=0x01;
	#else
    GICR|=(1<<INT2);
    MCUCR=0x02;
    MCUCSR=0x00;
    GIFR=0x40;
	#endif
    
	State=0;
	   
    #asm("sei")
    
	while (1)
		{
            if ((IRTiger==1)&&(IRIndex>1))
            {
				#ifdef _MEGA128_INCLUDED_
                EIMSK&=~(1<<INT2);
				#else
                GICR&=~(1<<INT2);
				#endif
				
                for (i=2;i<IRIndex-2;i++)
                {
                    if (IRBuffer[i]<0x20)
                    {
                        IRBuffer[i]=((IRBuffer[i]+1)&0x0C)>>3;
                    }
                    TransmitByte(IRBuffer[i]);
                }
                if (IRIndex>0x20)
                {
                    for (i=0;i<4;i++)
                    {                        
                        IRCmd[i]=0;
                        for (j=0;j<8;j++)
                        {
                            IRCmd[i]|=(IRBuffer[i*8+2+j]<<j);
                        }
                    }
                    for (i=0;i<4;i++)
                    {
                        TransmitByte(0);
                    }
                    for (i=0;i<4;i++)
                    {
                        TransmitByte(IRCmd[i]);
                    }
                }
                IRTiger=0;
                IRIndex=0;
                
				#ifdef _MEGA128_INCLUDED_
                EIMSK|=(1<<INT2);
				#else
                GICR|=(1<<INT2);
				#endif
            }
		}

}

/*****************************************************************************/
void main(void)
{
  unsigned char MenuIndex;
  
  flash unsigned char *Menu[0x0b]={
  "1.Test All port output",
  "2.Test Key press",
  "3.Test DLED",
  "4.Test AT24C04",
  "5.Test DS1302",
  "6.Test LCD1602",
  "7.Test Sound",
  "8.Test FT245BM",
  "9.Test RS-485",
  "A.Test AT45DB041B",
  "B.Test Infrared"
  };
 
  USART_Init(DefaultBaudRate);
  
  //UCSR1A=0x00;
  //UCSR1B=0x18;
  //UCSR1C=0x06;
  //UBRR1H=0x00;
  //UBRR1L=0x2F;

  TransmitLineF("Test AVRKIT Menu v1.0");
  TransmitLineF("-----------------------------------");
  for (MenuIndex=0;MenuIndex<0x0b;MenuIndex++)
  TransmitLineF(Menu[MenuIndex]);
  TransmitLineF("-----------------------------------");
  TransmitLineF("Please Choose Item:");

  while (1)
  {
	  MenuIndex=ReceiveByte();	
	  
	  if ((MenuIndex>='1')&&(MenuIndex<='9'))
	  {
		TransmitLineF(Menu[MenuIndex-'1']);
	  }
	  else if ((MenuIndex>='A')&&(MenuIndex<='B'))
	  {
		TransmitLineF(Menu[MenuIndex-'A'+9]);
	  }
	  else if ((MenuIndex>='a')&&(MenuIndex<='b'))
	  {
		TransmitLineF(Menu[MenuIndex-'a'+9]);
	  }
	  else 
	  {
		TransmitLineF("Bad Command.");
	  }
	  switch (MenuIndex)
	  {
	  case '1': TestAllPort();
	  case '2': TestKeyPress();
	  case '3': TestDLED();
	  case '4': TestAT24C04();
	  case '5': TestDS1302();
	  case '6': TestLCD();
	  case '7': TestSound();
	  case '8': TestFT245BM();
	  case 'B':
	  case 'b': TestInfrared();
	  default:{TransmitLineF("Not Support");}
	  
	  }
  }
}

⌨️ 快捷键说明

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