本帖最后由 slotg 于 2019-2-18 00:39 编辑
" w3 R2 M6 P- T8 u$ J( R+ B# u/ r1 q1 j
整合前面几个 LAB 的功能我们来实现一个秒表计时器,STM8S001J3 扣除了 SPI 使用的引脚之外可用的 GPIO 就只剩下 pin1 跟 pin6 了,以秒表计时器所需要的功能我们规划 pin1 做为计时开始/停止按钮,按下按钮后计时器以 10ms 间隔加 1 累积,再按一次则停止计时,而 pin6 为清零按钮,按下按钮后计时器清零。" P, ]7 G0 X! `& }) d0 ]- X& k; t, \
: B+ o# q& L% e3 _/ [+ A; ^! A
先建立一个显示的函数,参数为 0 时显示 0.00: S# u. t0 b3 C( D0 p {
- // Display TIMER data. ^6 g0 I$ |& }. H
- void DS_TIMER(uint32_t dta)
- R2 N2 \) a# Y - {' ^& {3 u4 M. H+ t. [0 v. d
- uint8_t buf[8];0 _" a A* {9 h/ u$ |
- int8_t x,y;
, h2 @6 _/ z* E; t D, P - bool fg;! F9 w% [7 m" U: c
8 O& Q# o5 c! ^4 `- for(x=0; x<8; x++)) ^% R% x/ o* m# I, S/ f
- {- ~! M; q3 [7 W/ L* o6 }. \
- buf[x] = dta%10;) ^5 M3 E9 `4 |
- dta /= 10;
! S% ^' e% L6 Z& F5 @* l4 D - }
/ b r4 u2 J8 Y5 h, r: g, e) U9 J
* l6 z9 @+ \, K' f) u, D3 A- fg = FALSE;
4 R9 \' L- q* [# S {( E - for(x=7; x>=0; x--)
4 E* _8 M. \9 O# c$ s - {
. A6 q" x" t* B - if(buf[x] != 0 || fg==TRUE || x<=2)
- `2 N) c3 r$ o/ y8 x6 ]5 F" Q* d# { - {! u N& i: z& V# k. m
- y = buf[x];- V1 ?; |. Q$ |+ u! }
- if(x==2)
' \, I( X* T; X: n- O+ e - {
: I( n* i7 c( x1 [) i0 N5 l - y |= 0x80;' c2 b: n) l9 a7 s: h0 l
- }
1 o, O( H- j1 q - TX_MAX7219(x+1,y);, K2 M+ S5 @2 h/ f, z. E/ S
- fg = TRUE;
; ^3 k: c& `/ b - }
2 M& s$ E0 i% B) z - else% J# H+ u. G# d* v) x& Q) z
- TX_MAX7219(x+1,0x0f);
: W; }) Q; w: `/ [8 F4 C4 `9 A - }
2 a' Y' o" X9 D% C- N6 K - }
复制代码
4 c Z9 T! Y* N8 ^7 r% m按钮的处理方式可参考 【STM8-SO8】04-定时器TIM4的使用 内容。在这里我们设定 TIM4 每 2ms 中断一次,程序中宣告一个 fg_action 变量做为 TIM4 中断时是否累积计时器 tmr_cnt,当 fg_action 为 FALSE 不计数,为 TRUE 时每隔 10ms 计数加 1。) o4 o7 [! _0 O z
% @# w. b0 b' [3 g, v; T
TIM4 中断程序:+ r- H$ Y# B4 W' @4 I) O
- INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)6 B6 L+ v9 l" a0 i8 b7 M( x
- {
. _; s( ~! H# z - static uint8_t x;- w/ g5 {& N' P" P0 s
- 9 E" t! B) m+ K8 ?* i1 n
- // for TIMER count
! _$ b0 V% S8 V Z) ~$ Z - if(fg_action)2 B X! s: y9 a
- {2 b8 @9 k! p( ]5 ~4 z3 z
- if(++x >= 05)
8 @4 U, `4 Z: I) C! R - {
+ c/ `: R$ N I; m* l2 ^& q4 g - x = 0;' j0 [$ _9 B- |3 D) t [+ t
$ E1 @9 B0 M6 z- tmr_cnt++;7 ]- {, Y3 y8 J: G! @8 u
- fg_ref_tmr = TRUE;" p. J" R! p' g0 w- k( r. A
- }( s0 S h( K$ T* X! P1 o2 E7 h
- }
# t: _" N) `* Q1 Y8 D! v. w- p
; s/ _' m2 {* [/ R- // for key sw$ c3 r: L- F/ M
- if(GPIO_ReadInputPin(KEY1_GPIO_PORT, KEY1_GPIO_PINS))
! L- G! g$ @7 x D: k. ]8 X2 h9 ? - {! r; D; A6 s+ h7 E8 k" w
- key1_cnt = 0;
) N* Y0 S- O2 k, S - }! C5 A. c! [ t4 ~' l
- else
7 U9 S* ?; _; R2 s# k; h - {
9 S: c U" |* b' S* e$ D - if(key1_cnt != 0xff)
0 c* Z8 `( L i6 ?9 {; @* o! p _) l - key1_cnt++;
$ @1 v& \2 R* o& ` - }' r7 C, \8 _/ e8 K {
, A' E2 j' a+ e1 `3 a- if(GPIO_ReadInputPin(KEY2_GPIO_PORT, KEY2_GPIO_PINS))9 P2 D5 C' \5 M3 A: s/ V0 T
- {% X; d% F; G& l4 y
- key2_cnt = 0;
' i' ?# M0 h3 U' D9 m* c6 B; h& ~ - }
4 T1 I r4 [5 [) v `$ x% r - else
4 r1 d* d; e' I7 }9 F4 Q. M: A - {9 `% P% \& W4 a7 c$ ?
- if(key2_cnt != 0xff)
1 H3 [ U! ]3 J+ v$ I - key2_cnt++;* P5 F& ?9 @. ^. e/ w
- }
" [. v8 P' ~8 }3 a0 c1 j. ]/ M
7 {* Z: o1 m3 L2 d; ]- /* Clear Interrupt Pending bit */: J9 L8 e& G: y
- TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
/ M* r) D( P! X( p2 o2 L - }
复制代码 % P6 {* E- F2 K( k0 ]) T
main 回圈:- void main(void)- i* J9 e. g' B( M& r. ?
- {7 D. R" O7 _4 x( m& z
- /* -------------STM8S001 startup-------------- */
, u9 O' P; I! ?/ [ V - /* delay for SWIM connection: ~5seconds */5 X0 q$ w9 H6 S6 ]# U. Z0 O- x5 i. ~
- STARTUP_SWIM_DELAY_5S;9 E( [5 M6 Z: z, Y
-
" ?, G, z* J( d - /* configure unbonded pins */
4 e% o t- o) I6 M+ \6 i- q5 _ - CONFIG_UNUSED_PINS_STM8S001;
% @! `7 C8 f5 o2 i" N& J) v - 2 |: o1 V0 `$ z7 `
- GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); // NSS
* x3 [- E1 W% p; c" O6 j3 \ - GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
; ` B0 r7 x, P% E. F - ! h5 `( p( K7 |4 K% n1 A7 f
- GPIO_Init(KEY1_GPIO_PORT, KEY1_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT); // pin1
* e. A: ~/ h1 n2 Y. t5 n - GPIO_Init(KEY2_GPIO_PORT, KEY2_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT); // pin6; u/ ?0 I* n* c
- /* ------------------------------------------- */! |8 }& r, B% \# X
% S# U4 B4 D( U7 w- y+ H2 m; C' ]; b- /*High speed internal clock prescaler: 1*/& v% _. `$ X; [
- CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);; d8 ?* h5 E4 T6 d0 @ R3 G' n
- # I9 p% |3 W/ ^% j
- /* TIM4 configuration -----------------------------------------*/
: ?7 w" D7 ?$ o' _- e7 l - TIM4_Config();
4 t. d# }% u( i# T
4 {$ P* c2 r0 F- /* SPI configuration */4 v2 I8 e f$ R2 [( {9 G
- SPI_DeInit();
5 {3 h8 d! i. V% ` - ; n- j3 f {( T' A6 N
- /* Initialize SPI in Slave mode */0 j. Z$ y( C4 b/ w
- SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
1 l& i0 t: j$ u4 y3 l9 w - SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,0x07);
! \ U4 V) g3 u% Z8 V8 B - : q4 s! ~% d) Z: C; r9 h2 A
- /* Enable the SPI*/
. Z. p$ m9 w5 m, Q4 M- r0 i+ _ - SPI_Cmd(ENABLE);
+ j: `. E8 Y8 X2 C' J4 a: I1 r% X( {% u - , I3 D, m y4 F
- MAX7219_Init(); // Init MAX7219
' l- `+ X. Z6 n7 ]5 Z( `3 } - Blank_SEG(); // Blanking SEGMENT
) k) K/ Z* w" p4 L - 3 |* `5 F1 _' w+ n6 s3 {7 A
- fg_action = FALSE;
( L: p! H) O3 p; T0 p2 I - fg_ref_tmr = TRUE;
5 q) [$ e0 ^3 a6 O& B: V+ W, {# Y - tmr_cnt = 0;
: K$ \+ s8 d& {' j: Z - , X, F* {0 O* F, r4 D6 x2 w
- while (1)# F: S' e' F( N( t q$ E2 g
- {
7 n1 {3 F. S4 Q8 ]0 K - if(fg_ref_tmr)
# K7 o" g% k8 Q H - {$ J6 u4 w ^2 ?* f1 U7 }
- fg_ref_tmr = FALSE;
5 C/ \6 T( _( V9 d$ ] - DS_TIMER(tmr_cnt);2 h# P0 _- }+ W# }& l; a
- }# V# L6 `7 t8 b4 M+ s- F, {
-
9 r4 m$ z3 X2 Y. g% U2 f, u D - if(key1_cnt == 10) // pin1" L/ ?/ i- h6 a% [+ D
- {
# X+ C6 B3 a9 b - key1_cnt++; L. ^1 Z. W* E9 U0 s3 `2 i, S4 Q! |; s
' U/ f/ A) U& f7 J1 s% o- if(fg_action)
o* a- Q9 [+ c: Y$ H - fg_action = FALSE;
4 B# o, a, \6 A2 |/ w$ ? - else0 q9 D! ^( M( E6 o
- fg_action = TRUE;3 _- V: Q& N" ~8 l0 s( _
- }! x/ n5 X) @8 D0 c! h' ]% X2 n
9 K# o0 U+ l( ~- if(key2_cnt == 10) // pin6
' c9 f0 O8 T( F e9 ]3 l" R7 I$ \ - {# T; z; n9 {: Y; S: D4 j% K! [
- key2_cnt++;. r3 d3 P: {+ Q5 k# Q
- 8 S$ G9 I3 D: m
- fg_action = FALSE;
" X5 I% h& v$ m - tmr_cnt = 0;
! W/ S, \( u- l R2 ~' h2 G - fg_ref_tmr = TRUE;) Z l+ i$ ?# p- ]
- }
% d% @% P1 I% o* Y6 `. b- b' C" `$ k - }6 F- u; V9 [, |* F" |! H1 y1 n
- }
复制代码
. y: b0 C- T# R+ d. e: E( L, @4 F+ A程序下载运行后发现 pin6 的清零功能不太正常,查了一下规格书里面的说明:1 t% v; a* O& }2 _! R
& m5 c# R$ _+ V- P: A; u
" y# Y0 o# E* I
wpu = weak pull-up
" C8 Y: h1 Z0 O, j3 ]2 i: U: `: C( r9 L. h+ s }* L/ S) t6 u5 _
原来这支引脚内部是没有上拉电阻的,我外接了一颗上拉电阻后动作就正常了。0 l' ^# ?- z7 o: B
' x# W+ ?6 C4 G) V. `$ h# i3 U运行结果:
) J; ?9 ^" R# {9 x$ X4 N: A
+ n, c2 e0 K" o \+ P
1 s' K' D, j! T6 q3 E; K7 c! X: y源代码:
. P: P: J/ M5 {, M" S0 X3 e$ W
B09.rar
(1.07 MB, 下载次数: 8)
|
感谢关注
感谢关注