
从开始玩STM32F开始就用官方库.感觉快上手,外设配置用官方库. 常用的输出等(如更新I/O)就直接操作寄存器., D9 r; F" k. |: ]5 J& A, {& i 在不追求处理速度下完全可以接受. 在一个用F051的项目也直接用触摸库,连芯片手册都没看; 花了不少时间才将变量定义好,2 s4 S( a5 E2 w/ z/ Q- | 又花了不少时间初始化成功 -------注意:触摸库会挨个将GPIO的CLK打开, 最后发现整个触摸功占用了快(整个系统)1/5的时间, 看了手册才发现原来F051的触摸功能就像USART或其它外设一样,都有对应的寄存器,计数寄存器,中断等.简单易用 --------注:STM8/STM32L1XX并非这样,比较麻烦" A: s9 ]* G/ p2 o2 q 大家没必要去找库.! H7 V, P' y0 A3 f 另:硬件电路上,采样(充电)电容不一定要用那么大的,用小点灵敏度高很多(要不是1S内采样不了几次); 要不是本来速度就慢,再要虑波一下,就其慢无比了. |
//电容测量型按键检测支持 定义和函数
//-----------------------------------------------------------------------------
#define KEY1_R (GPIOD->IDR & 0x04)//PD2# \: ^' b3 `/ H+ M1 J% B& w
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7/ y1 j6 H0 A: M x! V
//#define KEY3_R (GPIOD->IDR & 0x20)//PD5
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6
#define KEY_SH (GPIOD->ODR |=0x08)//PD38 T# s- j- s+ G6 R$ m) X; X- P
#define KEY_SL (GPIOD->ODR &=0xf7)//PD35 z8 _7 O" n* S) r# Q0 t: ?" L: q
//-----------------------------------------------------------------------------
#define KEY1_O_1 {GPIOD->ODR|=0x04;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD21 y6 c# p- m7 J: H
#define KEY1_O_0 {GPIOD->ODR&=0xFb;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2# E" _/ X2 J9 F$ V( W8 v
#define KEY1_I {GPIOD->CR1&=0xfb;GPIOD->DDR&=0xfb;}//PD2" g2 a; d+ ?7 O# |. U
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7% x! {4 b7 f- J: J
//#define KEY3_R (GPIOD->IDR & 0x20)//PD5
//#define KEY4_R (GPIOD->IDR & 0x40)//PD63 C. E* W/ }2 \5 q! u f
//-----------------------------------------------------------------------------
#define GT_GATE 51 C% J9 u" w0 _6 d
//-----------------------------------------------------------------------------2 C+ I; `3 b4 o! m# ^! S* t
unsigned char key_time_sta1;//充电开始时间3 ~0 |6 @! n6 p: D
unsigned char key_time1;//动态时间/ i" h) B& C/ Y+ ^. `/ D ~! R8 F5 w
unsigned char key_CH1;//按键充放电时间基准# \. w4 i/ w7 u% M/ A' _
unsigned char key_delay1;//按键保持存在的时间倒计时+ `6 A9 h( @& r5 [7 m! s) s* O+ o
unsigned char key_filter1;//按键滤波 毛刺消除
unsigned char key_count;//按键计数count 用于长按设置6 a" r% J6 F" ~* d, R9 h) `0 X
unsigned char key_value;//按键数据4 i R9 `; h" d6 g" v. B
#define SET_K1 (key_value|=0x01)
#define SET_K2 (key_value|=0x02)
#define SET_K3 (key_value|=0x04)' C" a' {6 j( N$ x6 c6 P7 J" H& H. e0 v
#define SET_K4 (key_value|=0x08)& c5 \7 x" N: e3 ?& o& ?8 r
0 T0 W4 _: r" R' J
#define Key_on (key_value&0x01)
#define Key_set (key_value&0x02)
#define Key_add (key_value&0x04) x- x. z. h2 R1 ~0 q' `: m9 @( _5 e' _
#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;& \# {5 u( B8 ]: `6 D6 l+ v
//-----------------------------------------------------------------------------
void CM_filter()
{//按键滤波调用 c$ ~# J4 h6 Y3 a- P1 i1 z
if(key_filter1<10)
{
}
}
//-----------------------------------------------------------------------------
void CM_Key_scan()# Z0 W7 l! C T8 ]6 Z+ W) A) _
{//1ms 调用一次 刷新键值8 m* L! r) r2 ?' G5 Y+ b4 n
unsigned char temp;8 ^) ?: s( |: E8 E6 ~3 c+ }; t
key_value=0;//键值清06 c; N# b- F' i/ B/ i, q- m
//key_time_sta1=TIM2->CNTRH;5 w5 ~7 B: k( g1 e* o
//key_time_sta1<<=8; U! V( p* Z4 {) a1 ]( q
key_time_sta1=TIM2->CNTRL;
KEY1_O_0;//准备充电 先放光
KEY_SH;# \0 R3 Q' E6 }, L8 f
KEY1_I;//高阻
while(!KEY1_R);2 z4 Y; J1 A9 Z
) Z' u& E" L2 o0 D# ~$ Q8 A: k
KEY1_O_1;//准备放电 先充满2 I: f) {( B: ?$ ~1 _+ a H
KEY1_I;//高阻
KEY_SL;
while(KEY1_R);
//temp=TIM2->CNTRH;( F6 {. D% \+ ~7 H1 |
//temp<<=8;
temp=TIM2->CNTRL;1 ` d, _( C) _, a2 h' F) N
) Q6 }9 v0 y9 n) H
key_time1=temp-key_time_sta1;//单位是us' ~0 d9 G' b; P3 N( J/ f
if(key_time1>(key_CH1+GT_GATE))+ ?% [% _! U) d
{//溢出阀值 k& s( j; M, n' O: L# G
if(key_filter1<8)key_filter1++;
else# A) o8 A+ e& ~. V9 Q" r! R
{//连续8次才有效$ k0 Q+ G* t. `+ j9 Y
key_delay1=200;//0.2s
//if(key_delay1==0)key_CH1-=GT_GATE;
key_CH1-=(key_CH1>>4);// 15/16% C4 J: g- s7 ^( E
key_CH1+=(key_time1>>4);% h+ j8 m C; d9 q+ s( [9 V
}
}5 R g# R) i% x2 [& s
else E7 v2 L* f) C1 P
{//未溢出情况下累计基准
key_filter1=0;' `& M# r$ b) y2 g* a* A
* L1 l4 w2 j) T% y; Z
key_CH1-=(key_CH1>>4);// 15/165 _* @3 x* p) C" h3 I$ ^
key_CH1+=(key_time1>>4);& T2 Z6 t# e# J5 ]' i+ U3 o
}
5 J# q4 N* g3 n
if(key_delay1)
{//在key_delay1不为0期间 K1保持按下状态) [) }+ M V4 \
key_delay1--;1 n( }* I+ q. v$ \! z& b% \, y" x
SET_K1; C1 K/ U2 f. X& d1 D
}
key_i++;
if(key_i>=64)key_i=0;
key_buf[key_i]=key_time1;1 N T2 B) E, d. e9 v |
//key_CH1-=(key_CH1>>4);// 15/16
//key_CH1+=(key_time>>4);
temp=key_value;; I" V6 @ I1 U+ ]8 D
key_value=key_value&(key_value^key_shadow);3 H9 e; B6 r n' H4 W0 A4 y) L/ X8 x
key_shadow=temp;
}: f( a! p1 u+ ^ \: ^8 N# r