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

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

[复制链接]
832 发布时间:2014-4-16 09:06
 从开始玩STM32F开始就用官方库.感觉快上手,外设配置用官方库.
0 Z1 F  y5 O( u0 x/ H. f- H常用的输出等(如更新I/O)就直接操作寄存器.
/ G$ O( J: h. h7 H; N- V在不追求处理速度下完全可以接受.9 u6 C9 z; B" b3 d
在一个用F051的项目也直接用触摸库,连芯片手册都没看;! i# O" f  N, k' {+ S2 L2 E
花了不少时间才将变量定义好,' w6 o0 z& F+ B0 }
又花了不少时间初始化成功
: z% q2 N7 T+ o3 J% j-------注意:触摸库会挨个将GPIO的CLK打开,; a- x8 O( g2 \( V( V
最后发现整个触摸功占用了快(整个系统)1/5的时间,5 t+ R  c0 M% y3 B7 d$ b
看了手册才发现原来F051的触摸功能就像USART或其它外设一样,都有对应的寄存器,计数寄存器,中断等.简单易用8 T  N. p0 e2 z. J; _
--------注:STM8/STM32L1XX并非这样,比较麻烦, ~/ \) I. H8 a3 a; J
大家没必要去找库.
4 M# o+ d) D/ M8 s+ @另:硬件电路上,采样(充电)电容不一定要用那么大的,用小点灵敏度高很多(要不是1S内采样不了几次);  要不是本来速度就慢,再要虑波一下,就其慢无比了.
收藏 2 评论19 发布时间:2014-4-16 09:06

举报

19个回答
liudashuang 回答时间:2015-2-23 23:24:15
简单的外设可以,比如IO
sssdd 回答时间:2016-10-27 08:54:24
来来来,看看这个这么玩行不行?7 o1 d* \7 f  \  Z) |, F  G
//电容测量型按键检测支持 定义和函数 * [' T  u# Y7 c/ V0 A
//-----------------------------------------------------------------------------
; y( V( C( ?5 {7 |#define KEY1_R     (GPIOD->IDR & 0x04)//PD2
( s, g3 g9 }3 d9 P: O. Z, X2 L$ k& M//#define KEY2_R     (GPIOC->IDR &  0x80)//PC75 q- {1 ^( `- A7 x$ q& W8 `9 F
//#define KEY3_R     (GPIOD->IDR &  0x20)//PD5
0 l3 m) ?; N; g//#define KEY4_R     (GPIOD->IDR &  0x40)//PD6' U1 V& R" [* \8 X9 Y
#define KEY_SH     (GPIOD->ODR |=0x08)//PD3
3 s4 S8 L' q7 U, Z" I; ^#define KEY_SL     (GPIOD->ODR &=0xf7)//PD3, v! {9 r! q* l3 W' A! H
//-----------------------------------------------------------------------------$ H) T* F( d8 X! B8 @
#define KEY1_O_1   {GPIOD->ODR|=0x04;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
/ {$ l3 G# r0 M7 [#define KEY1_O_0   {GPIOD->ODR&=0xFb;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD20 a* n+ A7 @- U, y2 W3 b
#define KEY1_I     {GPIOD->CR1&=0xfb;GPIOD->DDR&=0xfb;}//PD2
/ C/ N9 H2 _: b# D
5 r- V6 f( F: n. R. Z8 A+ @4 t( x3 k% L//#define KEY2_R     (GPIOC->IDR &  0x80)//PC7; e: r# U# K! _' z5 s% O
//#define KEY3_R     (GPIOD->IDR &  0x20)//PD5" p: F4 [* ?. k' B2 F9 l
//#define KEY4_R     (GPIOD->IDR &  0x40)//PD6
+ n* l3 l! h3 m; z9 o. A5 n5 o//-----------------------------------------------------------------------------
. R; L' s9 k. G5 s! f#define GT_GATE 5' d+ F5 g+ {+ S7 a# p1 @) S- k
//-----------------------------------------------------------------------------% V: K, {7 J5 m
unsigned char key_time_sta1;//充电开始时间
9 S$ x- u7 b7 E) N% O) K# K. Uunsigned char key_time1;//动态时间
& |3 T/ \0 P9 U3 Tunsigned char key_CH1;//按键充放电时间基准) l7 [& V- P# K
unsigned char key_delay1;//按键保持存在的时间倒计时
$ o2 q/ J  t: J0 u% b6 o3 s$ Iunsigned char key_filter1;//按键滤波 毛刺消除3 ]" Z' c2 \# K2 t+ b, y

, Z. p" }- Y' e8 I4 Runsigned char key_count;//按键计数count 用于长按设置7 k3 s$ j; l4 _4 G2 f
unsigned char key_value;//按键数据
9 W& i/ C: C( L#define SET_K1 (key_value|=0x01)1 p4 i" g! D' F7 W1 o; I7 r6 I! [/ h
#define SET_K2 (key_value|=0x02)5 l7 W( B% w# M. K3 p* m
#define SET_K3 (key_value|=0x04)8 e$ o$ ^! A( x  |7 y) X* ]
#define SET_K4 (key_value|=0x08)
3 ^5 n$ m* _( h9 C  p
! P$ w: U! `8 ^; M- D" A/ I3 ?#define Key_on    (key_value&0x01)& N. h/ z6 Z. ?0 U0 }
#define Key_set   (key_value&0x02)
: s: r  {$ ?  h1 v; s! J/ n2 R#define Key_add   (key_value&0x04)% z+ }: `1 ^7 K4 z4 ~- I+ X. V
#define Key_pause (key_value&0x08)! _' Q2 ^$ L$ V+ o1 A/ ?9 V
unsigned char key_shadow;//按键影子数据
" B% |; d# l$ h- ~6 z3 \( C#define lkey_add  (key_shadow&0x04)( R  J' n& l% b/ W; Z8 F+ D+ a
unsigned char key_buf[64];7 B( N! v- l3 W* L4 y5 \
unsigned char key_i;
4 I0 j! e- w1 l4 f/ V//-----------------------------------------------------------------------------7 g; s& l0 d+ R. d: _) z& x
void CM_filter()+ g+ }9 D% Z" z' z& _9 k
{//按键滤波调用/ {4 L: U7 _9 j
    if(key_filter1<10)
  H) s- X1 u4 z# m+ x( G1 k    {
( T7 J# @) G& l5 [    }! H( T  h: D0 M" A5 t8 `2 d7 Q" W/ \
}
$ M1 S8 t2 L5 Z  D" A1 A. {( @//-----------------------------------------------------------------------------; Z8 {& ]0 n) z- b
void CM_Key_scan(), ^  Q  F6 B7 I4 x
{//1ms 调用一次 刷新键值) p7 N6 ^/ D# O
    unsigned char temp;8 m9 a- x, E/ O$ V) n6 d' A
    key_value=0;//键值清0
. U' T5 T/ b/ D3 _0 ~2 G    //key_time_sta1=TIM2->CNTRH;! l* ^1 n  n$ R  Q$ d) Y
    //key_time_sta1<<=8;( b+ i8 r. }: d3 I; l, L8 W; d; p+ {
    key_time_sta1=TIM2->CNTRL;9 W, v* B; h' {
    KEY1_O_0;//准备充电 先放光1 k  s, T1 p1 u9 u
    KEY_SH;
, D1 j) w! D' V, v- x    KEY1_I;//高阻2 R9 ?6 v$ [( O4 U7 f* d
    while(!KEY1_R);
  `7 l1 l/ w- B3 L8 q, A2 g; L# Q& ]  E2 h" j% e: p0 b
    KEY1_O_1;//准备放电 先充满
/ G+ |/ a3 ?. S# d) W1 c    KEY1_I;//高阻
7 _3 a) K6 ]8 h5 L0 \+ \( V" n    KEY_SL;
+ [) o2 |. B. I    while(KEY1_R);' T6 n( W7 d6 m: A5 }
7 p1 C7 e9 x) X* C% |' v* _8 v! j
    //temp=TIM2->CNTRH;; F4 g0 U. O, O% i6 ?; M
    //temp<<=8;
2 `$ i, v5 q) b- Z% m- e' C    temp=TIM2->CNTRL;
1 E9 a% V% M" b/ B/ U
9 T2 h2 u# Z5 }+ ]# O/ {    key_time1=temp-key_time_sta1;//单位是us
  Y4 t5 C) A3 Q+ p6 C! {4 |0 a; U$ x, \
    if(key_time1>(key_CH1+GT_GATE))
$ m9 H) u: A& ^4 g* ~' S* ]    {//溢出阀值2 V7 G$ A$ M9 Z8 ]. `
        if(key_filter1<8)key_filter1++;$ X4 k. I0 H* A2 b* `% S
        else9 h: f8 h! |  `. \0 T5 Z
        {//连续8次才有效
/ d: Y, X- [) o            key_delay1=200;//0.2s
  ~* x2 m4 r$ v! {            //if(key_delay1==0)key_CH1-=GT_GATE;
5 A! {2 `) ~+ x* O+ I            key_CH1-=(key_CH1>>4);// 15/16, Y+ n, _1 F! `! }4 W1 T
            key_CH1+=(key_time1>>4);% y9 I, \+ j4 {1 I- c% O
        }2 H! X3 E. r. m5 ^
    }
- K  L2 Q1 q, c& _    else
6 t' ]1 j5 j+ x* L8 P' L    {//未溢出情况下累计基准. S+ k6 V$ P. @8 ~
        key_filter1=0;
8 J! f# l% }9 c& }
+ f) [0 D  O1 r5 e! A1 c' J2 t        key_CH1-=(key_CH1>>4);// 15/16
7 L! d  [+ X2 f3 s5 M        key_CH1+=(key_time1>>4);
0 K& Q& U' v% Q& |2 N; ]0 S6 S    }- j+ ~/ h/ e/ F, a2 w+ _' J

0 ^5 [8 O( O$ S* W    if(key_delay1)
0 `. O  ~5 V7 E0 c; J/ N    {//在key_delay1不为0期间 K1保持按下状态3 d: }7 M/ P2 H1 t- ]5 H
        key_delay1--;
1 X/ }2 T0 I0 T8 j& \  `2 v2 s0 N1 a        SET_K1;
- c/ k& [$ D* M! i1 M/ k$ b    }
' C& X/ j' {3 \) P8 Y/ h: E  v# i1 O* p* p- P
    key_i++;/ P; S  j5 n% \2 r& ~) p
    if(key_i>=64)key_i=0;) C: L4 p5 T0 K9 S1 Z( k
    key_buf[key_i]=key_time1;2 A( U, @" h) f9 N0 k

2 I( Y8 L, M: \* N- p9 Z    //key_CH1-=(key_CH1>>4);// 15/16
8 `$ ^6 Q1 Y4 Z2 k8 Z    //key_CH1+=(key_time>>4);6 z1 v  W% A) N3 z7 r1 y

* g9 ~6 \, C  S1 h3 @$ c" N  o    temp=key_value;" D; u( d" K6 Z0 H. ?
    key_value=key_value&(key_value^key_shadow);
3 [# u! V! j% L    key_shadow=temp;
5 p- \9 F  D* F; ]7 w9 u2 K}
' }) f; l5 J) f  H
7 ~9 d/ H) E( V5 t% I
广州天河 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版