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

📄 debugatmega128.h

📁 PS/2 keyboard atmega128
💻 H
字号:
#ifndef _DEBUG_ATMEGA128_H_
#define _DEBUG_ATMEGA128_H_

#define STX 0x02
#define ETX 0x03

unsigned char gAtEmulCmd;
unsigned int gAtEmulAddr;
unsigned char gAtEmulData[4];
char  gAtEmulDataPos;
unsigned char gAtEmulRwSize;
unsigned char gAtEmulChkSum;

void AtMg128DebugInit()
{
	/*
	SPCR = 0x00;
	SPCR |= 0x80; // B7:SPI Interrupt Enable
	SPCR |= 0x40; // B6:SPI Enable
	SPCR |= 0x03; // Clock / 128
	
	DDRE |= 0x03;
	*/
	
	UCSR0A = 0x00;

	UCSR0B = 0x00;
	UCSR0B |= 0x80; // B7:RX Interrupt Enable
	UCSR0B |= 0x40; // B7:TX Interrupt Enable
	UCSR0B |= 0x10; // B4:RX Enable
	UCSR0B |= 0x08; // B3:TX Enable

	
	UCSR0C = 0x00;
	UCSR0C |= 0x40; // B6:0:Async,1:Sync	
	UCSR0C |= 0x06; // B2,1:11:8Bit
	
	gAtEmulCmd = 'Y'; // <-- Ready
	gAtEmulAddr = 0x0000; // Address
	gAtEmulRwSize = 1; // 佬扁 静扁 Size
	gAtEmulChkSum = 0x00; //Checksum
	gAtEmulDataPos = 0; // Tx Data Pos
}

#pragma vector = USART0_RXC_vect
__interrupt void Usart0RxIsr()
{
	static int nERxPos = 0;
	unsigned char nRxDat;
	
	nRxDat = UDR0;
	
	switch(nERxPos)
	{
	case 0: gAtEmulChkSum = nRxDat; if(nRxDat != STX) nERxPos = 0; else nERxPos = 1; break;
	case 1: gAtEmulChkSum += nRxDat; gAtEmulCmd = nRxDat; nERxPos = 2; break;
	case 2: gAtEmulChkSum += nRxDat; gAtEmulAddr = nRxDat; nERxPos = 3; break;
	case 3: gAtEmulChkSum += nRxDat; gAtEmulAddr = (gAtEmulAddr<<8) | (nRxDat&0xFF); nERxPos = 4; break;
	case 4: gAtEmulChkSum += nRxDat; gAtEmulAddr = (gAtEmulAddr<<8) | (nRxDat&0xFF); nERxPos = 5; break;
	case 5: gAtEmulChkSum += nRxDat; gAtEmulRwSize = nRxDat; nERxPos = 6; break;
	case 6: gAtEmulChkSum += nRxDat; gAtEmulData[0] = nRxDat; nERxPos = 7; break;
	case 7: gAtEmulChkSum += nRxDat; gAtEmulData[1] = nRxDat; nERxPos = 8; break;
	case 8: gAtEmulChkSum += nRxDat; gAtEmulData[2] = nRxDat; nERxPos = 9; break;
	case 9: gAtEmulChkSum += nRxDat; gAtEmulData[3] = nRxDat; nERxPos = 10; break;
	case 10: gAtEmulChkSum += nRxDat; if(nRxDat != ETX) nERxPos = 0; else nERxPos = 11; break;
	case 11:
		if(gAtEmulChkSum == nRxDat)
		{
				switch(gAtEmulCmd)
				{
				case 'R':
					switch(gAtEmulRwSize)
					{
					default:
							gAtEmulRwSize = 1;
					case 1: gAtEmulData[0] = *(unsigned char *)(gAtEmulAddr);break;
					case 2: 
							gAtEmulData[0] = *(unsigned char *)(gAtEmulAddr+1);
							gAtEmulData[1] = *(unsigned char *)(gAtEmulAddr+0);
							break;
					case 4: 
							gAtEmulData[0] = *(unsigned char *)(gAtEmulAddr+3);
							gAtEmulData[1] = *(unsigned char *)(gAtEmulAddr+2);
							gAtEmulData[2] = *(unsigned char *)(gAtEmulAddr+1);
							gAtEmulData[3] = *(unsigned char *)(gAtEmulAddr+0);
							break;
					}
					
					UDR0 = gAtEmulData[0];
					gAtEmulDataPos = 1;
					
					break;
					
				case 'W':
					switch(gAtEmulRwSize)
					{
					default:
							gAtEmulRwSize = 1;
					case 1:
							*(unsigned char *)(gAtEmulAddr) = gAtEmulData[3];
							break;
					case 2: 
							*(unsigned char *)(gAtEmulAddr+1) = gAtEmulData[2];
							*(unsigned char *)(gAtEmulAddr) = gAtEmulData[3];
							break;
					case 4: 
							*(unsigned char *)(gAtEmulAddr+3) = gAtEmulData[0];
							*(unsigned char *)(gAtEmulAddr+2) = gAtEmulData[1];
							*(unsigned char *)(gAtEmulAddr+1) = gAtEmulData[2];
							*(unsigned char *)(gAtEmulAddr) = gAtEmulData[3];
							break;
					}
					break;					
				}
		}
		
		nERxPos = 0;
		break;
	}	
}

#pragma vector = USART0_TXC_vect
__interrupt void Usart0TxIsr()
{
	if(gAtEmulDataPos < gAtEmulRwSize) UDR0 = gAtEmulData[gAtEmulDataPos];
	
	gAtEmulDataPos++;
}
#endif

⌨️ 快捷键说明

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