极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23170|回复: 7

想问一下,Arduino 可以定义枚举类型不?怎样定义?,Arduino 可以定义枚举类型不...

[复制链接]
发表于 2014-4-22 10:45:01 | 显示全部楼层 |阅读模式
本帖最后由 tcsun 于 2014-4-22 10:56 编辑

请问一下大家,Arduino 可以定义枚举类型不?怎样定义?

例如C 的:
                                 typedef enum _RT500_LOCK
                               {
                                     RT_Unlock=0,
                                     RT_Lock=1,
                               }RT500_LOCK;
回复

使用道具 举报

发表于 2014-4-22 11:19:21 | 显示全部楼层
  1.   enum friends { PETER, MARY, JOHN };
  2.   friends myFriend;

  3.   myFriend = PETER;
复制代码
回复 支持 反对

使用道具 举报

发表于 2014-4-22 11:20:45 | 显示全部楼层
就按你例如C的方法定义,arduino不是语言,是一个库,他所用语言是C/C++(支持部分特性),编译器是avr-gcc,所以你只要按C语言的编程方式来就可以。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-22 11:29:07 | 显示全部楼层
pathletboy 发表于 2014-4-22 11:20
就按你例如C的方法定义,arduino不是语言,是一个库,他所用语言是C/C++(支持部分特性),编译器是avr-gcc, ...

首先感谢pathletboy回复,

我就是按这样定义的报错,
”RT_Lock=1,“这个地方报错!
回复 支持 反对

使用道具 举报

发表于 2014-4-22 11:36:37 来自手机 | 显示全部楼层
本帖最后由 pathletboy 于 2014-4-22 11:41 编辑

我帮你测试了,可以正常编译通过。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-22 11:46:12 | 显示全部楼层
pathletboy 发表于 2014-4-22 11:36
我帮你测试了,可以正常编译通过。

pathletboy:

因为不上传不了附件,只能将代码贴上。

/////////////////////////////////////////////////////////////////////////////////////////////////////////


/****************************************************************
** 项目名:     ATV 信号源
** 芯片型号:   RT500 (RF modulators 芯片,厂商:Rafael Micro)
** 程序名:     ATV_Source
** 作者:       sunny.sun
** 日期:       2014-04-20
******************************************************************/

/*****************************************************************
** 库函数说明:
begin()  //初始化Wire库,和设置I2C总线主从机
begin(address)  //带地址参数就是从机,不带就是主机
requestFrom(address, count) //在启动I2C总线后,可以继续访问另一个地址,和访问次数
beginTransmission(address) //开始给从机发送地址
endTransmission() //结束本次I2C通讯,与上条函数成对使用
send() //发送数据
byte available() //用于判断数据是否有效,有效才开始接收
byte receive() //接收数据
onReceive(handler) //从机接收主机发来的数据,
onRequest(handler) //主机请求从机发送数据
***********************************************************************/


#include <Wire.h>

///////////////////////////// 宏定义 ////////////////////////////////////
#define RT500_CHIP_ID                0xCA
//#define RT500_DEVICE_ADDRESS    RT500_CHIP_ID>>1;
//#define RT500_Xtal                16000
//#define RT500_Reg_Num                11

/*****************************************************
typedef enum _RT500
{
   MinCurrent=70,
   MaxCurrent=90,
   MinVoltage=3150,
   MaxVoltage=3320,
}RT500;


typedef enum _RT500_FREQ
{
  FREQ_N10K=0,   
  FREQ_P10K=15,
  FREQ_N40K=1,
  FREQ_P40K=14,
  FREQ_N60K=2,
  FREQ_P60K=13,
  FREQ_N90K=3,
  FREQ_P90K=12,
  FREQ_N110K=4,
  FREQ_P110K=11,
  FREQ_N140K=5,
  FREQ_P140K=10,
  FREQ_N160K= 6,
  FREQ_P160K=9,
  FREQ_MAX=7,
  FREQ_MIN= 8,
}RT500_FREQ;

*/
/****************************************************************************
** 说明:
RT500_ErrCode” 定義 RT500 每一個函數設定狀態。如果回傳值為
RT_Fail 表示 RT500 設定有問題。該函數將會回傳 Fail 而且不會再繼續設定 RT500
******************************************************************************
typedef enum _RT500_Err_Type
{
    RT_Success = 1,
    RT_Fail    = 0

       
}RT500_Err_Type;

/*********************************************************************************
typedef enum _RT500_LOCK
{
RT_Unlock=0,
RT_Lock=1,
}RT500_LOCK;

/***********************************************************************************
** 说明:
定義RT500所支持的模擬電視系統
************************************************************************************
typedef enum _RT500_Standard_Type
{
        RT_Standard_M_N = 0,
        RT_Standard_B_G_H,
        RT_Standard_I,
        RT_Standard_D_K,
        RT_Standard_L,
        RT_Standard_Max,
}RT500_Standard_Type;

/**************************************************************************************
** 说明:
RT500_Power_Type” 定義 RT500 的各種使用狀態開/關,如調變模式,環通路功能、待機功能。
- All_ON: Modulator On, Loop through On
- Mod_ON: Modulator On, Loop through Off
- LT_ON: Modulator Off, Loop through On
- Standby_ON: Modulator Off, Loop through off
****************************************************************************************
typedef enum _RT500_Power_Type
{
        All_ON = 0,
        Mod_ON,
        LT_ON,
        Standby_ON
}RT500_Power_Type;

/************************************************************************************************
** 说明:
提供 RT500 video輸入衰減設定資訊。請根據RT500的輸入電壓振幅來決定此設定。
如果輸入電壓振幅1.0Vpp, 選用Att_1; 如果輸入電壓振幅為2.0Vpp,選用Att_0_5,詳細原理可參考第十
章節。
************************************************************************************************
typedef enum _RT500_Video_Att
{
        Att_1=0,
        Att_0_75,
        Att_0_63,
        Att_0_5

}RT500_Video_Type;

/*************************************************************************************************
** 说明:
提供 RT500 audio 輸入衰減設定資訊。一般對80% FM 調變而言,1 kHz 聲音源,其
標準輸入振幅為1.0Vpp ~1.2Vpp。請根據聲音輸入振幅來決定此設定。詳細原理可參考第十章節的 ”Audio
Input Attenuator design
***************************************************************************************************
typedef enum _RT500_Sound_Att
{
        Att_8k=0,
        Att_7k,
        Att_6k,
        Att_5k,
        Att_4k,
        Att_3k,
        Att_2k,
        Att_1k
}RT500_Sound_Type;


/*************************************************************************************************
** 说明:
提供 RT500 RF 輸出大小設定
***************************************************************************************************
typedef enum _RT500_RF_Att
{
        RFAtt_0=0,  // 85.2 dBuv (highest)
        RFAtt_1,        // 83.2 dBuV
        RFAtt_2,        // 81.5 dBuV
        RFAtt_3,        // 78.6 dBuV
        RFAtt_4,        // 76.4 dBuV
        RFAtt_5,        // 73.3 dBuV
        RFAtt_6,        // 70.9 dBuV
        RFAtt_7     // 67.7 dBuv (lowest)
}RT500_RF_ATT_Type;

/*************************************************************************************************
** 说明:
   提供 RT500 RF 輸出大小設定是否要額外衰減。若設置為RFAtt_6DB,代表RF 輸出會再多衰減6dB。
**************************************************************************************************
typedef enum _RT500_RF_ATT_6DB
{
        RFAtt_0DB=0,
        RFAtt_6DB    //attenuation extra 6dB
}RT500_RF_ATT_6DB_Type;

/*--------------------------------------------------*
// Data Type Redefine
//--------------------------------------------------
typedef unsigned char BYTE;
typedef unsigned char u8;
typedef char          SBYTE;
typedef unsigned int  WORD;
typedef        int           SWORD;
typedef unsigned long DWORD;
typedef long          SDWORD;
typedef unsigned long UINT32;

/////////////////////////////////////////////////////////////////////////////////////////////////////
*
u8 RT500_Reg_Arry[RT500_Reg_Num] = {0x00, 0x88, 0x80, 0x04, 0x59, 0x4B, 0xE8, 0x70, 0x06, 0x2F, 0x08};
                                    // 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E
u8 RT500_Reg_Cunt = 0;


/****************************** 初始化设置 **********************************************************/
void setup()
{
       Wire.begin();                 //初始化I2C
       Serial.begin(9600);         //初始化串口,波特率为9600
       //Rtcc_Addr=RTCC_R>>1;   

}

/******************************* 读数据函数 **********************************************************
boolean RT500_Read_Mode(void)
{
    u8  temp0=0;
    u8  temp1=0;
    u8  temp2=0;
    u8  temp3=0;
    if(!I2C_Start())return FALSE;
          I2C_SendByte(RT500_DEVICE_ADDRESS+1);
    if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}

          temp0=I2C_ReceiveByte();
         I2C_Ack();
         temp1=I2C_ReceiveByte();
         I2C_Ack();
         temp2=I2C_ReceiveByte();
         I2C_Ack();
         temp3=I2C_ReceiveByte();
         I2C_NoAck();
         
           I2C_Stop();
                   if(temp0==0x69&&temp2==0xF0&&temp3==0xF0)
                           {
                           if((temp1&0x01)==0x01)
                                LockFlag1=RT_Lock;
                        else
                                  LockFlag1=RT_Unlock;
                          return(LockFlag1);
                                   }
                   else
                           {
                               LockFlag1=RT_Unlock;
         return(LockFlag1);
                           }
}

/************************************* 电源模式设置 ***********************************************************
RT500_Err_Type  RT500_Power_Mode(u8  powerModel)
{
    RT500_Reg_Arry[9] &= 0xF8;
    switch(powerModel)
    {
        case All_ON:
                RT500_Reg_Arry[0] = 0x00;
                RT500_Reg_Arry[1] = 0x88;
                RT500_Reg_Arry[9] |= 0x07;
                break;
        case Mod_ON:
                RT500_Reg_Arry[0] = 0x00;
                RT500_Reg_Arry[1] = 0xA8;
                RT500_Reg_Arry[9] |= 0x07;
                break;
        case LT_ON:
                RT500_Reg_Arry[0] = 0xFE;
                RT500_Reg_Arry[1] = 0x9B;
                RT500_Reg_Arry[9] |= 0x06;
                break;
        case Standby_ON:
                RT500_Reg_Arry[0] = 0xFF;
                RT500_Reg_Arry[1] = 0xBF;
                RT500_Reg_Arry[9] |= 0x06;
                break;
        default:
                RT500_Reg_Arry[0] = 0x00;
                RT500_Reg_Arry[1] = 0x88;
                RT500_Reg_Arry[9] |= 0x07;
                break;       
    }
    WriteTunerRegister(0+4,RT500_Reg_Arry[0]);
    WriteTunerRegister(1+4,RT500_Reg_Arry[1]);
    WriteTunerRegister(9+4,RT500_Reg_Arry[9]);
    return RT_Success;
}


/************************** 电视制式标准设置 *****************************************
RT500_Err_Type  RT500_Standard_Mode(u8  StandardMode)
{
    RT500_Reg_Arry[2] &= 0xF0;
    RT500_Reg_Arry[3] &= 0x87;
    switch(StandardMode)
    {
        case RT_Standard_M_N:
                RT500_Reg_Arry[2] |= 0x08;  //r6
                RT500_Reg_Arry[3] |= 0x00;  //r7
                RT500_Reg_Arry[4] =  0xd9;//9;//0x59;  //r8
                break;

        case RT_Standard_B_G_H:
                RT500_Reg_Arry[2] |= 0x08;
                RT500_Reg_Arry[3] |= 0x30;
                RT500_Reg_Arry[4] =  0xA9;//9;//0x29;
                break;

        case RT_Standard_I:
                RT500_Reg_Arry[2] |= 0x08;
                RT500_Reg_Arry[3] |= 0x58;
                RT500_Reg_Arry[4] =0x99;//9;//0x19;
                break;

        case RT_Standard_D_K:
                RT500_Reg_Arry[2] |= 0x08;
                RT500_Reg_Arry[3] |= 0x78;
                RT500_Reg_Arry[4] =  0x89;//0x09;
                break;

        case RT_Standard_L:
                RT500_Reg_Arry[2] |= 0x05;
                RT500_Reg_Arry[3] |= 0x78;
                RT500_Reg_Arry[4] =  0x88;//0x08;                //update depend on datasheet v2.7
                break;

        default:  //DK
                RT500_Reg_Arry[2] |= 0x08;
                RT500_Reg_Arry[3] |= 0x78;
                RT500_Reg_Arry[4] =  0x81;//9;//0x09;
                break;
               
    }
    WriteTunerRegister(2+4,RT500_Reg_Arry[2]);
    WriteTunerRegister(3+4,RT500_Reg_Arry[3]);
    WriteTunerRegister(4+4,RT500_Reg_Arry[4]);
    return RT_Success;               
}

/*************************** 视频输入衰减设置 *******************************************
RT500_Err_Type  RT500_Video_Swing(u8  VideoSwing)
{
    RT500_Reg_Arry[10] &= 0xFC;
    switch(VideoSwing)
    {
        case Att_1:
                RT500_Reg_Arry[10] |= 0x00;
                break;
        case Att_0_75:
                RT500_Reg_Arry[10] |= 0x01;
                break;
        case Att_0_63:
                RT500_Reg_Arry[10] |= 0x02;
                break;
        case Att_0_5:
                RT500_Reg_Arry[10] |= 0x03;
                break;
        default:
                RT500_Reg_Arry[10] |= 0x00;
                break;
               
       
    }
    WriteTunerRegister(10+4,RT500_Reg_Arry[10]);       
    return RT_Success;
}

/******************* 音频输入设置 *******************************
RT500_Err_Type  RT500_Audio_Swing(u8  AudioSwing)
{
    RT500_Reg_Arry[3] &= 0xF8;
    switch(AudioSwing)
    {
        case Att_8k:
                RT500_Reg_Arry[3] |= 0x00;
                break;
        case Att_7k:
                RT500_Reg_Arry[3] |= 0x01;
                break;
        case Att_6k:
                RT500_Reg_Arry[3] |= 0x02;
                break;
        case Att_5k:
                RT500_Reg_Arry[3] |= 0x03;
                break;
        case Att_4k:
                RT500_Reg_Arry[3] |= 0x04;
                break;
        case Att_3k:
                RT500_Reg_Arry[3] |= 0x05;
                break;
        case Att_2k:
                RT500_Reg_Arry[3] |= 0x06;
                break;
        case Att_1k:
                RT500_Reg_Arry[3] |= 0x07;
                break;
        default:
                RT500_Reg_Arry[3] |= 0x04;
                break;
       
    }
    WriteTunerRegister(3+4,RT500_Reg_Arry[3]);
    return RT_Success;
}

/*************************** RF 输出Level 设置 ***************************************
RT500_Err_Type  RT500_RF_ATT(u8  RFATT)
{
    RT500_Reg_Arry[8] &= 0xF8;
    //RT500_Reg_Arry[8] |= RT500_Set_Info.RT500_RF_Att_Mode;
    switch(RFATT)
    {
        case RFAtt_0:
                RT500_Reg_Arry[8] |= 0x00;
                break;
        case RFAtt_1:
                RT500_Reg_Arry[8] |= 0x01;
                break;
        case RFAtt_2:
                RT500_Reg_Arry[8] |= 0x02;
                break;
        case RFAtt_3:
                RT500_Reg_Arry[8] |= 0x03;
                break;
        case RFAtt_4:
                RT500_Reg_Arry[8] |= 0x04;
                break;
        case RFAtt_5:
                RT500_Reg_Arry[8] |= 0x05;
                break;
        case RFAtt_6:
                RT500_Reg_Arry[8] |= 0x06;
                break;
        case RFAtt_7:
                RT500_Reg_Arry[8] |= 0x07;
                break;
        default:
                RT500_Reg_Arry[8] |= 0x00;
                break;
       
               
    }
    WriteTunerRegister(8+4,RT500_Reg_Arry[8]);
    return RT_Success;
}

/***************************** RF 額外衰減6db 设置 ******************************
RT500_Err_Type  RT500_ATT_6DB(u8  ATT6DB)
{
    RT500_Reg_Arry[8] &= 0xF7;
    switch(ATT6DB)
    {
        case RFAtt_0DB:
            RT500_Reg_Arry[8] |= 0x00;
                break;
        case RFAtt_6DB:
            RT500_Reg_Arry[8] |= 0x08;       
                break;
        default:
                RT500_Reg_Arry[8] |= 0x00;
                break;
               
    }
    WriteTunerRegister(8+4,RT500_Reg_Arry[8]);
    return RT_Success;
}

/**************************** 设置 RF 输出频率 *****************************************
RT500_Err_Type RT500_PLL(u32 PLL_Freq)
{
        u8 Div_Rat = 2;
        u8 Sel_Div = 0;
        u8 Ni = 0;
        u8 Si = 0;
        u8 N1 = 0;
        u8 N2 = 0;
        u32 VCO_Min = 1800000;
        u32 VCO_Freq = 0;
        u8  SN,M;

        while(Div_Rat < 64)
        {
                Div_Rat *= 2;
                if((PLL_Freq * Div_Rat) >= VCO_Min)
                {
                        RT500_Reg_Arry[7] &= 0xF8;
                        RT500_Reg_Arry[7] = Sel_Div  | RT500_Reg_Arry[7]; // r11       
                        VCO_Freq = PLL_Freq * Div_Rat;
                        break;
                }
                Sel_Div ++;
        }

        N1 = (u8)(((VCO_Freq / 1000) - 416) / 32);
        Ni = (u8)(N1 / 4);
        Si = (u8)(N1 - (Ni * 4));
        //RT500_Reg_Arry[5] = Ni | (Si << 6); // r9
        SN= Ni | (Si << 6); // r9
        N2 = (u8)(((VCO_Freq / 1000) - 416) - (N1 * 32));
       
       
        //if(N2==0)
        // RT500_Reg_Arry[7] |= 0x08;
        //else
        //          RT500_Reg_Arry[7] &= 0xF7;       
        //RT500_Reg_Arry[6] = (N2 << 3);  // r10
       
        if(PLL_Freq<56250)
         RT500_Reg_Arry[7] = 0x74;
        else if(PLL_Freq<112500)
         RT500_Reg_Arry[7] = 0x73;       
        else if(PLL_Freq<225000)
         RT500_Reg_Arry[7] = 0x72;       
        else if(PLL_Freq<450000)
         RT500_Reg_Arry[7] = 0x71;       
        else
        RT500_Reg_Arry[7] = 0x70;       
       
       
        //  RT500_Reg_Arry[7] &= 0xF7;       
        //  RT500_Reg_Arry[6] = (N2 << 3);  // r10
          M=(N2 << 3);  // r10
        WriteTunerRegister(5+4,SN);//RT500_Reg_Arry[5]);
        WriteTunerRegister(6+4,M);//RT500_Reg_Arry[6]);
        WriteTunerRegister(7+4,RT500_Reg_Arry[7]);
       
//set modulation depth ~80%                        //update depend on datasheet v2.7
        RT500_Reg_Arry[2] &= 0x0F;
        if((PLL_Freq>0) && (PLL_Freq<225000))
           RT500_Reg_Arry[2] |= 0xA0;
        else if((PLL_Freq>=225000) && (PLL_Freq<450000))
           RT500_Reg_Arry[2] |= 0x90;
        else if((PLL_Freq>=450000) && (PLL_Freq<650000))
           RT500_Reg_Arry[2] |= 0x80;
        else if((PLL_Freq>=650000) && (PLL_Freq<750000))
           RT500_Reg_Arry[2] |= 0x70;
        else
           RT500_Reg_Arry[2] |= 0x60;
          WriteTunerRegister(2+4,RT500_Reg_Arry[2]);
               
       
//Set Frequency for RT500
        //if(RT500_PLL(PLL_Freq) != RT_Success)
        //        return RT_Fail;
       
        //RT500_Write_Len.RegAddr = 0x04;
        //for(UINT8 RT500_Reg_Cunt = 0;RT500_Reg_Cunt < RT500_Reg_Num;RT500_Reg_Cunt ++)
        //{
        //        RT500_Write_Len.Data[RT500_Reg_Cunt] = RT500_Reg_Arry[RT500_Reg_Cunt];
        //}
        //RT500_Write_Len.Len = RT500_Reg_Num;
        //if(I2C_Write_Len(&RT500_Write_Len) != RT_Success)
        //   return RT_Fail;
       
        //return RT_Success;
       
        return RT_Success;
}


/***************************** I2C 写Tuner寄存器函数 ***********************************
void WriteTunerRegister(byte RegAddr,byte RegData)
{
    Wire.beginTransmission(RT500_DEVICE_ADDRESS);
    Wire.write(RegAddr);     //address MSB
    Wire.write(RegData);     //写数据
    Wire.endTransmission();   
}
//////////////////////////////////////////////////////////////////////////////////////////////////



/****************** Main Loop 函数 **************************************/
  void loop()
{
    Serial.println(" Run test!");
}







/////////////////////////////////////////////////////////////////////////////////////////////////////////

另外现在编译不了,我去掉一些注释就可以。不知什么原因!



回复 支持 反对

使用道具 举报

发表于 2014-4-22 12:04:28 | 显示全部楼层
你这代码,好多注释都没有闭合,使用/*你得有对应*/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-22 15:08:29 | 显示全部楼层
pathletboy 发表于 2014-4-22 12:04
你这代码,好多注释都没有闭合,使用/*你得有对应*/

3Q! 将代码重新整理了一下,
发现几个错误,改掉就OK!
非常感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-11 03:57 , Processed in 0.062589 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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