你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。关注该话题即可发布文章!
小白也能明白的STM32的低功耗与唤醒机制
STM32系统中2种数据掉电保护的方法
分享STM32F051中文参考手册(重制书签版)
AI工具训练营-用ChatGPT解决HID Keyboard实现的问题
STM32固件库分享,超全系列整理
STM32小白入门指南:从基础到OTA实现方案
STM32超详细学习笔记
新手必看!STM32单片机应该怎么学?
如果你解决了这些问题,就可以直接学STM32
最通俗易懂的STM32完整启动流程分析
//电容测量型按键检测支持 定义和函数
//-----------------------------------------------------------------------------
#define KEY1_R (GPIOD->IDR & 0x04)//PD2
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7
//#define KEY3_R (GPIOD->IDR & 0x20)//PD5
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6
#define KEY_SH (GPIOD->ODR |=0x08)//PD3
#define KEY_SL (GPIOD->ODR &=0xf7)//PD3
//-----------------------------------------------------------------------------
#define KEY1_O_1 {GPIOD->ODR|=0x04;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
#define KEY1_O_0 {GPIOD->ODR&=0xFb;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
#define KEY1_I {GPIOD->CR1&=0xfb;GPIOD->DDR&=0xfb;}//PD2
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7
//#define KEY3_R (GPIOD->IDR & 0x20)//PD5
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6
//-----------------------------------------------------------------------------
#define GT_GATE 5
//-----------------------------------------------------------------------------
unsigned char key_time_sta1;//充电开始时间
unsigned char key_time1;//动态时间
unsigned char key_CH1;//按键充放电时间基准
unsigned char key_delay1;//按键保持存在的时间倒计时
unsigned char key_filter1;//按键滤波 毛刺消除
unsigned char key_count;//按键计数count 用于长按设置
unsigned char key_value;//按键数据
#define SET_K1 (key_value|=0x01)
#define SET_K2 (key_value|=0x02)
#define SET_K3 (key_value|=0x04)
#define SET_K4 (key_value|=0x08)
#define Key_on (key_value&0x01)
#define Key_set (key_value&0x02)
#define Key_add (key_value&0x04)
#define Key_pause (key_value&0x08)
unsigned char key_shadow;//按键影子数据
#define lkey_add (key_shadow&0x04)
unsigned char key_buf[64];
unsigned char key_i;
//-----------------------------------------------------------------------------
void CM_filter()
{//按键滤波调用
if(key_filter1<10)
{
}
}
//-----------------------------------------------------------------------------
void CM_Key_scan()
{//1ms 调用一次 刷新键值
unsigned char temp;
key_value=0;//键值清0
//key_time_sta1=TIM2->CNTRH;
//key_time_sta1<<=8;
key_time_sta1=TIM2->CNTRL;
KEY1_O_0;//准备充电 先放光
KEY_SH;
KEY1_I;//高阻
while(!KEY1_R);
KEY1_O_1;//准备放电 先充满
KEY1_I;//高阻
KEY_SL;
while(KEY1_R);
//temp=TIM2->CNTRH;
//temp<<=8;
temp=TIM2->CNTRL;
key_time1=temp-key_time_sta1;//单位是us
if(key_time1>(key_CH1+GT_GATE))
{//溢出阀值
if(key_filter1<8)key_filter1++;
else
{//连续8次才有效
key_delay1=200;//0.2s
//if(key_delay1==0)key_CH1-=GT_GATE;
key_CH1-=(key_CH1>>4);// 15/16
key_CH1+=(key_time1>>4);
}
}
else
{//未溢出情况下累计基准
key_filter1=0;
key_CH1-=(key_CH1>>4);// 15/16
key_CH1+=(key_time1>>4);
}
if(key_delay1)
{//在key_delay1不为0期间 K1保持按下状态
key_delay1--;
SET_K1;
}
key_i++;
if(key_i>=64)key_i=0;
key_buf[key_i]=key_time1;
//key_CH1-=(key_CH1>>4);// 15/16
//key_CH1+=(key_time>>4);
temp=key_value;
key_value=key_value&(key_value^key_shadow);
key_shadow=temp;
}
我也想要啊,跪求feiyun_zhu@163.com 谢谢!