📄 testusbbin.c
字号:
// 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 + -