你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】STM32F051电容按键其实不用触摸库

[复制链接]
832 发布时间:2014-4-16 09:06
 从开始玩STM32F开始就用官方库.感觉快上手,外设配置用官方库.2 l+ i" d; M$ Y: N9 c
常用的输出等(如更新I/O)就直接操作寄存器.
' g7 X" I0 Q% \: @& z' v2 R在不追求处理速度下完全可以接受.
  @- F) e4 J0 X" U7 a在一个用F051的项目也直接用触摸库,连芯片手册都没看;
% N$ Y9 [. M# ]) Z花了不少时间才将变量定义好,% Z3 e5 {2 H3 ?6 \, x
又花了不少时间初始化成功' g; O+ ~7 z* J8 v' O. s
-------注意:触摸库会挨个将GPIO的CLK打开,
% }. J# U  B5 I1 \' m& b最后发现整个触摸功占用了快(整个系统)1/5的时间,
! S2 ~$ B0 M3 c# v* J3 G5 B# u+ U; Q看了手册才发现原来F051的触摸功能就像USART或其它外设一样,都有对应的寄存器,计数寄存器,中断等.简单易用
" K# z5 I: R0 |--------注:STM8/STM32L1XX并非这样,比较麻烦
2 G" @) }# d: z8 |+ d% P! K大家没必要去找库.
8 e- y. A% G1 Y0 i# M另:硬件电路上,采样(充电)电容不一定要用那么大的,用小点灵敏度高很多(要不是1S内采样不了几次);  要不是本来速度就慢,再要虑波一下,就其慢无比了.
赞 收藏 2 评论19 发布时间:2014-4-16 09:06

举报

19个回答
liudashuang 回答时间:2015-2-23 23:24:15
简单的外设可以,比如IO
sssdd 回答时间:2016-10-27 08:54:24
来来来,看看这个这么玩行不行?
: a  ^3 \' i' w2 J/ T7 I//电容测量型按键检测支持 定义和函数 6 Y# G' p. o7 B# s7 [# O
//-----------------------------------------------------------------------------7 x' b$ k% w) E5 A
#define KEY1_R     (GPIOD->IDR & 0x04)//PD2
# d6 K" b8 E: O2 v6 ?//#define KEY2_R     (GPIOC->IDR &  0x80)//PC7, n0 ~2 Q# v7 ?# ]$ \$ ]: I0 I4 Z
//#define KEY3_R     (GPIOD->IDR &  0x20)//PD57 w6 p' r! A5 G, h
//#define KEY4_R     (GPIOD->IDR &  0x40)//PD6
+ @& J4 A2 h2 ~#define KEY_SH     (GPIOD->ODR |=0x08)//PD3, u6 [$ s0 E0 c: F9 s
#define KEY_SL     (GPIOD->ODR &=0xf7)//PD3
9 q. P0 `8 u4 W& W2 G//-----------------------------------------------------------------------------
$ T4 R# o1 y% q, _#define KEY1_O_1   {GPIOD->ODR|=0x04;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
3 L# l* t% J( I) C5 V#define KEY1_O_0   {GPIOD->ODR&=0xFb;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2' w: _$ F) b0 @
#define KEY1_I     {GPIOD->CR1&=0xfb;GPIOD->DDR&=0xfb;}//PD2
5 c; L) m% J4 @0 R" y; b: W
8 v' C. `0 o5 o) l0 ^//#define KEY2_R     (GPIOC->IDR &  0x80)//PC7
  l" `0 j5 i8 h2 P0 Z//#define KEY3_R     (GPIOD->IDR &  0x20)//PD5
5 ]$ r, u+ D) H8 @6 s( \+ X) }//#define KEY4_R     (GPIOD->IDR &  0x40)//PD6
# K+ O; L! C7 @//-----------------------------------------------------------------------------
, M/ z# O; z9 q, T, H  P#define GT_GATE 5
$ a% g" F) {& B- d//-----------------------------------------------------------------------------* I1 q, d$ X4 {6 `9 Z$ @
unsigned char key_time_sta1;//充电开始时间
- s3 s, _# @0 vunsigned char key_time1;//动态时间& a0 H6 b+ v  f# P4 P
unsigned char key_CH1;//按键充放电时间基准
. P. Y5 L+ t4 Y+ a8 dunsigned char key_delay1;//按键保持存在的时间倒计时
& ~2 {( P' g, L8 h5 Punsigned char key_filter1;//按键滤波 毛刺消除
. ~+ f2 S. Z; P& c; E1 _3 y. Q- t
7 ^+ ~# j5 _/ kunsigned char key_count;//按键计数count 用于长按设置
/ K/ h* j* @$ N6 N: _+ ]- iunsigned char key_value;//按键数据
: H! q1 }" b' u+ ?- N#define SET_K1 (key_value|=0x01)
8 U2 e' x! O4 T5 H  o9 k#define SET_K2 (key_value|=0x02)
0 s/ g1 n: v6 Y8 r; F#define SET_K3 (key_value|=0x04)  t) h% K( `* b0 J1 N5 H
#define SET_K4 (key_value|=0x08)" R5 ~' ~6 a8 Y! F

$ n" ^8 D# l$ n, I( w#define Key_on    (key_value&0x01)5 B5 W! |) f9 ^7 x0 Y6 [' i2 ^
#define Key_set   (key_value&0x02)# v2 i( m! |8 v2 G3 Q0 n
#define Key_add   (key_value&0x04)9 q8 T- f# u6 ~+ b; H5 c$ r
#define Key_pause (key_value&0x08)
! i- [& Q# [+ funsigned char key_shadow;//按键影子数据9 T, C6 ^/ z4 R/ w3 d# y5 {( n8 Z0 G
#define lkey_add  (key_shadow&0x04)/ f4 B- p/ f4 X1 L1 r
unsigned char key_buf[64];
: O* U- C0 c, P5 O% _unsigned char key_i;8 N2 n* R6 z: J. k/ E
//-----------------------------------------------------------------------------! c5 Z4 l' e$ D' |+ E$ O6 C! ~' e
void CM_filter()9 Y+ u+ p$ x4 Z6 j7 }7 Y8 X
{//按键滤波调用
1 ]( ?* Z2 `( T* b    if(key_filter1<10)& m$ n8 M+ e" v4 ^, b
    {
9 z8 t6 o' t4 C8 g& t    }
/ U% x9 d4 U6 g7 J8 z3 q}
3 k# ^( T. f8 j7 L9 X//-----------------------------------------------------------------------------
8 [! {0 j. y. I4 tvoid CM_Key_scan()
. v! @6 d4 h* ]% O8 v/ i& S{//1ms 调用一次 刷新键值
- O# q2 N( ~9 v    unsigned char temp;
0 o3 o- d# c5 K$ P* w8 A, T0 t    key_value=0;//键值清03 f" F* p% b+ ?; f
    //key_time_sta1=TIM2->CNTRH;
/ Z/ k+ F7 A, N3 b' W    //key_time_sta1<<=8;  }' u, i, S# W3 e3 w* I
    key_time_sta1=TIM2->CNTRL;, d5 o( v2 z9 K# q
    KEY1_O_0;//准备充电 先放光
9 f2 z# Q! @- Q& A  J    KEY_SH;
# S+ o0 S& Q7 Z8 E% m' q  W    KEY1_I;//高阻
7 r/ l0 ]+ U8 F# I    while(!KEY1_R);3 o* j$ s/ O5 Q$ V% C7 L
5 M$ ^  C" g5 H9 T( }5 s
    KEY1_O_1;//准备放电 先充满
5 r6 B% H: \: J& S$ V8 h( H    KEY1_I;//高阻: l: D2 p4 {2 ]
    KEY_SL;
4 [, u$ I- g5 n1 t+ w7 a' h    while(KEY1_R);  `! F' x6 a% }; F# C' p
* ^* A+ b7 _& J0 O) N( P
    //temp=TIM2->CNTRH;6 }  b8 x8 r9 N) _% i/ w
    //temp<<=8;
+ t2 ?/ [; P( ^/ ]$ L+ y    temp=TIM2->CNTRL;
/ I1 l" K0 e" v' t( k
1 z' O. k! Z. |- J4 U& t. V% X  @    key_time1=temp-key_time_sta1;//单位是us2 E# M! j! j: W

- _/ e# {. t! @% o  p1 ~3 ^$ x    if(key_time1>(key_CH1+GT_GATE))# k+ R* r( d: L; q% J4 F
    {//溢出阀值
3 v3 H# u' N/ {5 Q& H/ W% `+ s        if(key_filter1<8)key_filter1++;8 L, C2 E9 k: g2 G
        else
, z* v# Q, u! U% S& ]        {//连续8次才有效
  b+ [, w+ o# [& p7 A8 C& G            key_delay1=200;//0.2s) c" s/ d+ t" H& n6 D1 ^
            //if(key_delay1==0)key_CH1-=GT_GATE;
9 Z1 `' }5 N1 R, K7 Q! J4 d            key_CH1-=(key_CH1>>4);// 15/16  s0 p( U8 s5 w7 ?# E- f  ]/ J0 X
            key_CH1+=(key_time1>>4);
& Z- l- p3 ^/ {3 C        }
  `: \( ]! u) e: `7 T0 c! G5 d    }4 R6 I: K% B! W9 D: r& G
    else3 l" e+ ]+ h& V/ b: T
    {//未溢出情况下累计基准
4 X: b) S! B+ C4 L4 z        key_filter1=0;
- G  n( D! O  A- S2 V7 J. b
* x! K, M- \7 W8 Q& k* O' @- V0 h        key_CH1-=(key_CH1>>4);// 15/16
& m9 R: F$ N& e0 `3 N        key_CH1+=(key_time1>>4);
: f6 L( V; N, Z) H  q$ T6 v    }4 E/ d6 W# X  ^: r/ c! u: T

: L4 L8 R" A- @2 ^: z1 c3 \+ g! K    if(key_delay1)
* f% J/ @# d$ [/ Q+ t" e    {//在key_delay1不为0期间 K1保持按下状态
% |* t: c+ y- \+ w" l- m        key_delay1--;
3 [; p$ M4 U1 h        SET_K1;
$ g2 V' m' s9 U6 r- ?% k$ ^    }3 q; L7 u; ~2 S
8 ~; l* W  Z# L
    key_i++;8 Z/ ?* I* f* s  ^5 h) A. m
    if(key_i>=64)key_i=0;  O2 i7 n( A% l6 Y9 a: Z, C' s
    key_buf[key_i]=key_time1;
+ x. S9 ~" v3 N# t
5 q! {4 @) Q- B/ u    //key_CH1-=(key_CH1>>4);// 15/16. l3 o6 N6 c& R0 u
    //key_CH1+=(key_time>>4);
( _$ L& C3 r2 _* O" z0 }$ l$ `
# D( ~. x2 [/ @7 N0 A" B, v9 F    temp=key_value;
$ r& r: ~, N. }% p    key_value=key_value&(key_value^key_shadow);
- u5 W5 O- S0 i$ \    key_shadow=temp;8 M& W+ A) Y$ y* V  r4 _) q+ x9 T
}2 u; k+ X: O2 n. p2 y! m

: D0 _0 z1 c. `
广州天河 回答时间:2015-1-12 18:00:50
楼主大侠,您好!可否提供一下STM32F051 TSC的完整项目例程文件, 寄存器版的和 触摸库版的;可参考资料实在是太少了,我的邮箱是:767532649@qq.com ; 感谢楼主的无私奉献和大力支持,谢谢!
CoolRain_hy 回答时间:2014-11-10 22:40:43
楼主大侠,您好!可否提供一下STM32F051 TSC的完整项目例程文件, 寄存器版的和 触摸库版的;可参考资料实在是太少了,我的邮箱是: chy0226@163.com ; 感谢楼主的无私奉献和大力支持,谢谢!
huangjiayin 回答时间:2015-1-14 09:30:19
有寄存器版的例程吗?
ludongshalimin 回答时间:2015-1-14 09:37:44
谢谢,楼主
SproutME 回答时间:2015-1-19 16:38:27
可以发一下你的工程吗?弄了一个星期了!可以发到邮箱orcatropos@hotmail.com,谢谢楼主
toddchen 回答时间:2015-2-22 16:40:00
我也想要啊,跪求toddchen817@hotmail.com
wyxy163@126.com 回答时间:2015-2-22 21:32:25
提示: 作者被禁止或删除 内容自动屏蔽
wamcncn 回答时间:2015-2-23 08:58:35
学习学习
shower.xu 回答时间:2015-2-23 20:57:55
这个好用么?
liudashuang 回答时间:2015-2-23 23:10:08
简单的外设可以,比如IO
vonkun 回答时间:2015-3-24 15:50:14
您好!可否提供一下STM32F051 TSC的完整项目例程文件, 寄存器版的和 触摸库版的;可参考资料实在是太少了,我的邮箱是: vonkun@163.com ; 感谢楼主的无私奉献和大力支持,谢谢!
zhangdaijin 回答时间:2015-3-24 22:06:14
学习了  
通慧 回答时间:2016-9-18 20:16:29
大侠能否提供一份stm32f051的电容触摸按键的事例。在北感谢楼主提出的建议,我的邮箱是:502358698@qq.com
12下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版