本帖最后由 baiyongbin2009 于 2015-1-12 11:08 编辑 : t0 ~7 U& x2 e& V7 f8 a
# A+ o* l5 H( g% M0 I4 O$ g# M+ Q$ P
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
3 l. B8 J$ C: p9 B第7章 STemWin数值显示 ( K Q) L5 c- d8 y/ p) p/ U4 q; l# V
本期主要讲数值的显示,整体来说比较的简单,但很适合初学者看,有些数值显示函数在使用上要特别注意,刚学的时候最容易在这些函数上犯错误。 当然,我们可以使用字符串和标准C库的函数来显示数值。然而,有时候这会是件困难的事。通常,较为容易(也更为有效)的是调用一个例程显示所需结构的数值。emWin支持各种十进制、十六进制和二进制输出。本章将对这些例程进行逐一描述。所有函数不需要使用浮点库,并对速度和大小进行了优化,当然“Sprintf”可以用于任何系统。使用本章介绍的例程,有时可以简化操作,节省ROM空间和执行时间。 7. 1 显示十进制数值 7. 2 显示十六进制和二进制 7. 3 显示浮点数值 7. 4 实验总结 7.1 显示十进制数值
/ x* D& E8 [% [5 t# |# M5 [9 f K5 Z* S7 J
7.1.1 函数GUI_DispDec() 这个要注意的是首位不能是0,是0的话显示会出现错误。显示负数的话,负号也要算在No. of digits(看英文手册的说明,它的意思是整个数字的个数,包括正负号,如果有小数点的话,还要包括小数点)里面,切记,要不也会出错。 设置的No.of digits比实际要显示的字符串大的话,前面会补0。 设置的No.of digits比实际要显示的字符串小的话,会出现错位。 在STemWin5.24模拟器上面跑如下代码: - #include "GUI.h"
5 S9 Z/ f8 b! r: c+ I6 e. X+ @ - , ^- A9 L4 D8 S! t3 [. s
- void MainTask(void)
# {( `: {9 C1 e5 h3 }* N- h - {; U/ v' b1 y8 i! c' F) |8 y5 ?
- /* 初始化 */
: S+ A4 u* E9 q% n; ~ - GUI_Init();
0 h ~$ O7 ^: \/ K; \. y# q - 0 ]( `' g; M+ H7 L# x- D! U
- /* 设置数值显示字体 */& z- k0 W! J% E) T: ~/ O! u
- GUI_SetFont(&GUI_Font24B_ASCII);
) e! `1 J+ x1 K' O - 9 C0 U; Q$ Y% u J: z2 @1 P" M& B8 @
- /* 设置显示数值 */
6 q4 k3 j- D" G2 V - GUI_GotoXY(0,0);
9 ]; [, S. {! c# o& R4 }6 ` - GUI_DispDec(-123,4);
+ I- F R* a, n/ P5 \7 W8 m - GUI_GotoXY(100,0);
" c3 Z; ?: A' c: m% E - GUI_DispDec(012,4);
( }5 Q# a. i v; A& o4 z& z - GUI_GotoXY(200,0);
0 J6 H m* x! N; N - GUI_DispDec(1234,7); 4 u- l& A( |( A4 d0 A! R4 v
- GUI_GotoXY(300,0);
6 a( X9 `% |0 a0 g, L5 ] - GUI_DispDec(1234,2);+ W7 B5 R/ C* {7 v; N) T
-
~5 j g! @- k k- \ W - while (1)
' b4 U- A0 F4 A4 u* a4 ^9 l - {
( ~: O. O. m+ ]% w0 x - GUI_Delay(10);
/ |: `! U1 j6 c- x- p7 i- ^ - }) e5 C* k8 ~) K, s- P% }, d* S
- }
复制代码实际显示效果如下:
% e. d. ?2 k _( A7.1.2 函数GUI_DispDecAt() 这个的显示类似上面,只是多了个可以设置显示的坐标。 在STemWin5.24模拟器上面跑如下代码: - #include "GUI.h"0 f3 f. @1 C0 D M3 U
- . ]2 W$ h0 B" H* `# s/ S: G6 Y7 ~
- void MainTask(void)
f+ O" [# u. b* ~# E* |; k - {
- F3 E; e) Z+ u a6 H" M. l' R - /* 初始化 */
1 l. A' c. ]. r3 y- @& V5 d0 s - GUI_Init();
$ s- | n3 G1 D6 x- S - % p5 N1 H2 D; W
- /* 设置数值显示字体 */! b4 Z4 C3 {6 q9 W/ y9 \
- GUI_SetFont(&GUI_Font24B_ASCII);# V- d5 H* g9 `! ^9 `* K ?
- 4 Q, D2 P6 P% a+ R/ T% X& c
- /* 设置显示数值 */
5 a. f+ M' Y- @# z$ g" a, u! m - GUI_GotoXY(0,0);4 k; K& ]5 f5 s! {. t2 w1 b
- GUI_DispDecAt(-123,0,20,5);
- f. k6 A$ k; |. C6 I$ a+ ? - GUI_DispDecAt(045 ,100,20,3);( X# p2 k& H& \. L, f
- GUI_DispDecAt(345 ,200,20,5);
$ m+ M) a9 o6 R5 d7 a$ A1 I - GUI_DispDecAt(345 ,300,20,2);
7 z! M& L) ]9 }, ^% E0 c- R6 J! ~ - ;1 s5 z8 ]% b1 m3 h
-
- J6 a2 \ i1 q" n, ?1 S: z' {$ U - while (1): H, Q$ Z2 @# _; d
- {) C8 f4 E: ~0 {; M% M
- GUI_Delay(10);/ g6 u* T: M/ P. Z( G7 f
- }0 L. B2 X. L3 I( \) \% G5 Z6 D5 `
- }
复制代码实际显示效果如下:
! x* }/ D7 h. W! f3 i7.1.3 函数GUI_DispDecMin() 使用这个函数不需要指定长度,会自动的使用最少的字符显示,如果需要对其方式且显示的个数不一样,这个函数不合适。这个函数的首位也不可以是0,是0的话也会出现错位。 在STemWin5.24模拟器上面跑如下代码: - #include "GUI.h"
H& Y- K6 P; a ] - 9 z7 R9 o+ [2 h# G# G; I
- void MainTask(void)
/ u9 b5 ~4 A3 y& S - {8 O. X ?& V' r8 P( o4 a
- /* 初始化 */
" M4 s0 l8 n B- S+ P - GUI_Init();
5 v, A) n0 N% j) j: |, c. c -
/ F- s: L7 F4 @" ~ - /* 设置数值显示字体 */
7 {+ C. E5 i) U6 m% a - GUI_SetFont(&GUI_Font24B_ASCII);8 g" ^* J9 w" B/ i; g
-
: f# _0 A; ?# G) i# S) J1 X - /* 设置显示数值 */
5 P# A& H' r- p% j - GUI_GotoXY(0,40); ; r3 s- j3 q& |3 L, k( w( z; R
- GUI_DispDecMin(-33232);
" @7 c, H9 o4 m1 _ - GUI_GotoX(100);
/ ]) r% Z: f1 _$ |2 [3 b - GUI_DispDecMin(0032); 4 f6 I9 s8 e! @8 T3 h& A, Y
- GUI_GotoX(200);
, p3 E ]! k+ `" X& H( }8 r - GUI_DispDecMin(00330); . a+ M' }' @; u
- GUI_GotoX(260); * B+ U* y8 ^& ]/ N" ~' g
- GUI_DispDecMin(5980);7 P/ }, \- B7 _/ r; E8 R
- ;
) a$ j' m' j$ B- Q% W6 ]3 X, k7 @ - 1 ?0 @' |/ u$ @& F3 S$ D
- while (1): u: Z( q$ s# A! v
- {
. @- P" @( s7 y6 z3 G - GUI_Delay(10);: s" `6 v, @: a- O3 |
- }) W* o1 V# x! G4 _ N
- }
复制代码实际显示效果如下: 6 o* d1 K& u0 X" N1 R" M$ w) Q
7.1.4 函数GUI_DispDecShift() 首位也不可以是0。负号和小数点都要算在No.of digits,最大支持9位。No. of digits设置的大了的话前面要补0。 在STemWin5.24模拟器上面跑如下代码: - #include "GUI.h"7 S3 P8 T/ f1 ]/ p3 N
- : T" X8 t# K6 Q- y0 C% U: r
- void MainTask(void)% c) g$ F$ e; ?, I+ z
- {
; K- V: B& E5 w+ h8 \ - /* 初始化 */
$ F' k0 P+ f7 ^1 E - GUI_Init();
7 i: m. U3 _- g - 2 b- Q+ t9 h& U
- /* 设置数值显示字体 */
! P, x% d, W' f+ V2 e - GUI_SetFont(&GUI_Font24B_ASCII);2 x: N) m/ I- T% I
- - j5 B! X& O7 ?* Z( K7 i
- /* 设置显示数值 */+ Z2 C) I7 E4 ?" l @) O
- GUI_GotoXY(0,60);. g" _' ?4 i# d( O" a' j, h* |
- GUI_DispDecShift(1234,4,2);
' ?3 E: s0 o0 @1 B2 E4 u# U9 K - GUI_GotoX(100);
' K, f4 r* X6 v& b0 z1 p - GUI_DispDecShift(01234,6,2);
" }$ T; y4 }6 [ - GUI_GotoX(200);
( [: K5 @/ q; e$ d' V2 U) @; i - GUI_DispDecShift(-1234,6,2); : Y/ D1 d, q! I
- GUI_GotoX(300);8 B: n9 Y2 B; F8 H* C$ T
- GUI_DispDecShift(1234,5,2);
o; {7 I {1 x# r - GUI_GotoXY(0,80);/ {+ x( {9 y3 T
- GUI_DispDecShift(123456789,9,2);
2 Z0 F$ A) P( ]. M" Q: N - GUI_GotoX(200);
% I- W7 h8 o! a+ N8 w n. K - GUI_DispDecShift(12345678,9,2);5 K/ J @$ `2 g3 J* f/ k1 [
- ;
: B5 r7 V! j, c% z# j - while (1)( ? @5 q: s% s, [7 _3 y
- {
4 j1 c- |2 j8 ~7 {3 i - GUI_Delay(10);
) c" E' c* l1 E! ^, N' x' X - }% D3 d3 x) K; t) j
- }
复制代码实际显示效果如下:
# z$ ~+ V- D' h4 m9 b+ H e7.1.5 函数GUI_DispSDec() 类似于GUI_DispDec(),不支持首位是0,不管是正的,还是负的,都要显示负号,而且这个正负号也要算在No. of digits里面。 在STemWin5.24模拟器上面跑如下代码: - #include "GUI.h"
, k/ y8 Z+ s& l7 s+ u( {' _/ c' W - g6 g7 P( W; z! M9 O9 }4 M
- void MainTask(void). Z: l& Z. x& h! j# v5 F
- {
" V0 \! V4 _/ N. q2 H8 f# R1 R3 { - /* 初始化 */
" {1 f {2 Q) b' |3 X+ n! i! q - GUI_Init();
- |. j3 P% }3 f -
$ t, \& E6 l! a7 {' t" X - /* 设置数值显示字体 */; W4 d# m1 S! l. u
- GUI_SetFont(&GUI_Font24B_ASCII); W# K' w2 V$ J1 J
-
5 A& ~) j# \0 z - /* 设置显示数值 */
) N& g- x/ H8 }4 i( X" y1 U2 P - GUI_GotoXY(0,100);0 f% E) P& S4 X8 W/ X7 p C
- GUI_DispSDec(-1234,5);
* c$ r3 p* h: f7 T& l/ A& z7 x) [ - GUI_GotoX(100);
6 G/ ~2 j7 {4 ~) {5 B - GUI_DispSDec(1234,5);
# q4 @) t1 L; W. P: l: O, s+ A - GUI_GotoX(200);
$ _5 ]. ~1 i& ]' f - GUI_DispSDec(1234,3);* k% G# _5 z' R1 m
- GUI_GotoX(300);
3 T! ?' w% o, ?0 r2 Q - GUI_DispSDec(0234,5);6 \4 B8 {- }1 L8 n* j6 `1 L
- GUI_GotoXY(0,120);; ~4 M. Z( E& V$ p+ Y
- ;
3 m, L. i3 n8 L* t0 P) V" a - while (1)
$ c& i! C+ U' A; C - {; U% t" O0 a7 T9 @7 Y& \
- GUI_Delay(10);
. ~) L; a4 ?* S - }
. W5 S4 y* N3 G' D7 t Y - }
复制代码实际显示效果如下: 8 D8 P( X6 Q- I: l2 A
7.1.6 函数GUI_DispSDecShift() 这个函数是GUI_DispSDec()和GUI_DispDecShift()的合并版,只要注意No. of digits里面要包括正号负号还有小数点。 在STemWin5.24模拟器上面跑如下代码: - #include "GUI.h"
6 R! _; v; P% }" l$ t( ^ -
7 }# S. r. K7 U2 }& _ - void MainTask(void)
! B( _- D( t6 {' n1 y5 j - {* F; _- F( \' [8 D/ ?/ p( Y* ^
- /* 初始化 */1 I; E- h3 X9 V* X
- GUI_Init();
6 @2 D" M+ D8 ?$ J) P/ U/ E" w - 4 F4 j8 @0 ]5 W. ?7 J; K
- /* 设置数值显示字体 */; O5 Z. W* o: y) ]4 _1 `, @
- GUI_SetFont(&GUI_Font24B_ASCII);
/ z0 s+ k5 `! K -
7 C8 ?2 O1 V* i5 {+ L, G - /* 设置显示数值 */
3 @, y( P) E) T, o' v - GUI_DispSDecShift(02345,7,3); 0 M6 d4 X2 c2 W' I
- GUI_GotoX(100);/ F- d+ h3 \' F/ v$ B
- GUI_DispSDecShift(345,6,2);; l5 O: b! \9 U1 ?, _1 x8 ?
- GUI_GotoX(200); A8 a; N4 u$ n
- GUI_DispSDecShift(12345,3,3);
& Y1 @' n! h7 w4 h7 @) q! K& E - GUI_GotoX(300);
- i; \0 V: Y! _" H - GUI_DispSDecShift(-1234,6,3);2 ~; _# k p- }: U
- ;; }- n4 G; ^6 |% B5 p
- while (1)8 A6 E( ^1 d) {2 k) C
- {$ ~3 J5 \; O0 W
- GUI_Delay(10);, _9 ~" t" x# g! _! m0 V1 z
- }
0 V2 A7 G1 a2 n% ? - }
复制代码实际显示效果如下:
* B$ n, b& _" l4 \. K 总结:用时一定要保证自己设置的No. ofdigits要大于等于自己实际要显示的。多了的话前面会补零,少了的话就会出错的,显示一堆9。
4 |$ f* h' o- A0 j* U/ b4 X, I7 t; R1 ], d$ j
7 h; J$ }3 k! `- B5 {
|
GUI_DispBinAt()
GUI_DispHex()2 _9 v2 r$ u3 x, t( x
GUI_DispHexAt()
数值的显示也属于最基本的功能,初学者要多练练这些相关的函数,实践出真知。2 p$ Y' d$ `; }8 g: e