专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
外部中断
2019-07-14 19:58
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
11227
12
1448
按键通过外部中断实现,然后控制LED,请教各位大神
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
HARRY007
2019-07-15 15:20
/************************ (C) COPYRIGHT HARRY007 *******************************
* 文件名 :key.c
* 描述 :按键驱动底层函数
* 库版本 :V2.1.0
* 作者 :wujianhong 修改:HARRY007
* 修改时间 :2016-09-13
*******************************************************************************/
/*************头文件包含***************/
#include "head.h"
/*************变量定义****************/
u8 key_funcode = 0;//按键功能码
u8 key_lock = 0;//按键自锁标志位
u8 delay_cout = 0;//消抖计时变量
/*******************************************************************************
* 名称: Key_Init
* 功能: KEY外设GPIO引脚初始化操作
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void Key_Init(void)
{
GPIO_Init(KEY_PORT, KEY_PIN_1, GPIO_MODE_IN_PU_NO_IT);//上拉输入无中断
GPIO_Init(KEY_PORT, KEY_PIN_2, GPIO_MODE_IN_PU_NO_IT);//上拉输入无中断
}
/*******************************************************************************
* 名称:Key_Scan
* 功能: 按键检测扫描函数
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void Key_Scan(void)
{//2ms
if( ( 0 != GPIO_ReadInputPin(KEY_PORT, KEY_PIN_1 ) )&&
( 0 != GPIO_ReadInputPin(KEY_PORT, KEY_PIN_2 ) ) ) //sw0和sw1都没有按下
{
key_lock = 0;//清除按键锁
delay_cout = 0;//延时清空
return;
}
if( (0 == GPIO_ReadInputPin(KEY_PORT, KEY_PIN_1)) && (0 == key_lock) )
{
delay_cout++;
if( delay_cout >= DELAY_CNT )//消抖30MS
{
key_funcode = SW0;
key_lock = 1;
}
}
if( (0 == GPIO_ReadInputPin(KEY_PORT, KEY_PIN_2)) && (0 == key_lock) )
{
delay_cout++;
if( delay_cout >= DELAY_CNT )//消抖30MS
{
key_funcode = SW1;
key_lock = 1;
}
}
}
/*******************************************************************************
* 名称:Key_Pro
* 功能: 按键处理函数
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void Key_Pro(void)
{
if( key_funcode == SW0 )//按键1
{
key_funcode = NONE;
if( work_state == STATE_INIT )//待机模式下
{
SCH_Enable_Task(TASK_ONE);//使能继电器执行任务
SetLedON(1); //工作灯点亮
Relay_Drive(1,1); //开启继电器
work_state = STATE_RUN; //系统工作状态切换到运行状态
return;
}
if( work_state == STATE_RUN )//运行状态下
{
Relay_Drive(1,0); //关闭继电器
SetLedOFF(1); //关闭工作灯
SCH_Disable_Task(TASK_ONE);//关闭继电器执行任务
work_state = STATE_INIT;
power_flag = OFF;
return;
}
if( work_state == STATE_TIME )//修改时间模式下
{
TASK_ONE->Period = TASK_ONE->Period + MIN_10;//每次加10min
if( TASK_ONE->Period > (MIN_10*6) )//如果大于1小时
{
TASK_ONE->Period = MIN_10;//回到10Min最小定时值
}
Led_Drive( (TASK_ONE->Period/MIN_10),20,30 );//闪灯次数表示定时时间
FLASH_Unlock(FLASH_MEMTYPE_DATA);//解锁EEPROM
FLASH_ProgramByte(0x4000, TASK_ONE->Period/MIN_10);//将修改的时间存入EEPROM
FLASH_Lock(FLASH_MEMTYPE_DATA); //上锁EEPROM
TASK_FIVE->Delay = TASK_FIVE->Period;//每按下一次按键,状态倒计时自动重装
return;
}
}
if( key_funcode == SW1 )//按键2
{
key_funcode = NONE;
if( work_state == STATE_INIT )//待机模式下
{
work_state = STATE_TIME; //进入修改时间模式
SCH_Enable_Task(TASK_FIVE);//使能状态倒计时任务
SetLedON(2); //修改灯点亮
return;
}
if( work_state == STATE_TIME )//修改时间模式下
{
work_state = STATE_INIT; //进入待机模式
SCH_Disable_Task(TASK_FIVE);//关闭状态倒计时
SetLedOFF(2); //灭掉修改灯
power_flag = OFF;
}
}
}
/************************ (C) COPYRIGHT HARRY007 *****END OF FILE**************/
复制代码
/************************ (C) COPYRIGHT HARRY007 *******************************
* 文件名 :key.h
* 描述 :按键驱动底层函数
* 库版本 :V2.1.0
* 作者 :HARRY007
* 修改时间 :2016-09-12
*******************************************************************************/
#ifndef __KEY_DRIVE_H
#define __KEY_DRIVE_H
/*************宏定义数值*****************/
#define DELAY_CNT 25 //按键消抖值30ms
#define SW0 1 //按键0的对应功能码
#define SW1 2 //按键1的对应功能码
#define NONE 0 //复位功能码状态
/**************管脚宏定义****************/
#define KEY_PORT GPIOC
#define KEY_PIN_1 GPIO_PIN_5 //按键1
#define KEY_PIN_2 GPIO_PIN_6 //按键2
/***********外部使用变量声明*************/
extern u8 key_funcode; //按键功能码
extern u8 key_lock; //按键自锁标志位
extern u8 delay_cout; //消抖计时变量
/*******************************************************************************
* 名称: KEY_Init
* 功能: KEY外设GPIO引脚初始化操作
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void Key_Init(void);
/*******************************************************************************
* 名称:KEY_Scan
* 功能: 按键检测扫描函数
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void Key_Scan(void);
/*******************************************************************************
* 名称:KEY_Pro
* 功能: 按键处理函数
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void Key_Pro(void);
#endif
/************************ (C) COPYRIGHT HARRY007 *****END OF FILE**************/
复制代码
加载中...
查看其它12个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
- /************************ (C) COPYRIGHT HARRY007 *******************************
- * 文件名 :key.c
- * 描述 :按键驱动底层函数
- * 库版本 :V2.1.0
- * 作者 :wujianhong 修改:HARRY007
- * 修改时间 :2016-09-13
- *******************************************************************************/
- /*************头文件包含***************/
- #include "head.h"
- /*************变量定义****************/
- u8 key_funcode = 0;//按键功能码
- u8 key_lock = 0;//按键自锁标志位
- u8 delay_cout = 0;//消抖计时变量
- /*******************************************************************************
- * 名称: Key_Init
- * 功能: KEY外设GPIO引脚初始化操作
- * 形参: 无
- * 返回: 无
- * 说明: 无
- ******************************************************************************/
- void Key_Init(void)
- {
- GPIO_Init(KEY_PORT, KEY_PIN_1, GPIO_MODE_IN_PU_NO_IT);//上拉输入无中断
- GPIO_Init(KEY_PORT, KEY_PIN_2, GPIO_MODE_IN_PU_NO_IT);//上拉输入无中断
- }
- /*******************************************************************************
- * 名称:Key_Scan
- * 功能: 按键检测扫描函数
- * 形参: 无
- * 返回: 无
- * 说明: 无
- ******************************************************************************/
- void Key_Scan(void)
- {//2ms
- if( ( 0 != GPIO_ReadInputPin(KEY_PORT, KEY_PIN_1 ) )&&
- ( 0 != GPIO_ReadInputPin(KEY_PORT, KEY_PIN_2 ) ) ) //sw0和sw1都没有按下
- {
- key_lock = 0;//清除按键锁
- delay_cout = 0;//延时清空
- return;
- }
-
- if( (0 == GPIO_ReadInputPin(KEY_PORT, KEY_PIN_1)) && (0 == key_lock) )
- {
- delay_cout++;
- if( delay_cout >= DELAY_CNT )//消抖30MS
- {
- key_funcode = SW0;
- key_lock = 1;
- }
- }
- if( (0 == GPIO_ReadInputPin(KEY_PORT, KEY_PIN_2)) && (0 == key_lock) )
- {
- delay_cout++;
- if( delay_cout >= DELAY_CNT )//消抖30MS
- {
- key_funcode = SW1;
- key_lock = 1;
- }
- }
- }
-
- /*******************************************************************************
- * 名称:Key_Pro
- * 功能: 按键处理函数
- * 形参: 无
- * 返回: 无
- * 说明: 无
- ******************************************************************************/
- void Key_Pro(void)
- {
- if( key_funcode == SW0 )//按键1
- {
- key_funcode = NONE;
- if( work_state == STATE_INIT )//待机模式下
- {
- SCH_Enable_Task(TASK_ONE);//使能继电器执行任务
- SetLedON(1); //工作灯点亮
- Relay_Drive(1,1); //开启继电器
- work_state = STATE_RUN; //系统工作状态切换到运行状态
- return;
- }
-
- if( work_state == STATE_RUN )//运行状态下
- {
- Relay_Drive(1,0); //关闭继电器
- SetLedOFF(1); //关闭工作灯
- SCH_Disable_Task(TASK_ONE);//关闭继电器执行任务
- work_state = STATE_INIT;
- power_flag = OFF;
- return;
- }
-
- if( work_state == STATE_TIME )//修改时间模式下
- {
- TASK_ONE->Period = TASK_ONE->Period + MIN_10;//每次加10min
- if( TASK_ONE->Period > (MIN_10*6) )//如果大于1小时
- {
- TASK_ONE->Period = MIN_10;//回到10Min最小定时值
- }
-
- Led_Drive( (TASK_ONE->Period/MIN_10),20,30 );//闪灯次数表示定时时间
-
- FLASH_Unlock(FLASH_MEMTYPE_DATA);//解锁EEPROM
- FLASH_ProgramByte(0x4000, TASK_ONE->Period/MIN_10);//将修改的时间存入EEPROM
- FLASH_Lock(FLASH_MEMTYPE_DATA); //上锁EEPROM
-
- TASK_FIVE->Delay = TASK_FIVE->Period;//每按下一次按键,状态倒计时自动重装
- return;
- }
- }
-
- if( key_funcode == SW1 )//按键2
- {
- key_funcode = NONE;
- if( work_state == STATE_INIT )//待机模式下
- {
- work_state = STATE_TIME; //进入修改时间模式
- SCH_Enable_Task(TASK_FIVE);//使能状态倒计时任务
- SetLedON(2); //修改灯点亮
- return;
- }
- if( work_state == STATE_TIME )//修改时间模式下
- {
- work_state = STATE_INIT; //进入待机模式
- SCH_Disable_Task(TASK_FIVE);//关闭状态倒计时
- SetLedOFF(2); //灭掉修改灯
- power_flag = OFF;
- }
- }
- }
- /************************ (C) COPYRIGHT HARRY007 *****END OF FILE**************/
复制代码- /************************ (C) COPYRIGHT HARRY007 *******************************
- * 文件名 :key.h
- * 描述 :按键驱动底层函数
- * 库版本 :V2.1.0
- * 作者 :HARRY007
- * 修改时间 :2016-09-12
- *******************************************************************************/
- #ifndef __KEY_DRIVE_H
- #define __KEY_DRIVE_H
- /*************宏定义数值*****************/
- #define DELAY_CNT 25 //按键消抖值30ms
- #define SW0 1 //按键0的对应功能码
- #define SW1 2 //按键1的对应功能码
- #define NONE 0 //复位功能码状态
- /**************管脚宏定义****************/
- #define KEY_PORT GPIOC
- #define KEY_PIN_1 GPIO_PIN_5 //按键1
- #define KEY_PIN_2 GPIO_PIN_6 //按键2
- /***********外部使用变量声明*************/
- extern u8 key_funcode; //按键功能码
- extern u8 key_lock; //按键自锁标志位
- extern u8 delay_cout; //消抖计时变量
- /*******************************************************************************
- * 名称: KEY_Init
- * 功能: KEY外设GPIO引脚初始化操作
- * 形参: 无
- * 返回: 无
- * 说明: 无
- ******************************************************************************/
- void Key_Init(void);
- /*******************************************************************************
- * 名称:KEY_Scan
- * 功能: 按键检测扫描函数
- * 形参: 无
- * 返回: 无
- * 说明: 无
- ******************************************************************************/
- void Key_Scan(void);
- /*******************************************************************************
- * 名称:KEY_Pro
- * 功能: 按键处理函数
- * 形参: 无
- * 返回: 无
- * 说明: 无
- ******************************************************************************/
- void Key_Pro(void);
- #endif
- /************************ (C) COPYRIGHT HARRY007 *****END OF FILE**************/
复制代码一周热门 更多>