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

📄 testusb.c

📁 uCOS上移植的USB。今天终于可以使用我的了
💻 C
📖 第 1 页 / 共 5 页
字号:
		outportb(addr,data);
		data--;
		}
	for(addr = 0x7f00,data=0xff; addr <= 0x80ff; addr++) {
		i=(addr-0x7ef0)/0x0008;
		VT102DispChar (i, 22, 'H', COLOR_WHITE, COLOR_BLACK);
  		VT102DispStr(i+1, 22, "        ", COLOR_WHITE, COLOR_BLACK);  
		data--;
		if(inportb(addr)!= data)
			break;		
		}
	if(addr<0x80ff) {
		flag = 0;
  		printf(1,1,"stop addr :%h",addr);		
		  VT102DispStr(1,  23, "Memory detective failed      ", COLOR_WHITE, COLOR_BLACK);
 		}
	else   {
		flag = 1;
		  VT102DispStr(1,  23, "Memory detective success      ", COLOR_WHITE, COLOR_BLACK);
 		}
        return flag;
} */              

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 printfpro(INT8U x, INT8U y, char *s,INT16U z,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');
    subprintf(s,z);
    OSSemPost(DispStrSem);                              /* Release semaphore                                */
}

void subprintf(const char *s,INT16U x)
{
	    while (*s != '\0') {
	    	if(*s!='%')        PutChar(*s++);
	    	else {s++;
	    	     if(*s=='d')    {
	    	     	PutNum(x);
	    	     	}
	    	     if(*s=='h')    {
	    	     	PutNumH(x);
	    	     	}
	    	     s++;
	    	     }
    }
}

void PutNum(INT16U x4)
{
	    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;  
    
  PutChar ('0'+x4);
  PutChar ('0'+x3);
  PutChar ('0'+x2);
  PutChar ('0'+x1);
  PutChar ('0'+x0);    
 
}

void PutNumH (INT16U n3)
{
	    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);

  PutChar ('0');
    PutChar ('X');
  PutChar (x3);
  PutChar (x2);
  PutChar (x1);
  PutChar (x0); 
}

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;

⌨️ 快捷键说明

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