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

📄 test.c

📁 uccos2的的源码文件
💻 C
📖 第 1 页 / 共 2 页
字号:
}


// 定义蜂鸣器控制口
void Buzzer_Freq_Set( unsigned int freq )
{
	rGPBCON &= ~3;			//set GPB0 as tout0, pwm output
	rGPBCON |= 2;

	rTCFG0 &= ~0xff;
	rTCFG0 |= 15;			//prescaler = 15+1
	rTCFG1 &= ~0xf;
	rTCFG1 |= 2;			//mux = 1/8
	rTCNTB0 = (PCLK>>7)/freq;
	rTCMPB0 = rTCNTB0>>1;	// 50%
	rTCON &= ~0x1f;
	rTCON |= 0xb;			//disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
	rTCON &= ~2;			//clear manual update bit
}

void Buzzer_Stop( void )
{
	rGPBCON &= ~3;			//set GPB0 as output
	rGPBCON |= 1;
	rGPBDAT &= ~1;
}

//***************************[ BOARD BEEP ]*******************************
void Beep(unsigned int freq, unsigned int ms)
{
	Buzzer_Freq_Set( freq ) ;
	Delay( ms ) ;
	Buzzer_Stop() ;
    Timer0Init();
}

int test_beep_for(int v)
{
    SetMenuReShow(0);
    if( v < 0 )
        return MENU_EXIT;
    Beep(v,2000);
    return MENU_RETAIN;
}


Menu gstr_BeepMenu[] =
{
{"500  Hz",500,test_beep_for},
{"1000 Hz",1000,test_beep_for},
{"2000 Hz",2000,test_beep_for},
{"3000 Hz",3000,test_beep_for},
{"4000 Hz",4000,test_beep_for},
{"5000 Hz",5000,test_beep_for},
{"数码管",0,test_digital},
{"Exit",-1,test_beep_for},
{0,0,0}
};

int test_beep(int v)
{
    return MENU_RETAIN;
}

int test_digital(int v)
{
    char str[16];
    SetMenuReShow(0);
    v = rand();
    sprintf(str,"%d",v%100000000);
    LED_Display(str,0);
    sprintf(str,"数码管显示:%d",v%100000000);
    StatusMessage(str);
    return MENU_RETAIN;
}


int test_keys(int v)
{
    int toExit = 0;
    unsigned char ch;
    unsigned short key;
    char str[32];

    RestoreDesktop();
    TextOut(2,SH-FONT_HEIGHT-2,gstr_exit);
    SetTextMode(TM_NOTTRANSPARENT);
    SetHoriEnlarge(2);
    SetVertEnlarge(2);
    KeyScanInit();

    while(!toExit)
    {
        Pollint();
        toExit = IsToExit();
        ch = Key_Scan();
        if( ch != 0xff )
        {
            sprintf(str,"2x2 key 0x%02x,%d",ch,ch);
            StatusMessage(str);
        }
        key = Keyboard_GetKey();
        if( key != 0 && (key&0xff) )
        {
            sprintf(str,"小键盘0x%02x按下%2d次",key&0xff,(key>>8)+1);
            StatusMessage(str);
        }
     }
    KeyScanExit();
    ResetTextOut();
    return MENU_RETAIN;
}


extern void InitStepMotorTest(void);
void stepmotor_clockwise(unsigned char dly);
void stepmotor_anti_clockwise(unsigned char dly);
void dcmotor_stop(void);
void dcmotor_clockwise(void);
void dcmotor_anti_clockwise(void);



unsigned char steprate = 4;
void ShowStepRate(void)
{
    sprintf((char*)buf,"步进电机速率%d",255-steprate+1);
    StatusMessage((const char *)buf);
}

int test_motor(int v)
{
    int i;
    InitStepMotorTest();
    switch(v)
    {
        case 1:
            dcmotor_clockwise();
            for( i = 0; i < 20; i++)
                stepmotor_clockwise(steprate);
            break;
        case 2:
            dcmotor_anti_clockwise();
            for( i = 0; i < 20; i++)
                stepmotor_anti_clockwise(steprate);
            break;
        case 4:
            if( steprate < 255)
                steprate++;
            ShowStepRate();
            break;
        case 3:
            if( steprate > 2 )
                steprate--;
            ShowStepRate();
            break;
        case 5:
            dcmotor_stop();
            break;
        case 0xff:
            dcmotor_stop();
            return MENU_EXIT;
    }
    SetMenuReShow(0);
    return MENU_RETAIN;
}

Menu gstr_MotorMenu[] =
{
{"顺时针转动",1,test_motor},
{"反时针转动",2,test_motor},
{"步进加速",3,test_motor},
{"步进减速",4,test_motor},
{"停止",5,test_motor},
{"Exit",0xff,test_motor},
{0,0,0}
};

extern int PlayAuditoControl(int v);
extern int RecordAuditoControl(int v);

Menu gstr_AudioMenu[] =
{
    {"播放音频",1,PlayAuditoControl},
    {"停止播放",2,PlayAuditoControl},
    {"增大音量",3,PlayAuditoControl},
    {"减小音量",4,PlayAuditoControl},
    {"暂停/继续",5,PlayAuditoControl},
    {"静音开关",6,PlayAuditoControl},
    {"开始录音",1,RecordAuditoControl},
    {"停止录音",2,RecordAuditoControl},
    {"Exit",0xff,PlayAuditoControl},
    {0,0,0}
};

extern SDI_test(void);
int test_default_idle(int v)
{
}

int test_sdi(int v)
{
    PrintfFlag = 0x02;
    SDI_test();
    PrintfFlag = 0x01;
    SetMenuReShow(0);
    return MENU_RETAIN;
}

Menu gstr_MoreMenu[] =
{
    {"uc/GUI",MENU_ucGUI,0},
    {"SD Card",0,test_sdi},
    {"RS-485",0,RS485Test},
    {"CAN BUS",MENU_CANBUS,0},
    {"I/O",MENU_IO,0},
    {"RFID",MENU_RF,0},
    {"多任务",MENU_MULTITASK,0},
    {"以太网",MENU_NET,0},
    {"Exit",0xff,0},
     {0,0,0}
};


#ifndef PCLK
#define     FCLK		(200*1000000)	// 系统时钟,修改此参数必须同时修改startup.s的参数
#define     HCLK		(FCLK/2)		// HCLK只能为FCLK除上1、2
#define     PCLK		(HCLK/2)	    // PCLK只能为HCLK除上1、2
#endif


// 定义RS485发送/接收控制口。为高电平时使能发送。
#define  RS485_CONS     (1<<7)         /* GPG7 */
#define  RS485_CONC     (~(1<<7))      /* GPG7 */

// 使能RS485数据发送
#define  RS485_SEND()   rGPGDAT = rGPGDAT | RS485_CONS

// 使能RS485数据接收
#define  RS485_RCV()    rGPGDAT = rGPGDAT & RS485_CONC

int RS485Test(int v)
{
    unsigned int timeout = RunTimeMs + 5100;
    // I/O口初始化
    rGPGCON = (rGPGCON & (~(0x03<<14))) | (0x01<<14);
    rGPGUP  = rGPGUP | (0x01<<7);

    RS485_SEND();				//设置485芯片为发送模式
    StatusMessage("RS-485发送测试,5秒后退出");
    UART_Select(1);
    rUBRDIV1=( (int)(PCLK/16./19200) -1 );// UART_SetBaud(19200);
    while( RunTimeMs < timeout ) {
       if( (RunTimeMs % 1000) == 0 )
            UART_SendStr("RS485 send data test!\r\n");
       if( rUTRSTAT1 & 0x1 )
        {
            sprintf((char*)buf,"%02x ",RdURXH1());
            AppendText((char*)buf);
        }
       if( (RunTimeMs % 50) == 0 )
         ScrollShow(0);
    }

    UART_Select(0);
    SetMenuReShow(0);
    return MENU_RETAIN;
}

unsigned int port = 0;
unsigned int wdata = 0;
unsigned int rdata = 0;
#define BASE_PORT   0x08000000
void ShowIO(void)
{
    sprintf((char*)buf,"端口0x%d 写入数据0x%02x 读出数据0x%02x",port,wdata,rdata);
    StatusMessage((char*)buf);
}

char* printhex(char* str,const char* ptr,int len)
{
    char* sptr = str;
    while(len-- > 0 )
    {
        sptr += sprintf(sptr,"%02x",*ptr++);
    }
    return str;
}

char gstr_cardno[5];
char gstr_wrdata[16];
char gstr_rddata[16];
char gi_cardsector = 0;
char gi_cardblock = 0;
char gstr_pwd[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,};


void ShowRF500(void)
{
    char* ptr = (char*)buf;
    char str[48];

    ptr += sprintf(ptr,"卡号:%s\r\n",printhex(str,gstr_cardno,5));
    ptr += sprintf(ptr,"扇区%02x 块号%d\r\n",gi_cardsector,gi_cardblock);
    ptr += sprintf(ptr,"密钥:%s\r\n",printhex(str,gstr_pwd,12));
    ptr += sprintf(ptr,"写入数据:%s\r\n",printhex(str,gstr_wrdata,16));
    ptr += sprintf(ptr,"读出数据:%s",printhex(str,gstr_rddata,16));
    TextOut(0,SH-120,(char*)buf);
}

void Uart1SetBaudrate(int bdrate)
{
                /* 系统时钟宏定义,用于串口配置 */
#define     FCLK		(200*1000000)	// 系统时钟,修改此参数必须同时修改startup.s的参数
#define     HCLK		(FCLK/2)		// HCLK只能为FCLK除上1、2
#define     PCLK		(HCLK/2)	    // PCLK只能为HCLK除上1、2
            rUBRDIV1=(int)(PCLK/16.0/bdrate + 0.5) -1;
}

/**
 * crc16 - CRC validation
 * @ptr: point to source data that was checked by CRC
 * @len: the length of source data
 */
U16 crc16(U8 *ptr,U16 len){
  U16 crc = 0xc78c;
  U8 i;

  while(len--){
    for(i = 0x80; i > 0; i >>= 1){
      if((crc & 0x8000) != 0){
          crc <<= 1;
          crc ^= 0x1021;
      }else
        crc <<= 1;
      if((*ptr&i) != 0)
        crc ^= 0x1021;
    }
    ptr++;
  }
  return(crc);
}

/**
initial
COM1【WRITE:0】C0 FF E4 00 0C 03 C1
COM1【READ:0】C2 FF 00 02 04 14 40 44 C3
COM1【WRITE:0】C0 FF E1 00 F3 F6 C1
COM1【READ:0】C2 FF 00 05 FF FF FF FF FF 8F D4 C3

read card no
COM1【WRITE:0】C0 FF 01 00 E3 44 C1
COM1【READ:0】C2 FF 00 05 EC C8 8D 07 08 AB 60 C3
COM1【WRITE:0】C0 FF 3B 00 09 1A C1
COM1【READ:0】C2 FF 00 00 3D 1D C3

authen
COM1【WRITE:0】C0 FF 10 0E 00 02 FF FF FF FF FF FF FF FF FF FF FF FF 00 37 C1
COM1【READ:0】C2 FF 00 00 3D 1D C3
COM1【WRITE:0】C0 FF 3B 00 09 1A C1
COM1【READ:0】C2 FF 00 00 3D 1D C3

read 0,0
COM1【WRITE:0】C0 FF 2C 02 00 00 2D 09 C1
COM1【READ:0】C2 FF 00 10 EC C8 8D 07 AE 88 04 00 47 C1 2D 2A C9 00 28 07 C3 60 C3
COM1【WRITE:0】C0 FF 3B 00 09 1A C1
COM1【READ:0】C2 FF 00 00 3D 1D C3


**/
int ExecRF500(int para)
{
    unsigned char srdata[32] = {0xc0,0xff,0x01,0x00};
    unsigned short crc;
    unsigned char i,len;
    unsigned long timeout;

    StatusMessage("GiRF500 Connecting...");

    Uart1SetBaudrate(19200);
    switch(para)
    {
        case 0: // read card no
            break;
        case 1:// read
            srdata[2] = 0x2c;
            srdata[3] = 0x02;
            srdata[4] = gi_cardsector;
            srdata[5] = gi_cardblock;
            break;
        case 2://write
            srdata[2] = 0x2d;
            srdata[3] = 0x12;
            srdata[4] = gi_cardsector;
            srdata[5] = gi_cardblock;
            memcpy(srdata+6,gstr_wrdata,16);
            break;
        case 3://authenticate
            srdata[2] = 0x10;
            srdata[3] = 0x0e;
            srdata[4] = gi_cardsector;
            srdata[5] = 0x02;
            memcpy(srdata+6,gstr_pwd,12);
            break;
        case 0x11: //C0 FF 3B 00 09 1A C1
            srdata[2] = 0x3b;
            srdata[3] = 0x00;
            break;
        case 0x12: //C0 FF  e4
            srdata[2] = 0xe4;
            srdata[3] = 0x00;
            break;
        case 0x13: //C0 FF e1
            srdata[2] = 0xe1;
            srdata[3] = 0x00;
            break;
    }

    len = srdata[3]+4;
    crc = crc16(srdata,len);
    srdata[len++] = crc >> 8;
    srdata[len++] = crc;
    srdata[len++] = 0xc1;

    printf("send\r\n");
    printbuf(srdata,len);

    // 发送
    for(crc = 0; crc < len; crc++)
    {
        while(!(rUTRSTAT1 & 0x02)); // 等待发送器THR为空
        for(i=0; i<100; i++);
        rUTXH1 = srdata[crc];              // 发送数据
    }

    // 接收
    timeout = RunTimeMs + 3000;
    len = 0;
    while( timeout > RunTimeMs )
    {
        if(!(rUTRSTAT1 & 0x1))
            continue;
        srdata[len++] = (rURXH1);
        if( len == (3+4+srdata[3]) )
            break;
    }

    printf("recvd\r\n");
    printbuf(srdata,len);

    if( !(len >= 4 && len == (3+4+srdata[3])) )
    {
        StatusMessage("timeout 3000!");
        return 0x1;
    }
    if( crc16(srdata,len-1) != 0 )
    {
         StatusMessage("crc error!");
         return 0x2;
    }

    if( srdata[2] != 0 )
    {
         sprintf((char*)buf,"Status=0x%02x:error!",srdata[2]);
         StatusMessage((char*)buf);
         return 0x3;
    }


    StatusMessage("GiRF500 Communication OK!");
    switch(para)
    {
        case 0:// card no
            memcpy(gstr_cardno,srdata+4,5);
            break;
        case 1://read
            memcpy(gstr_rddata,srdata+4,16);
            break;
        case 2://write
            break;
        case 3://authenticate
            break;
    }
    return 0;
}

int test_io(int para)
{
    int i;
    switch(para)
    {
        case 1: port = (++port) % 3; break;
        case 2: wdata = (++wdata) & 0xff; break;
        case 3: rdata = *(unsigned char*)(BASE_PORT+port); break;
        case 4: *(unsigned char*)(BASE_PORT+port) = wdata; break;
        case 5: port = wdata = rdata = 0; break;

        case 10: /*卡号*/
               if( 0 == ExecRF500(0))
                   ExecRF500(0x11);
               break;
        case 11: gi_cardsector = (++gi_cardsector) & 0x0f; break;
        case 12: gi_cardblock = (++gi_cardblock) & 0x03; break;
        case 13:// 数据
             for( i = 0; i < 16 ;i++)
                gstr_wrdata[i] = rand() & 0xff;
             break;
        case 14:// 读卡
              if( 0 == ExecRF500(1))
                  ExecRF500(0x11);
              break;
        case 15:// 写卡
              if( 0 == ExecRF500(2) )
                  ExecRF500(0x11);
              break;
        case 19:// authenticate
            if( 0 == ExecRF500(3) )
                ExecRF500(0x11);
            break;
        case 18:
            ExecRF500(0x12);
            ExecRF500(0x13);
            break;
    }
    if( para < 10 )
        ShowIO();
    else
        ShowRF500();
    SetMenuReShow(0);
    return MENU_RETAIN;
}


Menu gstr_RFMenu[] =
{
    {"切换扇区号0-15",11,test_io},
    {"切换块号0-3",12,test_io},
    {"切换写卡数据",13,test_io},

    {"初始化",18,test_io},
    {"读Mifare卡序列号",10,test_io},
    {"密钥认证",19,test_io},
    {"读Mifare卡",14,test_io},
    {"写Mifare卡",15,test_io},
    {"Exit",0xff,0},
     {0,0,0}
};

Menu gstr_IOMenu[] =
{
    {"切换端口地址",1,test_io},
    {"切换写入数据",2,test_io},
    {"读取端口",3,test_io},
    {"写入端口",4,test_io},
    {"复位设置",5,test_io},
    {"Exit",0xff,0},
     {0,0,0}
};


⌨️ 快捷键说明

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