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