搜索
bottom↓
回复: 8

国庆大餐之,DELPHI与AVR软硬结合应用的例子。

[复制链接]

出0入4汤圆

发表于 2006-9-29 12:01:42 | 显示全部楼层 |阅读模式
#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源程序

出0入0汤圆

发表于 2007-11-9 14:29:50 | 显示全部楼层
村长,怎么不说说具体功能呢?

小弟刚想入门dephi,呵呵。多指教。

出0入8汤圆

发表于 2007-11-21 11:29:47 | 显示全部楼层
村长好
我用delphi打开你发的源程序,出现如下错误,可能是少了什么东东
初学delphi,请多指教

出0入4汤圆

 楼主| 发表于 2007-11-21 14:05:32 | 显示全部楼层
to 【1楼】 benladn911
这是去年的贴子了,记不大清楚,应该是下位机是一个AT24CXX的读写器,上位机是读写应用程序。

to 【2楼】 rube
你需要安装一个CPort 3.0 的控件(去www.2ccc.com下载)。

出0入8汤圆

发表于 2007-11-21 17:58:18 | 显示全部楼层
村长是个热心人
谢谢村长!

出0入0汤圆

发表于 2009-10-27 09:10:34 | 显示全部楼层
谢谢村长

出0入0汤圆

发表于 2009-10-27 22:01:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-14 17:03:12 | 显示全部楼层

出0入0汤圆

发表于 2010-3-4 11:12:05 | 显示全部楼层
村长:
编译后出现如下错误:
[Error] uFMainForm.pas(97): Undeclared identifier: 'WriteBuffer'
[Error] uFMainForm.pas(133): Undeclared identifier: 'ReadBuffer'
[Fatal Error] avrpc.dpr(5): Could not compile used unit 'uFMainForm.pas'
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 06:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表