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

📄 main.cpp

📁 AVR的PS2键盘控制程序,通过AVR单片机读取PS2键盘的数据
💻 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 + -