📄 ps2.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 + -