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

📄 testusbbin.c

📁 uCOS上移植的USB。今天终于可以使用我的了
💻 C
📖 第 1 页 / 共 4 页
字号:
//				D12SUSPD = 1;
				PORTD|=1<<4;
//				PCON |= 0x02;
				while (1);
			}
		} // if suspend change

		if (bEPPflags.bits.setup_packet){
			DISABLE;
			bEPPflags.bits.setup_packet = 0;
			ENABLE;
			control_handler();
//			D12SUSPD = 1;
				PORTD|=1<<4;
		} // if setup_packet

		if(bEPPflags.bits.setup_dma != 0) {
			DISABLE;
			bEPPflags.bits.setup_dma --;
			ENABLE;
			setup_dma();
		}            // if setup_dma

}                  // Main Loop
    OSTimeDlyHMSM(0, 0, 1, 0);   
}

/*
**************************************************************************************************************
*                                            Additional TASKS
**************************************************************************************************************
*/

void  LCDTask(void *data)
{
	  char    s[10];
      data = data;                                        /* Prevent compiler warning                         */

 /* LCD imitation */ 
   VT102DispStr(1, 23, "#Tasks          : xxxxx  CPU Usage: xxx %", COLOR_WHITE, COLOR_BLACK);
  VT102DispStr(1, 24, "#Task switch/sec: xxxxx", COLOR_WHITE, COLOR_BLACK); 
  for (;;) {
    SPrintDec(s, (INT16U)OSTaskCtr, 5);               /* Display #tasks running                           */
    VT102DispStr(19, 23, s, COLOR_WHITE, COLOR_BLUE);
    SPrintDec(s, (INT16U)OSCPUUsage, 3);              /* Display CPU usage in %                           */
    VT102DispStr(37, 23, s, COLOR_WHITE, COLOR_BLUE);
    SPrintDec(s, (INT16U)OSCtxSwCtr, 5);              /* Display #context switches per second             */
    VT102DispStr(19, 24, s, COLOR_WHITE, COLOR_BLUE);
    OSCtxSwCtr = 0;
    OSTimeDlyHMSM(0, 0, 0, 500);                        /* Wait one second                                  */
           }
}

/*
**************************************************************************************************************
*                                                  SUPPORT ROUTINES
**************************************************************************************************************
*/


char GetKey(void)
{
	unsigned char k10=0,k20=0,k30=0,k40=0,k11=0,k21=0,k31=0,k41=0;
	int count,ready,legal=0,k,m;
	char key=0;	
    	while(!legal)
    	{    
    	    ready=0;	
    	    while(!ready)
    	       {
    	       	count=0;	
    		while(count<=100)
    		   {
        		k11=k10;
        		k21=k20;
        		k31=k30;
        		k41=k40;
        		  OS_ENTER_CRITICAL();          			
        	        asm volatile("lds    %0,0xfffc" :"=r" (k10): );
        	        asm volatile("lds    %0,0xfffd" :"=r" (k20): );
        	        asm volatile("lds    %0,0xfffe" :"=r" (k30): );        	        	
        	        asm volatile("lds    %0,0xffff" :"=r" (k40): ); 
        	          OS_EXIT_CRITICAL();
        	        if((k11==k10)&(k21==k20)&(k31==k30)&(k41==k40))
        		        count++;
        	         else      	count=0; 
        	   }                                     /*capture the first data*/
//                   OSTimeDlyHMSM(0, 0, 0, 50);     /*time delay 50 ms*/
        	for(k=0;k<1000;k++) for(m=0;m<100;m++) {} 
        		  OS_ENTER_CRITICAL(); 
        	asm volatile("lds    %0,0xfffc" :"=r" (k10): );
        	asm volatile("lds    %0,0xfffd" :"=r" (k20): );
        	asm volatile("lds    %0,0xfffe" :"=r" (k30): );        	        	
        	asm volatile("lds    %0,0xffff" :"=r" (k40): ); 
        	          OS_EXIT_CRITICAL();        	
        	if((k11==k10)&(k21==k20)&(k31==k30)&(k41==k40))  ready=1;
              }                                     /*after time delaying check the data*/

         		if((k10==0x0f)&(k20==0x0f)&(k30==0x0f)&(k40==0x07))   {key='a';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0f)&(k20==0x0f)&(k30==0x07)&(k40==0x0f))   {key='b';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0f)&(k20==0x07)&(k30==0x0f)&(k40==0x0f))   {key='c';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x07)&(k20==0x0f)&(k30==0x0f)&(k40==0x0f))   {key='d';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0f)&(k20==0x0f)&(k30==0x0f)&(k40==0x0e))   {key='1';
          		                                                       legal=1;
          		                                                       }
         		if((k10==0x0f)&(k20==0x0f)&(k30==0x0e)&(k40==0x0f))   {key='4';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0f)&(k20==0x0e)&(k30==0x0f)&(k40==0x0f))   {key='7';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0e)&(k20==0x0f)&(k30==0x0f)&(k40==0x0f))   {key='*';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0f)&(k20==0x0f)&(k30==0x0f)&(k40==0x0d))   {key='2';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0f)&(k20==0x0f)&(k30==0x0d)&(k40==0x0f))   {key='5';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0f)&(k20==0x0d)&(k30==0x0f)&(k40==0x0f))   {key='8';
          		                                                       legal=1;
          		                                                       }         		
         		if((k10==0x0d)&(k20==0x0f)&(k30==0x0f)&(k40==0x0f))   {key='0';
          		                                                       legal=1;
          		                                                       }         		
          		if((k10==0x0f)&(k20==0x0f)&(k30==0x0f)&(k40==0x0b))   {key='3';
          		                                                       legal=1;
          		                                                       }
         		if((k10==0x0f)&(k20==0x0f)&(k30==0x0b)&(k40==0x0f))   {key='6';
         									legal=1;
         									}			
         		if((k10==0x0f)&(k20==0x0b)&(k30==0x0f)&(k40==0x0f))   {key='9';
         									legal=1;
         									}
         		if((k10==0x0b)&(k20==0x0f)&(k30==0x0f)&(k40==0x0f))   {key='#';
         		 							legal=1;
         		 							}
         		if((k10==0x0f)&(k20==0x0f)&(k30==0x0f)&(k40==0x0f))   {key=0;
         		 							legal=1;
         		 							}    		

		}
/*        k10==0x0f;
        k20==0x0f;
        k30==0x0f;
        k40==0x0f;
        		  OS_ENTER_CRITICAL(); 
        	asm volatile("sts    0xfffc,%0" :"=r" (k10): );
        	asm volatile("sts    0xfffc,%0" :"=r" (k20): );
        	asm volatile("sts    0xfffc,%0" :"=r" (k30): );       	        	
        	asm volatile("sts    0xfffc,%0" :"=r" (k40): ); 
        	          OS_EXIT_CRITICAL();          	        	           */
	return key;		
}

char GetKeyPro(void)
{
	static char oldkey=0;
	char key=0;
	static int keystatus=0;
	int keycnt=0;
	while(1)  {
		key=GetKey();
		if(oldkey!=key)   keystatus=0;
		if(keystatus==0)  {
			keycnt=0;
			keystatus=1;
			} 
		else if(keystatus==1) {
			keycnt++;
			if(keycnt==20)   keystatus=2;
			else continue;
			}
		oldkey=key;
		break;
	}
        return key;	
}



/*
 * UART Data Register Empty Interrupt
 *
 * Uses the structure of J.J Labrosse: Embedded Systems Building Blocks, p. 360
 *
 * See the file README for the description of the general ISR format.
 *
 */

UCOSISR(SIG_UART0_DATA)
{
  PushRS();
  OSIntEnter();
  if (OSIntNesting == 1)
    OSTCBCur->OSTCBStkPtr = (OS_STK *)SP;

  if (UartTxCount) {
    UartTxCount--;                                  /* Decrement number of characters left to send      */	
    UDR0=UartTxBuf[UartTxRdPtr];                    /* Place next character into UART transmit register */
    UartTxRdPtr++;                                  /* Advance to next character                        */
    if (UartTxRdPtr==UART_TX_BUF_SIZE)
      UartTxRdPtr=0;
    OSSemPost(UartTxSem);                           /* Signal that we have room for one more character  */
  } else {
    UCSR0B &= ~_BV(UDRIE0);                         /* Disable UART Data Register Empty interrupt       */
  }
  sei();
  OSIntExit();
  PopRS();
}

void AvrInit (void)
{
  UartTxCount = 0;                                      /* Clear number of characters to send               */
  UartTxRdPtr = 0;                                      /* Initialize transmit buffer read pointer          */
  UartTxWrPtr = 0;                                      /* Initialize transmit buffer write pointer         */
	
  /*
   * UART initialization
   */
   
  MCUCR=0x80;
  SREG|=0x80;
  UBRR0L=24;                                            /* 9600 BAUD at 3.6864 MHz                          */
  UCSR0B=_BV(TXEN0);           	               /* Enable UART transmitter and data register empty interrupt */
  UCSR0C=_BV(UCSZ01)|_BV(UCSZ00);                       /* 8-bit data                                       */
}


/*
 * UART Data Register Empty Interrupt
 *
 * Uses the structure of J.J Labrosse: Embedded Systems Building Blocks, p. 360
 *
 */

void PutChar (char c)
{
  INT8U err;

  OSSemPend(UartTxSem, 0, &err);                  /* Wait for space in transmit buffer                */
  OS_ENTER_CRITICAL();
  UartTxBuf[UartTxWrPtr] = c;                     /* Put character to send in transmit buffer         */
  UartTxWrPtr++;                                  /* Prepare for next character                       */
  if (UartTxWrPtr==UART_TX_BUF_SIZE)
    UartTxWrPtr=0;
  UartTxCount++;                                  /* Increment number of characters to send           */
  if (UartTxCount==1)
    UCSR0B |= _BV(UDRIE0);                        /* Enable UART data register empty interrupt        */
  OS_EXIT_CRITICAL();
}


void PutString (const char *s)
{
    while (*s != '\0') {
        PutChar(*s++);
    }
}


void SPrintDec(char *s, INT16U x, INT8U n)
{
    INT8U i;


    s[n] = '\0';
    for (i = 0; i < n; i++) {
        s[n - i - 1] = '0' + (x % 10);
        x /= 10;
    }
    for (i = 0; i < (n - 1); i++) {
        if (s[i] == '0') {
            s[i] = ' ';
        } else {
            break;
        }
    }
}



void PutDec (INT8U x2)
{
    INT8U x0;
    INT8U x1;


    x0  = (x2 % 10);
    x2 /= 10;
    x1  = (x2 % 10);
    x2 /= 10;
    if (x2) {
        PutChar(x2 + '0');
    }
    if (x1 || x2) {
        PutChar(x1 + '0');
    }
    PutChar(x0 + '0');
}


void VT102Attribute (INT8U fgcolor, INT8U bgcolor)
{
    PutChar(0x1b);
    PutChar('[');
    PutDec(30 + fgcolor);
    PutChar(';');
    PutDec(40 + bgcolor);
    PutChar('m');
}


void VT102DispClrScr (void)
{
    VT102Attribute(COLOR_WHITE, COLOR_BLACK);
    PutString("\x1B[2J");
}


void VT102DispChar (INT8U x, INT8U y, char c, INT8U fgcolor, INT8U bgcolor)
{
    INT8U err;

    OSSemPend(DispStrSem, 0, &err);                     /* Acquire semaphore to display string              */
    VT102Attribute(fgcolor, bgcolor);
    PutChar(0x1B);
    PutChar('[');
    PutDec(y);
    PutChar(';');
    PutDec(x);
    PutChar('H');
    PutChar(c);
    OSSemPost(DispStrSem);                              /* Release semaphore                                */
}


void VT102DispStr (INT8U x, INT8U y, char *s, INT8U fgcolor, INT8U bgcolor)
{
    INT8U err;

    OSSemPend(DispStrSem, 0, &err);                     /* Acquire semaphore to display string              */
    VT102Attribute(fgcolor, bgcolor);
    PutChar(0x1B);
    PutChar('[');
    PutDec(y);
    PutChar(';');
    PutDec(x);
    PutChar('H');
    PutString(s);
    OSSemPost(DispStrSem);                              /* Release semaphore                                */
}

void VT102DispNum (INT8U x, INT8U y, INT16U x4, INT8U fgcolor, INT8U bgcolor)
{
	    INT8U x0;
    INT8U x1;
    INT8U x2;
    INT8U x3;

    x0  = (x4 % 10);
    x4 /= 10;
    x1  = (x4 % 10);
    x4 /= 10;
    x2  = (x4 % 10);
    x4 /= 10;
    x3  = (x4 % 10);
    x4 /= 10;  
    
  VT102DispChar (x, y, '0'+x4, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+1, y, '0'+x3, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+2, y, '0'+x2, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+3, y, '0'+x1, COLOR_WHITE, COLOR_BLACK);  
  VT102DispChar (x+4, y, '0'+x0, COLOR_WHITE, COLOR_BLACK);      
  VT102DispStr(x+5, y, "        ", COLOR_WHITE, COLOR_BLACK);  
}

INT8U convertH(INT8U n)
{
	if(n<10) return('0'+n);
	else return('A'+n-10);
}

void VT102DispNumH (INT8U x, INT8U y, INT16U n3, INT8U fgcolor, INT8U bgcolor)
{
	    INT8U x0;
    INT8U x1;
    INT8U x2;
    INT8U x3;    

    x0  = (n3 % 16);
    n3 /= 16;
    x1  = (n3 % 16);
    n3 /= 16;
    x2  = (n3 % 16);
    n3 /= 16;
    x3=n3;
    
    x0=convertH(x0);
    x1=convertH(x1);
    x2=convertH(x2);
    x3=convertH(x3);

  VT102DispChar (x, y, '0', COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+1, y, 'X', COLOR_WHITE, COLOR_BLACK);     
  VT102DispChar (x+2, y, x3, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+3, y, x2, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+4, y, x1, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+5, y, x0, COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(x+6, y, "        ", COLOR_WHITE, COLOR_BLACK);  
}






//USB
void help_devreq(unsigned char typ, unsigned char req)
{
	typ >>= 5;

	if(typ == USB_STANDARD_REQUEST) {
	}
	else {
		if(bEPPflags.bits.verbose)
//			printf("Request Type = %s, bRequest = 0x%bx.\n", _NAME_USB_REQUEST_TYPE[typ],
//				req);
  VT102DispStr(1, 11, "Request Type = %s, bRequest = 0x%bx.", COLOR_WHITE, COLOR_BLACK);
	}
}

/* Configure Timer 0
   - Mode                  = 1
   - Interrupt                   = ENABLED
   - Clock Source                = INTERNAL
   - Enable Gating Control    = DISABLED
*/


//void init_timer0(void)
//{
//	TMOD &= 0XF0;                    /* clear Timer 0   */
//	TMOD  |= 0X1;
//	TL0 = 0X0;                   /* value set by user    */
//	TH0 = 0X0;                  /* value set by user  */
//	ET0 = 1;        /* IE.1*/
//	TR0 = 1;                /* TCON.4 start timer  */
//	PT0 = 1;

//	EA = 1;
//}          

/* Interrupt Control Unit */
/*   ****  Enabled interrupts in Interrupt Enable Register ****
	 ****  GLOBAL INTERRUPT MUST BE ENABLED FOR ANY OTHER
	 ****  INTERRUPT TO WORK!
*/
/*                  GLOBAL INTERRUPT DISABLED ALL INTERRUPTS
					ARE DISABLED          */
/*                    External interrupt 0      */
/*                        Priority Level = 0    */
/*                        Timer 0 interrupt     */
/*                       Priority Level = 0     */
void init_special_interrupts(void)
{

⌨️ 快捷键说明

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