📄 main.cpp
字号:
/*==========================================
G2101-main.cpp
OSC 8.000
==========================================*/
#include"ioavr.h"
#include"mcu.h"
#include"ps2_keyboard.h"
#define LEDon() PORTE &= ~0x80
#define LEDoff() PORTE |= 0x80
#define LEDblink() PORTE ^= 0x80
#define EEPROM_ORIGINATE 300
bool s[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char ps2Buf[16];
unsigned char ps2Buf_ptr=0;
unsigned char ps2Buf_end=0;
unsigned char * keyboard_switch_config[32]={
/*S01*/KEY_ENTER,
/*S02*/KEY_CTRL,
/*S03*/KEY_ALT,
/*S04*/KEY_SPACE,
/*S05*/KEY_F1,
/*S06*/KEY_F2,
/*S07*/KEY_F3,
/*S08*/KEY_F4,
/*S09*/KEY_F5,
/*S10*/KEY_F6,
/*S11*/KEY_F7,
/*S12*/KEY_F8,
/*S13*/KEY_W,
/*S14*/KEY_E,
/*S15*/KEY_R,
/*S16*/KEY_T,
/*S24*/KEY_D,
/*S23*/KEY_S,
/*S22*/KEY_A,
/*S21*/KEY_P,
/*S20*/KEY_O,
/*S19*/KEY_I,
/*S18*/KEY_U,
/*S17*/KEY_Y,
/*S32*/KEY_U,//
/*S31*/KEY_Y,//空
/*S30*/KEY_L,
/*S29*/KEY_K,
/*S28*/KEY_J,
/*S27*/KEY_H,
/*S26*/KEY_G,
/*S25*/KEY_F,
};
bool VGA = true;
/*==========================================
==========================================*/
bool IsKeyDown(unsigned char *KeyBuf,unsigned char *targetKey)
{
for(unsigned char i=0;i<targetKey[0];i++)
{
if(KeyBuf[i] != targetKey[i+1])
return false;
}
return true;
}
/*==========================================
==========================================*/
bool IsKeyUp(unsigned char *KeyBuf,unsigned char *targetKey)
{
if(KeyBuf[targetKey[0]-1] != 0xf0)
return false;
for(unsigned char i=0;i<targetKey[0];i++)
{
if(KeyBuf[i+1] != targetKey[i+1])
return false;
}
return true;
}
/*==========================================
==========================================*/
void ReadConfig(void)
{
for(unsigned char i=0;i<150;i++)
keyboard_switch_config[i/5][i%5]=EEPROMread(i+EEPROM_ORIGINATE);
for(unsigned char i=0;i<150;i++)
UartTxd(keyboard_switch_config[i/5][i%5]);
}
/*==========================================
==========================================*/
void WriteConfig(void)
{
for(unsigned char i=0;i<150;i++)
EEPROMwrite(i+EEPROM_ORIGINATE,keyboard_switch_config[i/5][i%5]);
}
/*==========================================
==========================================*/
void WriteConfig(unsigned char adr,unsigned char *config)
{
for(unsigned char i=0;i<5;i++)
EEPROMwrite(i+adr*5+EEPROM_ORIGINATE,config[i]);
}
/*==========================================
==========================================*/
void testEeprom(void)
{
for(unsigned char i=0;i<150;i++)
EEPROMwrite(i+EEPROM_ORIGINATE,i);
}
/*==========================================
==========================================*/
void VgaSelect(bool x)
{
if(!PINB_Bit5 || !PINB_Bit6)
x = false;
if(!x)
{
PORTG |= 0x08;
PORTG &= ~0x10;
}
else
{
PORTG |= 0x10;
PORTG &= ~0x08;
}
}
/*==========================================
==========================================*/
void McuInit(void)
{
CLI();
OSCCAL = 0xa8;
//PORT
PORTA = 0x00;
DDRA = 0xff;
PORTB = 0x9f;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0xff;
PORTD = 0x00;
DDRD = 0xff;
PORTE = 0xff;
DDRE = 0x80;
PORTF = 0x00;
DDRF = 0xff;
PORTG = 0xff;
DDRG = 0x18;
//
WDR();
WDTCR = 0x1e;
WDTCR = 0x1e;
//
SPCR = 0x50;
SPSR = 0x00;
//UART0 initialize
// desired baud rate: 19200
// actual: baud rate:19231 (0.2%)
// char size: 8 bit
// parity: Disabled
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x19; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x08;
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
TCCR0A = 0x00; //stop
TCNT0 = 0x83; //set count
// OCR0 = 0x7D; //set compare
TCCR0A = 0x03; //start timer
//
TIMSK0 = 0x01; //timer interrupt sources
TIMSK1 = 0x00; //timer interrupt sources
TIMSK2 = 0x00; //timer interrupt sources
PCMSK0 = 0x04; //pin change mask
PCMSK1 = 0x00; //pin change mask
EIMSK = 0x40;
EICRA = 0x00; //int0 setup
SEI(); //re-enable interrupts
}
/*==========================================
==========================================*/
int main()
{
McuInit();
DelayMs(100);
UartTxdStr("qg_zhu@163.com\n");
// testEeprom();
//ReadConfig();
LEDon();
while(true)
{
WDR();
// DelayMs(100);
// LEDon();
VgaSelect(VGA);
unsigned char port;
unsigned char bit;
for(unsigned char i=0;i<32;i++)
{
port = i>>3;
bit = i&0x07;
switch(port)
{
case 0:
if(s[i])
PORTD |= (1<<bit);
else
PORTD &= ~(1<<bit);
break;
case 1:
if(s[i])
PORTC |= (1<<bit);
else
PORTC &= ~(1<<bit);
break;
case 2:
if(s[i])
PORTA |= (1<<bit);
else
PORTA &= ~(1<<bit);
break;
case 3:
if(s[i])
PORTF |= (1<<bit);
else
PORTF &= ~(1<<bit);
break;
}
}
if(ps2Buf_end)
{
for(unsigned char i=0;i<ps2Buf_end;i++)
UartTxd(ps2Buf[i]);
if(IsKeyDown(ps2Buf,KEY_PRINT_SCRN))
{
VGA = !VGA;
}
if(PORTG_Bit4)//VGA2被选择
{
LEDoff();
for(unsigned char i=0;i<32;i++)
{
if(IsKeyDown(ps2Buf,keyboard_switch_config[i]))
{
s[i] = true;
break;
}
else if(IsKeyUp(ps2Buf,keyboard_switch_config[i]))
{
s[i] = false;
break;
}
}
}
LEDon();
ps2Buf_end = 0;
}
}
}
unsigned char ps2_ptr=0;//
unsigned int ps2_data=0;
unsigned char ps2_overtime=0xff;
#define GetPs2Data() (PINE_Bit0)
/*========================================
========================================*/
#pragma vector=TIMER0_OVF_vect //1mS
__interrupt void timer0_ovf_isr(void)
{
TCNT0 = 0x83; //reload counter value
ps2_ptr=0;
if(ps2_overtime<10)
ps2_overtime++;
else
{
ps2Buf_end = ps2Buf_ptr;
ps2Buf_ptr = 0;
ps2_overtime = 0xf0;
}
//LEDblink();
}
/*========================================
========================================*/
#pragma vector=PCINT0_vect
__interrupt void PCINT0_isr(void)
{
//external interupt on PCINT0 0x04
if(!PINE_Bit2)
{
TCNT0 = 0x83; //单字节超时时间重置
ps2_overtime=0;//帧超时时间重置
ps2_data>>=1;
if(GetPs2Data())
ps2_data |= 0x8000;
ps2_ptr++;
if(ps2_ptr==11)
{
ps2_ptr=0;
if((ps2_data&0x20)==0x00 && (ps2_data&0x8000)==0x8000)
{
ps2Buf[ps2Buf_ptr++] = ps2_data>>6;
//UartTxd(ps2_data>>6);
//UartTxd(ps2_data);
}
}
}
}
/*==========================================
END
==========================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -