#include "stm32f10x.h"
#include "keyboard.h"
#include "sys.h"
#include "delay.h"
#include "lcd.h"
#define KEY_OUT (GPIOF->ODR = 0xf0<<1) //PF.8765 4321 输出 1111 0000
#define KEY_CHEAK_1 (GPIOF->ODR = 0xf7<<1) //PF.8765 4321 输出 1111 0111
#define KEY_CHEAK_2 (GPIOF->ODR = 0xfb<<1) //PF.8765 4321 输出 1111 1011
#define KEY_CHEAK_3 (GPIOF->ODR = 0xfd<<1) //PF.8765 4321 输出 1111 1101
#define KEY_CHEAK_4 (GPIOF->ODR = 0xfe<<1) //PF.8765 4321 输出 1111 1110
#define KEY_IN (GPIOF->IDR>>1)
/******************************************************************************
设置全局变量
*******************************************************************************/
//unsigned int Angle_A; //A设定角度值(用于显示)
//unsigned int Angle_B; //B设定角度值(用于显示)
//extern float Init_Angle_A; //A机0度初始值
//extern float Init_Angle_B; //B机0度初始值
//extern float Set_Angle_A; //A机 设定值-给PID
//extern float Set_Angle_B; //B机 设定值-给PID
//extern unsigned int Open_Pid_A ; //A机PID开关
//extern unsigned int Open_Pid_B ; //B机PID开关
unsigned char KeyValue=17; //随意设定的键值,用来返回
/******************************************************************************
程序说明:采用按列扫描法扫描键盘
键盘功能:1 2 3 change
4 5 6 清零
7 8 9 开始
A 0 B 停止
接线方式 vcc x1 x2 x3 x4 X1-X4------- p27-p24
空 y1 y2 y3 y4 Y1-Y4-------p23-p20
x短为上拉电阻
按键对应数字 1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
*******************************************************************************/
/*******************************************
函数名称:Init_Key(void)
功 能:初始化键盘
参 数:无
返回值 :无
********************************************/
void Init_Keyboard()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);//使能PORTF
//初始化 GPIOF8~GPIOF5 上拉输入 模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_5;//GPIOF8~GPIOF5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF8~GPIOF5
//初始化 GPIO4~1 开漏输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1;//GPIOF4~GPIOF1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PA0设置 开楼输出
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOf
//KEY_OUT;
// GPIOF->ODR = 0xff<<1;
}
/*******************************************
函数名称:Key_Scan(void)
功 能:键盘检索
参 数:无
返回值 :1~16 键盘编号
********************************************/
unsigned char Key_Scan(void)
{
unsigned char KeyValue1,KeyValue2; //Keyvalue1用来判断是否有键按下,KeyValue2用来存储行和列线的状态
KEY_OUT; //在IO口由输出方式变为输入方式时要延迟一个周期
KEY_OUT; //采取写两次的方法延时
KeyValue1=KEY_IN; //读取IO口状态,判断是否有键按下
if(KeyValue1!=0xf0) //IO口值发生变化则表示有键按下
{
delay_ms(10); //键盘消抖,5MS
KeyValue1=KEY_IN;
if(KeyValue1!=0xf0) //判断有键按下后再扫描,得到具体的按键位置
{ //逐列开始扫描,从第一列开始
KEY_CHEAK_1; //第一列 1111 0111
delay_ms(1);
KeyValue2=KEY_IN;
switch (KeyValue2)
{
case 0xe7:KeyValue=13;break; //1110 0111 1 1 1 1
case 0xd7:KeyValue=9;break; //1101 0111 1 1 1 1
case 0xb7:KeyValue=5;break; //1011 0111 1 1 1 1
case 0x77:KeyValue=1;break; //0111 0111 1 1 1 1
}
KEY_CHEAK_2; //第二列 1111 1011
delay_ms(1);
KeyValue2=KEY_IN;
switch (KeyValue2)
{
case 0xeb:KeyValue=14;break;
case 0xdb:KeyValue=10;break;
case 0xbb:KeyValue=6;break;
case 0x7b:KeyValue=2;break;
}
KEY_CHEAK_3; //第三列 1111 1101
delay_ms(1);
KeyValue2=KEY_IN;
switch (KeyValue2)
{
case 0xed:KeyValue=15;break;
case 0xdd:KeyValue=11;break;
case 0xbd:KeyValue=7;break;
case 0x7d:KeyValue=3;break;
}
KEY_CHEAK_4; //第4列 1111 1110
delay_ms(1);
KeyValue2=KEY_IN;
switch (KeyValue2)
{
case 0xee:KeyValue=16;break;
case 0xde:KeyValue=12;break;
case 0xbe:KeyValue=8;break;
case 0x7e:KeyValue=4;break;
}
}
}
else
{
KeyValue=17;
}
KEY_OUT;
return(KeyValue); // 若无按键按下则返回0
}
/*******************************************
函数名称:Key_Process(void)
功 能:键盘按键功能配置
参 数:KeyValue(非输入)
返回值 :
********************************************/
void Key_Process(void)
{
switch(KeyValue)
{
case 1: LCD_ShowString(20,20,20,20,16,"1");break;
case 2: LCD_ShowString(20,20,20,20,16,"2");break;
case 3: LCD_ShowString(20,20,20,20,16,"3");break;
case 4: LCD_ShowString(20,20,20,20,16,"4");break;
case 5: LCD_ShowString(20,20,20,20,16,"5");break;
case 6: LCD_ShowString(20,20,20,20,16,"6");break;
case 7: LCD_ShowString(20,20,20,20,16,"7");break;
case 8: LCD_ShowString(20,20,20,20,16,"8");break;
case 9: LCD_ShowString(20,20,20,20,16,"9");break;
case 10: LCD_ShowString(20,20,20,20,16,"10");break;
case 11: LCD_ShowString(20,20,20,20,16,"11");break;
case 12: LCD_ShowString(20,20,20,20,16,"12");break;
case 13: LCD_ShowString(20,20,20,20,16,"13");break;
case 14: LCD_ShowString(20,20,20,20,16,"14");break;
case 15: LCD_ShowString(20,20,20,20,16,"15");break;
case 16: LCD_ShowString(20,20,20,20,16,"16");break;
}
KeyValue = 0x00;
}
/*******************************************
函数名称:Key_Process(void)
功 能:键盘按键功能配置
键盘功能:1 2 3 change
4 5 6 清零
7 8 9 开始
x 0 x 停止
参 数:KeyValue(非输入)
返回值 :
********************************************/
//void Key_Process(void)
//{
// switch(KeyValue)
// {
// case 1: //1行1列 数字1
// if(Change==0)
// {
// Angle_A=Angle_A*10+1;
// if(Angle_A > 99)
// {
// Angle_A = 0;
// }
// KEY_DISPLAY (Angle_A ,Change); //显示
// }
// else
// {
// Angle_B=Angle_B*10+1;
// if(Angle_B > 99)
// {
// Angle_B = 0;
// }
// KEY_DISPLAY(Angle_B ,Change);
// }
// break;
// case 2: //1行2列 数字2
// if(Change==0)
// {
// Angle_A=Angle_A*10+2;
// if(Angle_A > 99)
// {
// Angle_A = 0;
// }
// KEY_DISPLAY (Angle_A ,Change);
// }
// else
// {
// Angle_B=Angle_B*10+2;
// if(Angle_B > 99)
// {
// Angle_B = 0;
// }
// KEY_DISPLAY (Angle_B ,Change);
// }
// break;
// case 3: //1行3列 数字3
// if(Change==0)
// {
// Angle_A=Angle_A*10+3;
// if(Angle_A > 99)
// {
// Angle_A = 0;
// }
// KEY_DISPLAY (Angle_A ,Change);
// }
// else
// {
// Angle_B=Angle_B*10+3;
// if(Angle_B > 99)
// {
// Angle_B = 0;
// }
// KEY_DISPLAY (Angle_B ,Change);
// }
// break;
// case 4:
评论0