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

📄 ps2.c

📁 PS/2键盘源码
💻 C
字号:
/******************** (C) COPYRIGHT 2008 FUDANTIANXIN********************
* File Name          : DCMotorDemo.c
* Author             : 上海复旦天欣科教仪器有限公司 周春明(ZCM)
* Version            : V1.0
* Date               : 11/5/2008
* Description        : FD-STM32-B实验箱:PS2
********************************************************************************
* 接口:
*       PA4-DAC
*       PA5-PULSE
*       JOYSTICK:向上键可加速,向下键可减速
注意:
     当键盘输入字符时,一定要拔开仿真器,否则不能输入字符
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
#include "scancodes.h"
#include "GUI.H"

u8 KeyValue=0,IntNum = 0;
u8 Key_UP = 0;
u8 Shift = 0;
u8 BF = 0; //标识有字符输入完标志
u16 Xposition=0,Yposition=0;

extern u8 tempnum;
void PS2GPIO_Configuration(void);
void PS2IntExtOnOffConfig(FunctionalState NewState);
void PS2Decode(unsigned char ScanCode);
void PS2Demo(void);



/*******************************************************************************
* 名    称:PS2IntExtOnOffConfig
* 功    能:开关外部中断line14
* 入口参数:无
* 出口参数:无
* 说    明:
****************************************************************************/
void PS2Demo(void)
{
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable , ENABLE);//使JTAG无效,使用PB3,PB4
  PS2GPIO_Configuration();
  PS2IntExtOnOffConfig(ENABLE);
  GUI_Delay(2000);
  GUI_Clear();//清屏,准备输入字母
  while(1)
  {
    if(BF == 1)
    {
      PS2Decode(KeyValue);
      BF = 0;
    }
  }
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable , DISABLE);//使JTAG无效,使用PB3,PB4
  PS2IntExtOnOffConfig(DISABLE);
}

/*******************************************************************************
* 名    称:PS2IntExtOnOffConfig
* 功    能:开关外部中断line14
* 入口参数:无
* 出口参数:无
* 说    明:
****************************************************************************/
void PS2IntExtOnOffConfig(FunctionalState NewState)
{
  EXTI_InitTypeDef EXTI_InitStructure;

  /* Initializes the EXTI_InitStructure */
  EXTI_StructInit(&EXTI_InitStructure);

  /* Disable the EXTI line 14 on falling edge */
  if(NewState == DISABLE)
  {
    EXTI_InitStructure.EXTI_Line = EXTI_Line13;
    EXTI_InitStructure.EXTI_LineCmd = DISABLE;
    EXTI_Init(&EXTI_InitStructure);
  }
  /* Enable the EXTI line 14 on falling edge */
  else
  {
    /* Clear the the EXTI line14 interrupt pending bit */
    EXTI_ClearITPendingBit(EXTI_Line13);

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Line = EXTI_Line13;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
  }
}


/*******************************************************************************
* 名    称:PS2GPIO_Configuration
* 功    能:是GPIOA.14为中断线
* 入口参数:无
* 出口参数:无
* 说    明:
****************************************************************************/
void PS2GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   

     /* 配置PA.13为输入 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* 脉冲输入 */
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13); 
   
  //配置PA.14为中断
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  

}



/*******************************************************************************
* 名    称:PS2Decode
* 功    能:解码函数,将键值对应于字符
* 入口参数:ScanCode:键盘发过来的码值
* 出口参数:无
* 说    明:
****************************************************************************/
void PS2Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
  unsigned int TempCyc;	
  //char Str;
  if (!Key_UP)                //当键盘松开时
  {
    switch (ScanCode)
    {
	case 0xF0 :	// 当收到0xF0,Key_UP置1表示断码开始
		Key_UP = 1;
		break;
	case 0x12 :	// 左 SHIFT
		Shift = 1;
		break;
	case 0x59 :	// 右 SHIFT
		Shift = 1;
		break;
	default:	
                GUI_SetFont(&GUI_Font16B_ASCII);//设置文本字体大小
		if(!Shift)	//如果SHIFT没按下
		{
		  for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<60); TempCyc++); //查表显示
		  if (UnShifted[TempCyc][0] == ScanCode)
		  {
		    GUI_DispStringAt(StrKey1[TempCyc],Xposition,Yposition);
                    Xposition +=8;
                    if(Xposition > 312)
                    {
                      Xposition = 0;
                      Yposition += 16;
                    }
                    if(Yposition > 200)
                    {
                      Xposition = 0;
                      Yposition = 0;
                    }
		  }
		} 
		else  //按下SHIFT
		{
		  for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<60); TempCyc++); //查表显示
		  if (Shifted[TempCyc][0] == ScanCode) 
		  {
		    GUI_DispStringAt(StrKey2[TempCyc],Xposition,Yposition);
                    Xposition +=8;
                    if(Xposition > 312)
                    {
                      Xposition = 0;
                      Yposition += 16;
                    }
                    if(Yposition > 200)
                    {
                      Xposition = 0;
                      Yposition = 0;
                    }
		  }
		}
		break;
    }
  }
  else
  {	
    Key_UP = 0;
    switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
    {
	case 0x12 :	// 左 SHIFT
		Shift = 0;
		break;
	case 0x59 :	// 右 SHIFT
		Shift = 0;
		break;
    }
  }
  PS2IntExtOnOffConfig(ENABLE);
} 




⌨️ 快捷键说明

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