硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4765|回复: 2
收起左侧

[emWin教程入门篇] 【STemWin教程】第7章 STemWin数值显示

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-1-10 14:50:20 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第7章      STemWin数值显示

    本期主要讲数值的显示,整体来说比较的简单,但很适合初学者看,有些数值显示函数在使用上要特别注意,刚学的时候最容易在这些函数上犯错误。
    当然,我们可以使用字符串和标准C库的函数来显示数值。然而,有时候这会是件困难的事。通常,较为容易(也更为有效)的是调用一个例程显示所需结构的数值。emWin支持各种十进制、十六进制和二进制输出。本章将对这些例程进行逐一描述。所有函数不需要使用浮点库,并对速度和大小进行了优化,当然“Sprintf”可以用于任何系统。使用本章介绍的例程,有时可以简化操作,节省ROM空间和执行时间。
    7. 1  显示十进制数值
    7. 2  显示十六进制和二进制
    7. 3  显示浮点数值

    7. 4  实验总结

7.1  显示十进制数值
7.1.1      函数GUI_DispDec()
    这个要注意的是首位不能是0,是0的话显示会出现错误。显示负数的话,负号也要算在No. of digits(看英文手册的说明,它的意思是整个数字的个数,包括正负号,如果有小数点的话,还要包括小数点)里面,切记,要不也会出错。
    设置的No.of digits比实际要显示的字符串大的话,前面会补0。
    设置的No.of digits比实际要显示的字符串小的话,会出现错位。
    在STemWin5.24模拟器上面跑如下代码:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.      /* 初始化 */
  5.      GUI_Init();
  6.    
  7.      /* 设置数值显示字体 */
  8.      GUI_SetFont(&GUI_Font24B_ASCII);
  9.      /* 设置显示数值 */
  10.      GUI_GotoXY(0,0);
  11.      GUI_DispDec(-123,4);                        
  12.      GUI_GotoXY(100,0);
  13.      GUI_DispDec(012,4);                                 
  14.      GUI_GotoXY(200,0);
  15.      GUI_DispDec(1234,7);                        
  16.      GUI_GotoXY(300,0);
  17.      GUI_DispDec(1234,2);
  18.     while (1)
  19.     {
  20.         GUI_Delay(10);
  21.     }
  22. }
复制代码

    实际显示效果如下:
7.1.png


7.1.2      函数GUI_DispDecAt()
    这个的显示类似上面,只是多了个可以设置显示的坐标。
    在STemWin5.24模拟器上面跑如下代码:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.      /* 初始化 */
  5.      GUI_Init();
  6.    
  7.      /* 设置数值显示字体 */
  8.      GUI_SetFont(&GUI_Font24B_ASCII);
  9.      /* 设置显示数值 */
  10.      GUI_GotoXY(0,0);
  11.      GUI_DispDecAt(-123,0,20,5);                 
  12.      GUI_DispDecAt(045 ,100,20,3);
  13.      GUI_DispDecAt(345 ,200,20,5);                    
  14.      GUI_DispDecAt(345 ,300,20,2);
  15. ;
  16.     while (1)
  17.     {
  18.         GUI_Delay(10);
  19.     }
  20. }
复制代码

    实际显示效果如下:
7.2.png



7.1.3      函数GUI_DispDecMin()
    使用这个函数不需要指定长度,会自动的使用最少的字符显示,如果需要对其方式且显示的个数不一样,这个函数不合适。这个函数的首位也不可以是0,是0的话也会出现错位。
    在STemWin5.24模拟器上面跑如下代码:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.      /* 初始化 */
  5.      GUI_Init();
  6.    
  7.      /* 设置数值显示字体 */
  8.      GUI_SetFont(&GUI_Font24B_ASCII);
  9.      /* 设置显示数值 */
  10.      GUI_GotoXY(0,40);                                                
  11.      GUI_DispDecMin(-33232);                                 
  12.      GUI_GotoX(100);                                                                           
  13.      GUI_DispDecMin(0032);                  
  14.      GUI_GotoX(200);                                                                           
  15.      GUI_DispDecMin(00330);               
  16.      GUI_GotoX(260);                                                                           
  17.      GUI_DispDecMin(5980);
  18. ;
  19.     while (1)
  20.     {
  21.         GUI_Delay(10);
  22.     }
  23. }
复制代码

    实际显示效果如下:
7.3.png


7.1.4      函数GUI_DispDecShift()
    首位也不可以是0。负号和小数点都要算在No.of digits,最大支持9位。No. of digits设置的大了的话前面要补0。
    在STemWin5.24模拟器上面跑如下代码:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.      /* 初始化 */
  5.      GUI_Init();
  6.    
  7.      /* 设置数值显示字体 */
  8.      GUI_SetFont(&GUI_Font24B_ASCII);
  9.      /* 设置显示数值 */
  10.      GUI_GotoXY(0,60);
  11.      GUI_DispDecShift(1234,4,2);               
  12.      GUI_GotoX(100);
  13.      GUI_DispDecShift(01234,6,2);      
  14.      GUI_GotoX(200);
  15.      GUI_DispDecShift(-1234,6,2);      
  16.      GUI_GotoX(300);
  17.      GUI_DispDecShift(1234,5,2);
  18.      GUI_GotoXY(0,80);
  19.      GUI_DispDecShift(123456789,9,2);     
  20.      GUI_GotoX(200);
  21.      GUI_DispDecShift(12345678,9,2);
  22. ;
  23.     while (1)
  24.     {
  25.         GUI_Delay(10);
  26.     }
  27. }
复制代码

    实际显示效果如下:
7.4.png


7.1.5      函数GUI_DispSDec()
    类似于GUI_DispDec(),不支持首位是0,不管是正的,还是负的,都要显示负号,而且这个正负号也要算在No. of digits里面。
    在STemWin5.24模拟器上面跑如下代码:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.      /* 初始化 */
  5.      GUI_Init();
  6.    
  7.      /* 设置数值显示字体 */
  8.      GUI_SetFont(&GUI_Font24B_ASCII);
  9.      /* 设置显示数值 */
  10.      GUI_GotoXY(0,100);
  11.      GUI_DispSDec(-1234,5);                 
  12.      GUI_GotoX(100);
  13.      GUI_DispSDec(1234,5);                        
  14.      GUI_GotoX(200);
  15.      GUI_DispSDec(1234,3);
  16.      GUI_GotoX(300);                             
  17.      GUI_DispSDec(0234,5);
  18.      GUI_GotoXY(0,120);
  19. ;
  20.     while (1)
  21.     {
  22.         GUI_Delay(10);
  23.     }
  24. }
复制代码

    实际显示效果如下:
7.5.png


7.1.6      函数GUI_DispSDecShift()
    这个函数是GUI_DispSDec()和GUI_DispDecShift()的合并版,只要注意No. of digits里面要包括正号负号还有小数点。
    在STemWin5.24模拟器上面跑如下代码:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.      /* 初始化 */
  5.      GUI_Init();
  6.    
  7.      /* 设置数值显示字体 */
  8.      GUI_SetFont(&GUI_Font24B_ASCII);
  9.      /* 设置显示数值 */
  10.      GUI_DispSDecShift(02345,7,3);      
  11.      GUI_GotoX(100);
  12.      GUI_DispSDecShift(345,6,2);
  13.      GUI_GotoX(200);
  14.      GUI_DispSDecShift(12345,3,3);
  15.      GUI_GotoX(300);
  16.      GUI_DispSDecShift(-1234,6,3);
  17. ;
  18.     while (1)
  19.     {
  20.         GUI_Delay(10);
  21.     }
  22. }
复制代码

    实际显示效果如下:
7.6.png

    总结:用时一定要保证自己设置的No. ofdigits要大于等于自己实际要显示的。多了的话前面会补零,少了的话就会出错的,显示一堆9。
7.2  显示十六进制和二进制数值
          GUI_DispBin()
          GUI_DispBinAt()
          GUI_DispHex()
          GUI_DispHexAt()
    这四个差不多,第一个最大支持32位的显示,后面三个中最大支持16位,No. of digits设置的多了的话前面会补零,少了的话有几个显示几个。
    在STemWin5.24模拟器上面跑如下代码:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.      /* 初始化 */
  5.      GUI_Init();
  6.    
  7.      /* 设置数值显示字体 */
  8.      GUI_SetFont(&GUI_Font24B_ASCII);
  9.      /* 设置显示数值 */
  10.      GUI_GotoXY(0,140);
  11.      GUI_DispBin(0x08,8);   
  12.      GUI_GotoX(100);
  13.      GUI_DispBin(0x88,9);      
  14.      GUI_GotoX(200);
  15.      GUI_DispBin(0x08,6);
  16.      GUI_GotoX(300);
  17.      GUI_DispBin(0x08,2);
  18.      GUI_DispBinAt(0x55,0,160,8);
  19.      GUI_DispBinAt(0x55,100,160,7);
  20.      GUI_DispBinAt(0x05,200,160,4);
  21.      GUI_DispBinAt(0x05,300,160,16);
  22. ;
  23.     while (1)
  24.     {
  25.         GUI_Delay(10);
  26.     }
  27. }
复制代码

    实际显示效果如下:
7.7.png


7.3  显示浮点数值
    关于浮点的ucGUI里面有个很好的说明的例子。
    在STemWin5.24模拟器上面跑如下代码:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.      float f = 123.45678f;
  5.      /* 初始化 */
  6.      GUI_Init();
  7.    
  8.      /* 设置数值显示字体 */
  9.      GUI_SetFont(&GUI_Font8x8);
  10.      /* 设置显示数值 */
  11.      GUI_Clear();
  12.      GUI_DispStringAt("GUI_DispFloat:\n",0,0);
  13.      GUI_DispFloat (f,9);
  14.      GUI_GotoX(100);
  15.      GUI_DispFloat (-f,9);
  16.      GUI_DispStringAt("GUI_DispFloatFix:\n",0,20);
  17.      GUI_DispFloatFix (f,9,2);
  18.      GUI_GotoX(100);
  19.      GUI_DispFloatFix (-f,9,2);
  20.      GUI_DispStringAt("GUI_DispSFloatFix:\n",0,40);
  21.      GUI_DispSFloatFix (f,9,2);
  22.      GUI_GotoX(100);
  23.      GUI_DispSFloatFix (-f,9,2);
  24.      GUI_DispStringAt("GUI_DispFloatMin:\n",0,60);
  25.      GUI_DispFloatMin (f,3);
  26.      GUI_GotoX(100);
  27.      GUI_DispFloatMin (-f,3);
  28.      GUI_DispStringAt("GUI_DispSFloatMin:\n",0,80);
  29.      GUI_DispSFloatMin (f,3);
  30.      GUI_GotoX(100);
  31.      GUI_DispSFloatMin (-f,3);
  32.      GUI_SetFont(&GUI_Font6x8);
  33.      GUI_DispStringAt("Press any key",0, 240-8);
  34.      ;
  35.     while (1)
  36.     {
  37.         GUI_Delay(10);
  38.     }
  39. }
复制代码

    实际显示效果如下:
7.8.png


7.4  实验总结
    数值的显示也属于最基本的功能,初学者要多练练这些相关的函数,实践出真知。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

4

主题

7

回帖

4

积分

新手上路

积分
4
发表于 2016-3-13 18:53:17 | 显示全部楼层
想问一下,while里面的延时的数值是怎么定的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2016-3-13 20:16:55 | 显示全部楼层

回 电容屏 的帖子

电容屏:想问一下,while里面的延时的数值是怎么定的? (2016-03-13 18:53) 
这个要看用户给emWin提供的时间基准,裸机的一般放在GUI_X.c文件里面定义。

带OS的一般放在GUI_X_uCOS.C, GUI_X_FreeRTOS.C等文件里面定义。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 20:17 , Processed in 0.161684 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表