1602范例中英文字符串显示函数,如何用变量代替字符串 问题解决了一部分~~
1602范例中英文字符串显示函数原文:void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y );
while (*s)
{
LCD_write_char( 0, *s );
s ++;
}
}
我在使用的时候如果用变量代替s 来显示。那么s必须是字符串
aaa="abc"
LCD_write_string(1,1,aaa)
编译就正常
如果aaa是数值就编译出错
!E D:\AVR\PROG\key1\key1.c(81): type error in argument 3 to `LCD_write_string'; found `unsigned int' expected `pointer to unsigned char'
如何让这他显示一个数值型的变量呢,我是想显示温度值。请使用过的提点下。。
-----此内容被kissme于2005-04-25,00:36:53编辑过 问题解决了一部分
应该把数值型转成字符型,我用itoa()转换了还是有点问题代码如下
#include <STDLIB.H>
unsigned char val;
unsigned char showtext[]; //注如果用 unsigned char *showtext; 他就不显示了。
void main(void) //主程序
{
init();
val=5;
for(;;){
itoa(showtext,val,5);
LCD_write_char(0x01,0); //显示清屏
LCD_write_string(1,0,showtext);
delay_nms(1000);
}
他有时候显示202 有时候显示10 有时候显示143。。。。值都不一样。汗啊。是不是我的
itoa函数没用对??显示其他文本都正常的。 我记得以前用itoa时好像是:第一个参数是整型,第二个参数是字符串,第三个参数是进制。不知道有没有记错。 sprintf(showtext, "%d", val); 将你的指针换掉,就会显示字符,我也是初学者,试了十几遍,才明白如何显示。 这里的形参是三个,分别为XY位置,和你要显示的字符的地址(指针)。
XY和指针都是unsigned char型,
调用的时候可以用下面的方式:
LCD_write_string(0,0,"Hello!");
表示从第1行,第1列开始显示字符串Hello,
另外,
const table[]="Hello";
temp=2;
LCD_write_string(0,1,table);
这个执行的结果是从第2行,第1列开始显示一个字符“e”,这就是数组table中的第temp个字符。 用sprintf(showtext, "%d", val); 也不行,出来的是0,
而且编译出来文件超级大。。
在 iccavr 里面好象 itoa()的第一个参数是字符串,第二个是整型,第三个是小数返回的位数吧我是看他头文件里面定义的类型加的参数。。。我迷糊了。。。 to ztavr
什么指针换掉?我现在是字符型能显示而且正常。就是想把数值的变量显示出来
那就应该把数值转换成字符串,现在怎么转都是错的。 to fsclub
谢谢你。明白了。我现在差数值转换成字符了。 那就用查表:
const table[]="0123456789";
temp=2; //若要显示2,则把2赋给temp;
LCD_write_string(0,1,table); //查表,可以把数2以字符的形式显示到1602上.
这个执行的结果是从第2行,第1列开始显示第3个字符“2”,这就是数组table中的第temp个字符。
要显示54,可以如下处理:
temp=54/10; //由于temp为unsigned char,相除temp=5;
LCD_write_string(0,1,table); //查表,可以把数以字符十位'5'的形式显示到1602上.
temp=54%10; //由于temp为unsigned char,取余temp=4;
LCD_write_string(0,1,table); //查表,可以把数以字符十位'4'的形式显示到1602上.
用上面的方法可以把任何数字显示到1602上.就是作一些除法,取余什么的,再查表就行了. 3Q !!
我是用这方法解决了。我是c的初学者,代码可能不够精简
大家看看。如果能优化的帮忙提出来。
大意是用shownum函数定期更新数组showtext
unsigned char showtext="0";
void shownum(unsigned int xxx)
{
uchar a1,a2,a3,a4,a5;
a1=xxx % 10;
a2=(xxx/10) %10;
a3=(xxx/100) % 10;
a4=(xxx/1000) % 10;
a5=xxx/10000;
if (a5!=0)
{
showtext=a5 | 0x30;
showtext=a4 | 0x30;
showtext=a3 | 0x30;
showtext=a2 | 0x30;
showtext=a1 | 0x30;
}else{
if(a4!=0){
showtext=a4 | 0x30;
showtext=a3 | 0x30;
showtext=a2 | 0x30;
showtext=a1 | 0x30;
showtext=0x20;
}else{
if(a3!=0){
showtext=a3 | 0x30;
showtext=a2 | 0x30;
showtext=a1 | 0x30;
showtext=0x20;
showtext=0x20;
}else{
if(a2!=0){
showtext=a2 | 0x30;
showtext=a1 | 0x30;
showtext=0x20;
showtext=0x20;
showtext=0x20;
}else{
showtext=a1 | 0x30;
showtext=0x20;
showtext=0x20;
showtext=0x20;
showtext=0x20;
}
}
}
}
void main(void){
unsigend char i;
for(;;){
i++;
shownum(i);
LCD_write_string(1,0,showtext);
delay_nms(100);
}
}
-----此内容被kissme于2005-04-25,17:56:38编辑过 最近也在为这事烦恼,ANSI c中用法如下:
函数名: itoa
功 能: 把一整数转换为字符串
用 法: char *itoa(int value, char *string, int radix);
#include <stdlib.h>
//#include
int main(void)
{
int number = 345;
char string;
itoa(number, string, 10);
printf("integer = %d string = %s
", number, string);
return 0;
}
我试过,在windows下可以,ICC里面还是有错误。
-----此内容被yelhak于2005-05-11,02:21:58编辑过 iccavr 中是这样的:
void itoa(char *buf, int value, int base)
converts an integer value to an ASCII string, using base as the radix.
#include <stdlib.h>
//#include
int main(void)
{
int number = 345;
char string;
itoa(string,number, 10);
printf("integer = %d string = %s
", number, string);
return 0;
} 直接把数字加上48就成数字的ASCII码了! 可以用bcd与数字之间的转化函数,然后分别得到高低位数值,与38h相或即可得到asci码值。存在一个数组中即可。
我用ds1302和液晶1602做的时钟就是用这个方法! ICCAVR的stdlib.h中是这样定义的:char *itoa(char *buf, int i, int base);
以下代码测试通过:
#include <stdlib.h>
int main(void)
{
int number = 345;
char string;
itoa(string,number,10);
printf("integer = %d string = %s
", number, string);
return 0;
}
-----此内容被IFine于2005-08-18,15:53:14编辑过 fsclub 发表于 2005-4-25 17:32 static/image/common/back.gif
那就用查表:
const table[]="0123456789";
temp=2; //若要显示2,则把2赋给 ...
{:handshake:} 非常感谢你的提示,我新手正为这事发愁,看到你的帖子终于明白怎么弄了。谢谢!
页:
[1]