/*
*********************************************************************************************************
*
* 模块名称 : 独立按键驱动模块 (外部输入IO)
* 文件名称 : bsp_key.c
* 版 本 : V1.3
* 说 明 : 扫描独立按键,具有软件滤波机制,具有按键FIFO。可以检测如下事件:
* (1) 按键按下
* (2) 按键弹起
* (3) 长按键
* (4) 长按时自动连发
*
*********************************************************************************************************
*/
#include "bsp_key.h"
#include "sys.h"
#define HARD_KEY_NUM 14 /* 实体按键个数 */
#define KEY_COUNT (HARD_KEY_NUM + 0) /* 8个独立建 + 2个组合按键 */
sbit KEY0 = P0 ^ 6;
sbit KEY1 = P0 ^ 7;
sbit KEY2 = P1 ^ 0;
sbit KEY3 = P1 ^ 1;
sbit KEY4 = P1 ^ 2;
sbit KEY5 = P1 ^ 3;
sbit KEY6 = P1 ^ 4;
sbit KEY7 = P1 ^ 5;
sbit KEY8 = P1 ^ 6;
sbit KEY9 = P1 ^ 7;
sbit KEY10 = P2 ^ 0;
sbit KEY11 = P2 ^ 1;
sbit KEY12 = P2 ^ 2;
sbit KEY13 = P2 ^ 3;
//sbit KEY1 = P3 ^ 0;
data u16 X00_State=1;
data u16 X01_State=1;
data u16 X02_State=1;
data u16 X03_State=1;
data u16 X04_State;
data u16 X05_State;
data u16 X06_State;
data u16 X07_State;
data u16 X08_State;
data u16 X09_State;
data u16 X10_State;
data u16 X11_State;
data u16 X12_State;
data u16 X13_State;
data u16 Y00_State=1;
data u16 Y01_State;
data u16 Y02_State;
data u16 Y03_State;
data u16 Y04_State;
//u8 X00_State;
//u8 X00_State;
///* 依次定义GPIO */
//typedef struct
//{
// u8 Iosta;
// u8 ActiveLevel; /* 激活电平 */
//}X_GPIO_T;
//
///* GPIO和PIN定义 */
//static const X_GPIO_T s_gpio_list[HARD_KEY_NUM] = {
// {0, 0}, /* K1 */
//// {0, 0}, /* K2 */
//
//};
//按钮点击事件扫描程序
bit is_btn_scan = 0;//是否要进行按钮点击扫描
//用于产生按钮点击扫描信号,放在1ms的定时器中调用即可
void btn_click_tick()
{
#define BTN_SCAN_PERIOD 5 //按钮点击事件的扫描周期,单位ms
static idata u8 tick = 0;
tick++;
if(tick==BTN_SCAN_PERIOD)
{
tick = 0;
is_btn_scan = 1;//产生一个按钮点击扫描信号
}
}
//按钮点击事件扫描并处理
void btn_click_handler()
{
#define BTN_VAL_ADDR 0x3000
u16 btn_val;
if(is_btn_scan==0)//是否有扫描信号,没有的话就啥也不做,直接返回
return;
is_btn_scan = 0;//清除
//1.开始检查是否有按钮按下
sys_read_vp(BTN_VAL_ADDR,(u8*)&btn_val,1);
if(btn_val==0)
return;
//2.按钮点击事件处理,传递给相应的界面
if(btn_val<=6)//我们把0x01-0x10范围的键值分配给启动界面,根据自己的项目可自由分配
// start_win_btn_click_handler(btn_val);//启动界面的按钮点击事件处理
{
switch(btn_val) //键值
{
case 1://点击了"减少"按钮
// num--;
Y00 = !Y00;
break;
case 2://点击了"0"按钮
Y01 = !Y01;
break;
case 3://点击了"增加"按钮
// num++;
Y02 = !Y02;
break;
case 4://点击了"增加"按钮
// num++;
Y03 = !Y03;
break;
case 5://点击了"增加"按钮
// num++;
Y04 = !Y04;
break;
default:
break;
}
}
//3.清除按键值
btn_val = 0;
sys_write_vp(BTN_VAL_ADDR,(u8*)&btn_val,1);
}
/* 定义一个宏函数简化后续代码
判断GPIO引脚是否有效按下
*/
static KEY_T s_tBtn[KEY_COUNT] = {0};
static KEY_FIFO_T s_tKey; /* 按键FIFO变量,结构体 */
static void bsp_InitKeyVar(void);
static void bsp_InitKeyHard(void);
static void bsp_DetectKey(u8 i);
#define KEY_PIN_ACTIVE(id)
/*
*********************************************************************************************************
* 函 数 名:KeyScan
* 功能说明: 判断按键是否按下
* 形 参: 无
* 返 回 值: 返回值1 表示按下(导通),0表示未按下(释放)
*********************************************************************************************************
*/
static u8 KeyScan(u8 i)
{
if(i==0)
{
if(0== KEY0)return 1 ;
}
if(i==1)
{
if(0== KEY1)return 1 ;
}
if(i==2)
{
if(0== KEY2)return 1 ;
}
if(i==3)
{
if(0== KEY3)return 1 ;
}
if(i==4)
{
if(0== KEY4)return 1 ;
}
if(i==5)
{
if(0== KEY5)return 1 ;
}
if(i==6)
{
if(0== KEY6)return 1 ;
}
if(i==7)
{
if(0== KEY7)return 1 ;
}
if(i==8)
{
if(0== KEY8)return 1 ;
}
if(i==9)
{
if(0== KEY9)return 1 ;
}
if(i==10)
{
if(0== KEY10)return 1 ;
}
if(i==11)
{
if(0== KEY11)return 1 ;
}
if(i==12)
{
if(0== KEY12)return 1 ;
}
if(i==13)
{
if(0== KEY13)return 1 ;
}
return 0 ;
}
void X_Y_filter(void)
{
/*输入状态刷新*/
if(KEY0)X00_State = 0;else X00_State = 1;
if(KEY1)X01_State = 0;else X01_State = 1;
if(KEY2)X02_State = 0;else X02_State= 1;
if(KEY3)X03_State = 0;else X03_State = 1;
if(KEY4)X04_State = 0;else X04_State = 1;
if(KEY5)X05_State = 0;else X05_State= 1;
if(KEY6)X06_State = 0;else X06_State = 1;
if(KEY7)X07_State = 0;else X07_State = 1;
if(KEY8)X08_State = 0;else X08_State= 1;
if(KEY9)X09_State = 0;else X09_State = 1;
if(KEY10)X10_State = 0;else X10_State = 1;
if(KEY11)X11_State = 0;else X11_State= 1;
if(KEY12)X12_State = 0;else X12_State = 1;
if(KEY13)X13_State = 0;else X13_State = 1;
/*输出状态刷新*/
if(!Y00)Y00_State = 0;else Y00_State = 1;
if(!Y01)Y01_State = 0;else Y01_State = 1;
if(!Y02)Y02_State = 0;else Y02_State = 1;
if(!Y03)Y03_State = 0;else Y03_State = 1;
if(!Y04)Y04_State = 0;else Y04_State = 1;
}
/*
*********************************************************************************************************
* 函 数 名: IsKeyDownFunc
* 功能说明: 判断按键是否按下。单键和组合键区分。单键事件不允许有其他键按下。
* 形 参: 无
* 返 回 值: 返回值1 表示按下(导通),0表示未按下(释放)
*********************************************************************************************************
*/
//static u8 IsKeyDownFunc(u8 _id)
//{
// /* 实体单键 */
// if (_id < HARD_KEY_NUM)
// {
// u8 i;
// u8 count = 0;
// u8 save = 255;
//
// /* 判断有几个键按下 */
// for (i = 0; i < HARD_KEY_NUM; i++)
// {
// if (KeyScan(i))
// {
// count++;
// save = i;
// }
// }
//
// if (count == 1 && save == _id)
// {
// return 1; /* 只有1个键按下时才有效 */
// }
//
// return 0;
// }
// /* 组合键 K1K2 */
// if (_id == HARD_KEY_NUM + 0)
// {
// if (KeyPinActive(KID_K1) && KeyPinActive(KID_K2))
// {
// return 1;
// }
// else
// {
// return 0;
// }
// }
//
// /* 组合键 K2K3 */
// if (_id == HARD_KEY_NUM + 1)
// {
// if (KeyPinActive(KID_K2) && KeyPinActive(KID_K3))
// {
// return 1;
// }
// else
// {
// return 0;
// }
// }
// return 0;
//}
/*
*********************************************************************************************************
* 函 数 名: bsp_InitKey
* 功能说明: 初始化按键. 该函数被 bsp_Init() 调用。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
//void bsp_InitKey(void)
//{
// bsp_InitKeyVar(); /* 初始化按键变量 */
// bsp_InitKeyHard(); /* 初始化按键硬件 */
//}
/*
*********************************************************************************************************
* 函 数 名: bsp_InitKeyHard
* 功能说明: 配置按键对应的GPIO
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void bsp_InitKeyHard(void)
{
// GPIO_InitTypeDef gpio_init;
// u8 i;
//
// /* 第1步:打开GPIO时钟 */
// ALL_KEY_GPIO_CLK_ENABLE();
//
// /* 第2步:配置所有的按键GPIO为浮动输入模式(实际上CPU复位后就是输入状态) */
// gpio_init.Mode = GPIO_MODE_INPUT; /* 设置输入 */
// gpio_init.Pull = GPIO_PULLUP ; /* 上拉电阻使能 */
// gpio_init.Speed = GPIO_SPEED_FREQ_VERY_HIGH; /* GPIO速度等级 */
//
// for (i = 0; i < HARD_KEY_NUM; i++)
// {
// gpio_init.Pin = s_gpio_list[i].pin;
// HAL_GPIO_Init(s_gpio_list[i].gpio, &gpio_init);
// }
}
/*
*********************
基于T5L1的小型PLC设计方案程序文件
需积分: 14 101 浏览量
2022-06-20
11:36:13
上传
评论
收藏 525KB RAR 举报
gmingxin123
- 粉丝: 30
- 资源: 9
最新资源
- btstack协议栈实战篇-GATT Server - Heartbeat Counter over GATT
- solution6.bin
- web期末作业设计网页案例.zip
- CLShanYanSDKDataList.sqlite
- 【React框架】教程&案例&相关项目.zip
- RV1126 LVGL移植
- (源码分享)跨年烟花表白源代码
- Solidigm 3D NAND Gen5 (Q5171A) Flash Memory Customer Datasheet D
- Python数据分析与建模库-02科学计算库Numpy01-05合集
- Solidigm 3D NAND Gen 5 (Q5171A) Flash Memory Die
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0