|
#include <mega16.h>
#include <USART.h>
#include <DELAY.h>
#include <Types.h>
/*************************************************
开发板类型:AVRKIT V2
芯片小板 :M16
连线方法 :
ISP1 -- ISP2
PORTB -- LED.G
PORTC -- LED.R
*************************************************/
#pragma warn-
#define MAXEEPROM 512
eeprom unsigned char EEPROMS[MAXEEPROM];
#pragma warn+
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0x00;
USART_Init(47); //3.6864M=23, 7.3728M=47
}
void TestCmd(void)
{
unsigned char Cmd; //命令缓冲区
unsigned char LED; //LED数据缓冲区
unsigned char State; //LED显示状态
State=0;
LED=0;
PORTC.0=0;
TransmitLineF("USART EXAMPLE"); //从串口送出字符串
while (1)
{
Cmd=0;
if (UCSRA&(1<<RXC)) //串口有信息吗?
{
Cmd=UDR; //如果有,接收一个字节
}
if ((Cmd>='0')&&(Cmd<='9'))
{
State=Cmd-'0';
//PORTD=~PORTD;
switch (Cmd)
{
case '0':
{
TransmitLineF("USART EXAMPLE");
PORTC=~(1<<0);
break;
}
case '1':
{
TransmitLineF("Inc Counter");
PORTC=~(1<<1);
break;
}
case '2':
{
TransmitLineF("Dec Counter");
PORTC=~(1<<2);
break;
}
case '3':
{
TransmitLineF("Shift Left");
PORTC=~(1<<3);
break;
}
case '4':
{
TransmitLineF("Shift Right");
PORTC=~(1<<4);
break;
}
case '5':
{
TransmitLineF("Logic Not ");
PORTC=~(1<<5);
break;
}
case '6':
{
TransmitLineF("Data Test Mode");
PORTC=~(1<<6);
break;
}
case '7':
{
TransmitLineF("Swap High and Low");
PORTC=~(1<<7);
break;
}
default:
{
TransmitLineF("Error CMD");
}
}
}
switch (State) //如果LED显示状态条件为...
{
case 1: //如果LED显示模式为第一种
{
LED++; //LED显示模式做加法运算
break;
};
case 2:
{
LED--; //LED显示模式做加法运算
break;
}
case 3:
{
LED=LED<<1; //LED显示模式做左移位运算
if (!LED) LED=0x03; //如果超越范围<灯全灭了>,则重新初始为0x03,就是只有右边[A0,A1]二灯亮
break;
}
case 4:
{
LED=LED>>1; //LED显示模式做右移位运算
if (!LED) LED=0xC0;//如果超越范围<灯全灭了>,则重新初始为0xC0,就是只有左边[A7,A6]二灯亮
break;
}
case 5:
{
if ((LED!=0) && (LED!=0xFF)) {LED=0;} //如果所有的LED灯不是全亮或全灭,则设置为全灭
LED=~LED; //LED显示模式做取反运算
break;
}
case 6:
{
if (LED==0x55)
{LED=0xAA;} //LED做相隔一位
else
{LED=0x55;}
break;
}
case 7:
{
if (LED==0xF0)
{LED=0x0F;} //LED高4位和低4位相互亮
else
{LED=0xF0;}
break;
}
case 8:
{
//LED=0x00; //没代码,LED不动,这个地方大家可随便自己改点什么的。
}
}
PORTB=~LED;
delay_ms(200);
}
}
char StrCmpF(unsigned char * Sour, flash unsigned char * Dest, unsigned char Case)
{
register char s;
register char d;
while ((*Sour)&&(*Dest))
{
s=*Sour;
d=*Dest;
if (Case)
{
if ((s>=0x61)&&(s<=0x7A)) {s&=0B11011111;};
if ((d>=0x61)&&(d<=0x7A)) {d&=0B11011111;};
}
if (s==d)
{
Sour++;
Dest++;
}
else
return 0;
}
if ((*Sour==0)&&(*Dest!=0)) {return 0;}
if ((*Sour!=0)&&(*Dest==0)) {return 0;}
return 1;
}
void TestString(void)
{
unsigned char CmdBuf[CMD_MAXBUFFER];
unsigned char * str;
unsigned char i;
PORTC.1=0;
str=&CmdBuf[1];
TransmitLineF("USART String Example"); //从串口送出字符串
while (1)
{
ReceiveString(CmdBuf);
if (CmdBuf[0]>0)
{
PORTC.7=0;
//TransmitByte(CmdBuf[0]);
//TransmitString(str);
if (StrCmpF(str,"Hi",1))
{
TransmitStringF("Hello");
TransmitByte(0);
goto next;
}
if (StrCmpF(str,"Who",1))
{
TransmitStringF("Aleyn");
TransmitByte(0);
goto next;
}
if (StrCmpF(str,"Date",1))
{
TransmitStringF("2006-04-28");
TransmitByte(0);
goto next;
}
if (StrCmpF(str,"Time",1))
{
TransmitStringF("22:39:01");
TransmitByte(0);
goto next;
}
if (StrCmpF(str,"Good",1))
{
TransmitStringF("Thank you");
TransmitByte(0);
goto next;
}
if (StrCmpF(str,"GoodBye",1))
{
TransmitStringF("See you next time");
TransmitByte(0);
goto next;
}
TransmitStringF("Error Command");
TransmitByte(0);
next:
PORTC.7=1;
for (i=0;i<CMD_MAXBUFFER;i++) {CmdBuf=0;}
}
}
}
#define CMD_HELP 72
#define CMD_READ 82
#define CMD_WRITE 87
void TestProtocol(void)
{
unsigned int i;
unsigned char CmdBuf[CMD_MAXBUFFER]; //命令缓冲区
unsigned int Addr; //内存地址
unsigned int Cnt; //读取长度
PORTC.2=0;
while (1)
{
ReceiveCMD(CmdBuf); //读取一条命令行
if (CmdBuf[0]>0) //如果命令行长度不为零
{
PORTC.7=0;
TransmitByte(CMD_BEGIN); //送出命令开始符
if (CmdBuf[1]==CMD_HELP) //如果接收的是帮助命令
{
TransmitByte(CMD_HELP); //送出命令
TransmitStringF("Test Protocol Version 1.0");
TransmitByte(13);
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);
}
if (CmdBuf[1]==CMD_READ) //如果接收的是读取EEPROM命令
{
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<=MAXEEPROM)
{
TransmitByte(CMD_READ); //送出命令
for (i=0;i<Cnt;i++)
{
TransmitString(ByteToHex(EEPROMS[Addr+i])); //送回上位机
TransmitByte(32);
}
}
else
{
TransmitByte(CMD_HELP); //送出命令
TransmitStringF("ERROR:Addr+Count Large then 512");
}
}
if (CmdBuf[1]==CMD_WRITE) //如果接收的是写入EEPROM命令
{
Addr=(((unsigned int)HexToByte(&CmdBuf[6]))<<8)|((unsigned int)HexToByte(&CmdBuf[8]));
if (Addr<MAXEEPROM)
{
TransmitByte(CMD_WRITE); //送出命令
EEPROMS[Addr]=HexToByte(&CmdBuf[10]);
delay_ms(2); //写EEPROM的时候要隔5ms
TransmitString(ByteToHex(EEPROMS[Addr])); //回送给上位机做检查
}
else
{
TransmitByte(CMD_HELP); //送出命令
TransmitStringF("ERROR:Addr Large then 512");
}
}
TransmitByte(CMD_END); //送出命令结束符
for (i=0;i<CMD_MAXBUFFER;i++) CmdBuf=0; //清空命令缓冲区
PORTC.7=1;
}
}
}
void main()
{
port_init();
while (1)
{
if (!PIND.4) TestCmd();
if (!PIND.5) TestString();
if (!PIND.6) TestProtocol();
}
}
AVR源程序
DELPHI源程序 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|