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

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

[复制链接]
832 发布时间:2014-4-16 09:06
 从开始玩STM32F开始就用官方库.感觉快上手,外设配置用官方库.
8 z- g4 J8 q0 ]: ]常用的输出等(如更新I/O)就直接操作寄存器.
& ?$ o% l0 e. N# o" G$ L- N在不追求处理速度下完全可以接受.
0 Y# w+ L4 s/ `) B在一个用F051的项目也直接用触摸库,连芯片手册都没看;- W- [3 M  M0 T+ ]/ `. b
花了不少时间才将变量定义好,% v7 f: E" `  n. R
又花了不少时间初始化成功
  ^: y2 P$ x8 _! Z+ P4 _-------注意:触摸库会挨个将GPIO的CLK打开,* Z+ \" l0 G6 l& _' J
最后发现整个触摸功占用了快(整个系统)1/5的时间,
# ]" }6 ~1 q( }! P( f; S看了手册才发现原来F051的触摸功能就像USART或其它外设一样,都有对应的寄存器,计数寄存器,中断等.简单易用9 `/ k; f* r" S# M
--------注:STM8/STM32L1XX并非这样,比较麻烦
% t- w" n  e- @4 I3 I大家没必要去找库.
, n/ J9 _- o3 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
来来来,看看这个这么玩行不行?! i, b# w! p2 D2 ]
//电容测量型按键检测支持 定义和函数 & w; x1 e' A* J
//-----------------------------------------------------------------------------) Z3 e3 X+ b( `2 @' u: D3 L
#define KEY1_R     (GPIOD->IDR & 0x04)//PD2, }+ m/ o  f8 C5 I* A5 H0 W
//#define KEY2_R     (GPIOC->IDR &  0x80)//PC7  g, l7 Z' p; p! }9 g. J
//#define KEY3_R     (GPIOD->IDR &  0x20)//PD5% q- Z, y1 o. M, j
//#define KEY4_R     (GPIOD->IDR &  0x40)//PD67 z# A8 b8 C, K( T" B' r
#define KEY_SH     (GPIOD->ODR |=0x08)//PD32 b3 v: G! r0 K
#define KEY_SL     (GPIOD->ODR &=0xf7)//PD3
; W* _  e2 S/ B1 R2 k//-----------------------------------------------------------------------------; a5 f+ c  E$ J, S
#define KEY1_O_1   {GPIOD->ODR|=0x04;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
3 ~  n" \3 Q. p8 j* w#define KEY1_O_0   {GPIOD->ODR&=0xFb;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
" Q6 Q. i2 `+ @6 y# g#define KEY1_I     {GPIOD->CR1&=0xfb;GPIOD->DDR&=0xfb;}//PD2
$ N9 P, i% d1 R) N, t8 ^4 I; I% ~0 Q- L" ~
//#define KEY2_R     (GPIOC->IDR &  0x80)//PC7& [, M5 v$ F# \
//#define KEY3_R     (GPIOD->IDR &  0x20)//PD58 e% W4 j0 p; s6 P/ I! P0 _( B
//#define KEY4_R     (GPIOD->IDR &  0x40)//PD6
4 @  f" t# |6 R4 A- N& v' v+ c//-----------------------------------------------------------------------------" x' \; w# w6 o( T; w$ P
#define GT_GATE 5. F; \& ^" x4 i  m  l; K
//-----------------------------------------------------------------------------
) @; ~% V9 ?. a  H' Iunsigned char key_time_sta1;//充电开始时间
* F! e( o' e4 {# H/ j0 Y' }unsigned char key_time1;//动态时间
( a# e9 J; |# z5 A% X6 eunsigned char key_CH1;//按键充放电时间基准
! P5 s! N4 F" S0 _3 L5 H  R! Wunsigned char key_delay1;//按键保持存在的时间倒计时3 }; k( T: c& Y- m4 b4 @
unsigned char key_filter1;//按键滤波 毛刺消除
0 X# G3 [  N" j% ?+ a  x
+ u# U# L! [! N9 i- k4 aunsigned char key_count;//按键计数count 用于长按设置
3 w( o% Q! W! |6 M, punsigned char key_value;//按键数据* Z6 |: ?, q& p) \0 c
#define SET_K1 (key_value|=0x01)
! I( ^: l) U2 O0 F, s. V2 E#define SET_K2 (key_value|=0x02)+ i3 \. N  v, T& _1 Y1 S/ d
#define SET_K3 (key_value|=0x04)
! u) w  v& X5 X$ f3 b* K1 h8 O* Z#define SET_K4 (key_value|=0x08)
7 Q6 n; D' ]: z  \
0 m& P' y# I1 `+ [#define Key_on    (key_value&0x01); O9 D( [5 ]  u/ s/ ^
#define Key_set   (key_value&0x02)
( m% ^  N' i% g2 W; t#define Key_add   (key_value&0x04)
* f* c& D* b- B1 t: U4 e* \#define Key_pause (key_value&0x08)- z, L  _( f6 ^7 T1 C2 Z( m2 N- S
unsigned char key_shadow;//按键影子数据/ `! t& Z1 _) x" x5 A$ P* _
#define lkey_add  (key_shadow&0x04)
4 k4 c+ n2 n0 J! H' o5 Uunsigned char key_buf[64];
7 q+ O% {  U9 T& A7 zunsigned char key_i;
0 \) x( e3 W& K6 r, q9 N$ V3 b//-----------------------------------------------------------------------------% p& a# f6 G; n2 f- \
void CM_filter()
8 O; ?2 H5 Y. g7 K{//按键滤波调用+ ]% \( R6 R1 M2 u% N. H6 |2 k
    if(key_filter1<10)
1 A5 R0 y  p- L    {( B4 n2 f3 R" j8 Z& f
    }  Y) s$ F2 ?3 h7 F1 s7 a1 j5 z
}. G/ D* r7 f# @/ v& t+ K
//-----------------------------------------------------------------------------1 y7 J& x5 U/ Q- ]1 d* C& }
void CM_Key_scan()& B8 ?+ Q, L( `) j/ x" L
{//1ms 调用一次 刷新键值
0 O2 S! ^# Q; h6 q0 |( P    unsigned char temp;
) Y9 J$ n0 c% v; y# o( L    key_value=0;//键值清0
% \/ y/ m% }  [/ y. Q6 k. [    //key_time_sta1=TIM2->CNTRH;
8 J  Y8 ^0 M! R% x6 f( B    //key_time_sta1<<=8;
$ d" n1 f; N7 S1 i5 g3 c. w: q    key_time_sta1=TIM2->CNTRL;
, G: t+ d  K- S7 H- [8 a! g( i    KEY1_O_0;//准备充电 先放光
" B. S: ~/ [6 _$ F/ m) [    KEY_SH;/ ]! F: z* i3 c. }" W  H7 Y4 T. f
    KEY1_I;//高阻! ]* m2 s- f1 ^4 L. R& _5 B
    while(!KEY1_R);& G$ e- Q9 ]* t* T( X( d
5 g2 j) }  o! C% C1 s1 {  g
    KEY1_O_1;//准备放电 先充满. z* Z/ [/ m% f$ `/ b
    KEY1_I;//高阻9 A! i6 U; l  _6 u4 {
    KEY_SL;& U) f" W) A- u9 b
    while(KEY1_R);
) j$ r& @( U! o& b
' W. E' e- t5 K  |# O+ ^( s9 M* A    //temp=TIM2->CNTRH;7 x3 H' U2 O  h; E/ D
    //temp<<=8;
, `: ]' Y4 t7 M; _3 h    temp=TIM2->CNTRL;
+ Y: A/ C' d) M: S( q
$ j, V* z7 K% X1 O; F    key_time1=temp-key_time_sta1;//单位是us% d. ?8 Q8 [4 i% ]" J( p4 j5 k- p
0 ^6 Z- C% c) \; F6 {
    if(key_time1>(key_CH1+GT_GATE)); Q' b& ?( c5 x0 ]1 y. i  y
    {//溢出阀值
( |- Y, a0 }0 O2 l3 }        if(key_filter1<8)key_filter1++;6 j* B/ s- I6 i. @9 ~% I# W- E
        else
% M7 k" p3 l! r" k        {//连续8次才有效
; L4 w: K2 o/ K4 p' \- k; K9 C            key_delay1=200;//0.2s  a6 I, P" M& O) J5 r, G- x
            //if(key_delay1==0)key_CH1-=GT_GATE;
9 o' e& `" l& x9 V4 C$ z            key_CH1-=(key_CH1>>4);// 15/16+ a1 H# m" A6 k8 u
            key_CH1+=(key_time1>>4);
6 e) S1 |9 L" }# U  I# c' t" L* w        }0 a% m: j1 a9 s3 B. Y* R
    }
. D" V2 W- N, ~7 X1 r* A. s    else
. G" V! R4 M* ^$ P  [    {//未溢出情况下累计基准2 D, d- \7 X2 u' {& U8 M% A
        key_filter1=0;
; k  C! f) f1 y  Y- {2 z/ G4 [. _$ s8 S$ L
        key_CH1-=(key_CH1>>4);// 15/16
" ?, x2 _0 o$ c3 W  S  e, d( w        key_CH1+=(key_time1>>4);
) e- Q7 P- `, n8 H7 e; i' [0 v    }
# e$ j% |5 q0 C0 U* u2 M3 J6 z( P, V+ [6 V' k) P  m
    if(key_delay1): ~& O0 k: W  @: N  [; I4 J4 L
    {//在key_delay1不为0期间 K1保持按下状态$ w' v- H5 b; M+ k5 m: W
        key_delay1--;, v4 \: y$ n9 R
        SET_K1;' x* `/ k# V' c2 Y* F. ]
    }6 h' w- P  H) D+ z
, U9 g: b! S; n9 q9 L1 v0 w6 \
    key_i++;
6 h1 m; V+ c1 q7 S    if(key_i>=64)key_i=0;
3 i; L' W3 G) J  O8 S, E) k8 a: O    key_buf[key_i]=key_time1;! o; ^9 Z% Q" I) J- Z! O

8 r! H2 o6 v0 Z: A! E. `% e6 _    //key_CH1-=(key_CH1>>4);// 15/16
0 L1 z7 S5 t4 o    //key_CH1+=(key_time>>4);
9 S$ O1 r  Z; w- b1 q2 Z/ w0 H& m# S5 p# L, H
    temp=key_value;% k8 P; ]( q5 F3 A$ J1 o! u0 g
    key_value=key_value&(key_value^key_shadow);
+ \! {" R+ ^# s$ a+ b    key_shadow=temp;
# O# q2 @; C2 W* ~- p4 |}3 r* e1 p( M# h- o  c, a# }/ m
& n4 P$ A# _8 ~' S" T* \, S
广州天河 回答时间: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 手机版