权建军,胡佩琦
(兰州石化职业技术学院 电子电气工程系,兰州 730050)
在嵌入式应用系统的开发中,经常遇到通过LCD显示数据、通过键盘键入数据之类的问题。
LCD显示,由于显示方式灵活、界面友好,在嵌入式应用系统中得到了广泛的应用。在嵌入式应用系统中,较为常用的LCD有字符型的1602、点阵型的LCM12864,以及带汉字库的12864Z等。无论哪种LCD,其显示字符都用ASCII码。而要显示数值,就必须进行数值到字符串的变换。
同样,在嵌入式系统中,经常使用矩阵键盘进行数据等的键入,如输入“幅值”、“相位”等数据信息。对于数字的键入,就必然涉及字符串到数据的转换问题。
从数据到字符串的转换,典型方法是先进行字位分离,将每个字转为ASCII码(数字+0x30即转为ASCII码)后送LCD显示。这种方法比较繁琐,每次显示都要进行这样的工作。
当然,也可以利用itoa函数编写从整型到字符串的转换函数,把整型数转换为字符串,进而送LCD显示。下面就是把整型数转为字符串的程序:
这种方法对空间占用不大,对于无符号整型数是比较方便的;对于有符号的整型数,需要判断正负,程序编写方法也类似;对于浮点数,编制这种程序比较繁琐。
其实,除此之外,KEIL C和ICC还提供了更为有效的方法,实现数据到字符串的转换。
在KEIL C的stdio.h中提供了sprintf语句可以进行数据到字符串的格式转换。以下是在KEIL C环境下编写的LCD1602显示整型数和浮点数的程序:
运行的结果是在LCD1602第1行显示“a=-1235”,第2行显示“b=1.235”。
程序中,“sprintf(Buf1,"a=%d",a)”是将整型变量a转换为字符型变量,并存在数组Buf1[10]中;“sprintf(Buf2,"b=%2.3f",b)”是将浮点变量b转换为字符型变量,并存在数组Buf2[10]中。若使用“sprintf(Buf2,"%2.3f",b)”语句,产生的hex代码要增加约7KB。
在AVR系统中,ICC开发平台允许使用sprintf语句进行数据到字符串的格式转换。同时,为了高精度显示,AVR允许使用浮点数。下面是整型数和浮点数转换为字符串显示的例子:
需要注意的是,使用sprintf语句时,要在ICC开发平台下project的option选项中,对target选项进行设置,在PRINTF Version中选择float选项,同时,将return stack size设为30。
采用此方法的缺点是生成的代码较大(增加约7.5 KB)。最后的显示结果为:第1行显示“ch0:1256”;第2行显示“ch1:-3579”;第3行显示“ch2:127.5”;第4行显示”ch3:-0.985”。
注意,如要将小数后位数保留2位,采用sprintf(Buf4,"%2.2f",w)时编译不能通过。字符串的长度是通过“unsigned char Buf1[7],Buf2[7],Buf3[7],Buf4[7];”来定义的。
字符串到数据转换的常规方法是用数位分离的方法,如下面的程序:
采用该方法对整型数进行转换时,必须知道数据长度,而且,对其他类型的数据转换不太方便。
其实,在KEIL和ICC中,都提供了头文件stdlib.h,利用该文件提供的atoi转换函数可以方便实现转换。该文件可以在KEIL和ICC的安装路径下看到。
在KEIL的安装根目录下的INC文件夹中,可以查看stdlib.h文件,该文件提供了字符串到数据的转换函数,使用这些函数必须包含该头文件。
下面的程序实现了字符串转换为整型数和浮点数:
在AVR的ICC开发平台中也有“stdlib.h”头文件,它提供的atoi函数可以实现字符串转数字。程序如下:
在AVR Studio的VIEW窗口进行调试时,观察p、q分别为-598和-5.98。
介绍了MCS51和AVR开发中,LCD应用开发中经常使用的数据到字符串的转换方法,以及键盘应用开发中从字符串到数据的转换方法。该方法充分利用KEIL和ICC开发平台资源,可有效提高开发效率。
[1]戴佳,戴卫恒.51单片机C语言应用程序设计实例[M].北京:电子工业出版社,2006:123-135.
[2]彭伟.单片机C语言程序设计实训100例——基于AVR+Proteus[M].北京:北京航空航天大学出版社,2011.
[3]刘建清.轻松玩转AVR单片机C语言[M].北京:北京航空航天大学出版社,2011.