📄 testavrkit.c
字号:
#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 + -