本帖最后由 slotg 于 2019-2-18 00:39 编辑
& @3 u1 `5 U6 \0 U2 p* |% B& O, q7 c6 Q$ A2 Z3 w; d
整合前面几个 LAB 的功能我们来实现一个秒表计时器,STM8S001J3 扣除了 SPI 使用的引脚之外可用的 GPIO 就只剩下 pin1 跟 pin6 了,以秒表计时器所需要的功能我们规划 pin1 做为计时开始/停止按钮,按下按钮后计时器以 10ms 间隔加 1 累积,再按一次则停止计时,而 pin6 为清零按钮,按下按钮后计时器清零。
7 B) `6 z+ z3 h3 B6 n$ [2 {$ C" J# N' P5 H0 u$ G: W
先建立一个显示的函数,参数为 0 时显示 0.00:
" K# F' ~) w) b2 ~( ]- // Display TIMER data
5 ]; R) d+ o6 B! J! j- h# g8 n - void DS_TIMER(uint32_t dta)
- B, I% I) j2 _3 u. g9 O7 r - { O. Y: v5 n& ^; N* e/ f! W
- uint8_t buf[8];
7 E, }: M. F9 z1 D* V - int8_t x,y;3 L# C7 \+ A9 H: ]6 r
- bool fg;3 Y# _3 u9 |# H; e
- , _, G1 J/ ^% b2 @" T
- for(x=0; x<8; x++)7 @ {5 z( R3 H) X4 M
- {
6 I2 m! b+ Q# m2 V. p( k. n& r8 a4 m - buf[x] = dta%10;
! p6 H4 H5 k8 @& O5 b - dta /= 10;! ?( _! p6 R% T/ Q
- }
* M# A) Q9 x: M# ]& i
$ G3 j! a. B# g) p/ m) X7 B/ Z- fg = FALSE;
) ~* Q: l& E& Y; p& b/ j - for(x=7; x>=0; x--): k; a1 U" H0 h
- {
& b& ^% Z1 q0 B( _ - if(buf[x] != 0 || fg==TRUE || x<=2)3 ^- |5 k2 ^$ a+ X! |- b6 k, z/ x: C
- {8 z8 J3 H0 x7 @3 w& X' D8 s5 a) y
- y = buf[x];( K, ^" z- X2 X1 ]* V! I0 P
- if(x==2)
6 u' M; d w+ E) { - {( b, t" X, W! a2 K3 n: Q
- y |= 0x80;
! r) l+ X- o+ `' v; z6 J3 a - }! U4 g& v+ c1 C7 M7 T% v/ Q2 H
- TX_MAX7219(x+1,y);7 w# D7 B6 O: m, s0 _
- fg = TRUE;
2 m! Y* l( E: K& M+ u; `5 F+ C, o& u - }. I( D$ m7 c7 ~
- else( J* F: [% g- a
- TX_MAX7219(x+1,0x0f);
* e* ]* y) @8 p3 y! h - }( B4 U* Z: E: E! \2 z
- }
复制代码
0 q. j" `+ r3 |: O按钮的处理方式可参考 【STM8-SO8】04-定时器TIM4的使用 内容。在这里我们设定 TIM4 每 2ms 中断一次,程序中宣告一个 fg_action 变量做为 TIM4 中断时是否累积计时器 tmr_cnt,当 fg_action 为 FALSE 不计数,为 TRUE 时每隔 10ms 计数加 1。. \) d% f/ }9 ^* P5 B( g7 Z I
- S" O3 ], y( @% x8 z9 gTIM4 中断程序:
6 c: r' A4 p" f. O7 ~: t2 N- INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)8 V. n5 n7 Y+ w/ L3 o5 O
- { , {( v, _1 u! H, H, F$ q1 R
- static uint8_t x;% N! n- L }7 Q0 \7 D* P# O+ b
- 5 |6 B, U: ^7 B8 N- v6 f
- // for TIMER count/ z% |( Q% j! ?- [: N
- if(fg_action)
5 y# ^2 H% f3 a- k6 ^ - {
$ x9 V8 P4 ~) Y5 W - if(++x >= 05)
. E1 W9 T/ B# D - {
: Y- ~, U% D! ] ^; g. N- |& P - x = 0;
8 M3 Y1 J" u6 P
; i8 f0 w+ r1 x+ f- tmr_cnt++; |0 ?& p& T( I/ n6 u! V& `- C
- fg_ref_tmr = TRUE;& y+ i- {! u3 @3 ]1 V8 A
- }& X8 G8 A# T, L$ U
- } 9 S0 u4 U& J; i% p% H/ ?
6 ?' g- }6 z4 `- // for key sw
7 q9 k4 t0 [. a! Z& R' Q1 e - if(GPIO_ReadInputPin(KEY1_GPIO_PORT, KEY1_GPIO_PINS))
) v! [: |9 F* W2 m* l - {% H/ f; q; s: |( M: t7 {
- key1_cnt = 0;/ \1 w5 y' i2 i- {
- }
{) L6 K/ j2 @# } - else6 b% a/ e2 t, d4 _4 h/ j6 e- O# J
- {- c6 R& Z2 z1 U3 Y& v& {
- if(key1_cnt != 0xff)/ d2 r/ A8 Z& }6 f, D
- key1_cnt++;% @. G5 b: o+ R3 F) T) Z
- }
& H( x. c& V- S
/ @* O, C/ \$ V6 S( L5 U- if(GPIO_ReadInputPin(KEY2_GPIO_PORT, KEY2_GPIO_PINS))) ~% Y. w R4 Q; e1 a9 | B
- {/ f/ P3 ]7 ]& Q7 z2 s4 @
- key2_cnt = 0;
/ w8 S1 E+ [4 H2 ? {" P - }
+ ~4 A2 G/ H% r - else. `2 G c6 l; `- }2 z& b
- {1 Z! W0 P. O; i" \
- if(key2_cnt != 0xff)
' r% T; y! D9 T- u i - key2_cnt++;
0 l. ?/ O. p% |! Y% |9 F! l- R - }
% x: B9 k e! d' [
0 ]+ D) ?# k* j7 Y+ r- /* Clear Interrupt Pending bit */5 x+ F3 c* q" R
- TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
) p5 P } I5 ^! X& M- \ - }
复制代码 " v3 T' N% u9 b) m% |! ^- m# {0 t
main 回圈:- void main(void)7 v. s# a1 y( c0 u
- {6 E! N- D4 _ s0 ~, u6 u- `* \
- /* -------------STM8S001 startup-------------- */
! w- J9 j/ G* V: e& F- R - /* delay for SWIM connection: ~5seconds */
; i( O$ T1 i$ E6 J# \ - STARTUP_SWIM_DELAY_5S;8 Q! t' G. \' E$ e
-
1 m k+ t9 a g+ ^( U* a - /* configure unbonded pins */( L* t! }" O" y1 M/ x; B
- CONFIG_UNUSED_PINS_STM8S001;/ v! Q+ @- u1 I4 x: a2 g# s
-
" {# R( K% g+ {& b - GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); // NSS/ R) v6 C9 {& @6 d( _/ n
- GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
o& A+ |, Z D6 Z+ T1 _ a+ B - 1 w& c% B/ d) W( w
- GPIO_Init(KEY1_GPIO_PORT, KEY1_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT); // pin1
, F. N7 D3 W2 D7 G - GPIO_Init(KEY2_GPIO_PORT, KEY2_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT); // pin6
7 f# d: M+ c; i& v1 Z' d+ j - /* ------------------------------------------- */6 B, U9 G: r6 B0 F# S1 s# |* K# k w
- & f2 W" f, ^& D- U& n9 z; n
- /*High speed internal clock prescaler: 1*/
9 o# v p+ g4 }$ N - CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
2 ~( Y0 B/ }% H' o3 U' M
, `2 s% }, d/ G" f9 J2 ]- /* TIM4 configuration -----------------------------------------*/7 X! X+ X. G$ v4 B, o7 U
- TIM4_Config();
* E% v5 `* x2 L0 e0 j$ x7 ]* D
+ ^2 M$ z& B. m- /* SPI configuration */6 n- j4 H6 G* @* b' i* H
- SPI_DeInit();
: f3 w8 r+ y* p, m; v" G - / ?% O! x3 f/ B5 j- @4 K5 L% \
- /* Initialize SPI in Slave mode */
1 }2 i5 M I; v+ p! e: T - SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
5 O6 V: Q- ^3 _5 _ - SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,0x07);
( s2 U9 D6 J- b - 7 M/ v- ?4 F% e/ @0 ]
- /* Enable the SPI*/5 O% \! I3 Z# G
- SPI_Cmd(ENABLE);
3 N" B$ H, b( V/ ~; L) n
& R% p" e+ ], V- MAX7219_Init(); // Init MAX7219
" ?5 r# _+ `1 O$ R9 G - Blank_SEG(); // Blanking SEGMENT 4 N2 t1 X' I) r' q7 b& w
) H$ W4 w3 W& o3 J. ^' }4 \& K! o- fg_action = FALSE;
; I! B- d1 I9 ] - fg_ref_tmr = TRUE;1 W4 U# @6 u( u, v
- tmr_cnt = 0;
5 e0 @) U* N6 d) f7 i: S
' h! G! G" t3 b9 |" l4 z4 J% D- while (1)
A9 X0 p9 X4 z/ A" e. B* Q - {
# ]+ } P1 Q; d& c9 g3 e - if(fg_ref_tmr)$ Y0 [4 K$ n0 Z+ N9 b0 o( c% d: g9 t6 ~
- {0 F, _5 {, [% \* s
- fg_ref_tmr = FALSE;7 V0 X. |( a3 c) Q) {1 ^
- DS_TIMER(tmr_cnt);- r( l6 h8 `2 Z1 m$ z/ T0 p
- }
: R- I$ P* ~. E - $ D$ P* F" b" x7 J( @: r
- if(key1_cnt == 10) // pin10 e P+ Z/ z% Z: {9 K* l6 ~ [' D
- {
- H" R Y' a( E/ a - key1_cnt++;
' `, I' c1 f6 D: i$ h9 [' e
+ u0 I0 R' @2 X0 Q- if(fg_action), W7 a" i) l; A( @& O0 q* {
- fg_action = FALSE;7 K [3 x& p/ D" n$ H- E R
- else
6 c+ O. d3 I3 \ - fg_action = TRUE;
: r3 O' ~# g& s1 s& K. j3 ]1 z& v- a - }
8 m7 x# O6 a' F; D1 ^ - ' t, B" ?6 z& C% b3 A
- if(key2_cnt == 10) // pin6- O' t- M$ _9 \7 ~5 E: X
- {5 P4 |+ n+ \6 r3 ^0 m
- key2_cnt++; i) g5 N8 U8 ]$ [
- 3 e1 O; i D3 H2 a6 J" a0 d* g
- fg_action = FALSE;
% Z8 J+ U; n Z - tmr_cnt = 0;
$ Z1 S9 Q* B( B) m* Y - fg_ref_tmr = TRUE;
+ ~% k5 P! u3 c- q3 s# I - }
6 ^+ P. y/ H* L1 P4 ] [7 Y- w - }
+ Z$ g/ [) T' V5 ~' t# q4 O - }
复制代码 ' m0 a; K l: l% f. C% E
程序下载运行后发现 pin6 的清零功能不太正常,查了一下规格书里面的说明:# Q# Q- m, Q7 V0 b6 V, r
$ s1 t; V; O) ]5 O2 O
5 V: Q$ x8 ], r) a: z) Q# A, s
wpu = weak pull-up
4 @; Z9 W2 m# A a% w; A4 y6 m# U( ^& B6 U' ?
原来这支引脚内部是没有上拉电阻的,我外接了一颗上拉电阻后动作就正常了。6 d" K$ m/ w$ ~8 _0 y8 e
2 i- @) K3 h1 O. d9 [
运行结果:1 r1 B) Y$ E( T4 Q
) P+ F# `! p. I+ s5 @) n
8 [8 I2 z4 s$ O" H# b3 w/ g! K% J% Y" _源代码:
1 G/ B$ y: v0 A6 G3 X
B09.rar
(1.07 MB, 下载次数: 9)
|
感谢关注
感谢关注