搜索
bottom↓
回复: 16

1602范例中英文字符串显示函数,如何用变量代替字符串 问题解决了一部分~~

[复制链接]

出0入0汤圆

发表于 2005-4-24 22:49:43 | 显示全部楼层 |阅读模式
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编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2005-4-25 00:36:14 | 显示全部楼层
问题解决了一部分

应该把数值型转成字符型,我用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函数没用对??显示其他文本都正常的。

出0入0汤圆

发表于 2005-4-25 08:38:15 | 显示全部楼层
我记得以前用itoa时好像是:第一个参数是整型,第二个参数是字符串,第三个参数是进制。不知道有没有记错。

出0入0汤圆

发表于 2005-4-25 10:27:25 | 显示全部楼层
sprintf(showtext, "%d", val);

出0入0汤圆

发表于 2005-4-25 11:10:53 | 显示全部楼层
将你的指针换掉,就会显示字符,我也是初学者,试了十几遍,才明白如何显示。

出0入0汤圆

发表于 2005-4-25 11:27:55 | 显示全部楼层
这里的形参是三个,分别为XY位置,和你要显示的字符的地址(指针)。

XY和指针都是unsigned char型,

调用的时候可以用下面的方式:

LCD_write_string(0,0,"Hello!");

表示从第1行,第1列开始显示字符串Hello,

另外,

const table[]="Hello";

temp=2;

LCD_write_string(0,1,table[temp]);

这个执行的结果是从第2行,第1列开始显示一个字符“e”,这就是数组table中的第temp个字符。

出0入0汤圆

 楼主| 发表于 2005-4-25 11:39:20 | 显示全部楼层
用sprintf(showtext, "%d", val); 也不行,出来的是0,

而且编译出来文件超级大。。

在 iccavr 里面好象 itoa()的第一个参数是字符串,第二个是整型,第三个是小数返回的位数吧我是看他头文件里面定义的类型加的参数。。。我迷糊了。。。

出0入0汤圆

 楼主| 发表于 2005-4-25 11:43:58 | 显示全部楼层
to ztavr

什么指针换掉?我现在是字符型能显示而且正常。就是想把数值的变量显示出来

那就应该把数值转换成字符串,现在怎么转都是错的。

出0入0汤圆

 楼主| 发表于 2005-4-25 11:45:52 | 显示全部楼层
to fsclub

谢谢你。明白了。我现在差数值转换成字符了。

出0入0汤圆

发表于 2005-4-25 17:32:05 | 显示全部楼层
那就用查表:

const table[]="0123456789";

temp=2;                               //若要显示2,则把2赋给temp;

LCD_write_string(0,1,table[temp]);    //查表,可以把数2以字符的形式显示到1602上.



这个执行的结果是从第2行,第1列开始显示第3个字符“2”,这就是数组table中的第temp个字符。



要显示54,可以如下处理:

temp=54/10;                           //由于temp为unsigned char,相除temp=5;

LCD_write_string(0,1,table[temp]);    //查表,可以把数以字符十位'5'的形式显示到1602上.

temp=54%10;                           //由于temp为unsigned char,取余temp=4;

LCD_write_string(0,1,table[temp]);    //查表,可以把数以字符十位'4'的形式显示到1602上.



用上面的方法可以把任何数字显示到1602上.就是作一些除法,取余什么的,再查表就行了.

出0入0汤圆

 楼主| 发表于 2005-4-25 17:55:17 | 显示全部楼层
3Q !!

我是用这方法解决了。我是c的初学者,代码可能不够精简

大家看看。如果能优化的帮忙提出来。



大意是用shownum函数定期更新数组showtext



unsigned char showtext[15]="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[0]=a5 | 0x30;

showtext[1]=a4 | 0x30;

showtext[2]=a3 | 0x30;

showtext[3]=a2 | 0x30;

showtext[4]=a1 | 0x30;

}else{

if(a4!=0){

          showtext[0]=a4 | 0x30;

                  showtext[1]=a3 | 0x30;

                  showtext[2]=a2 | 0x30;

                  showtext[3]=a1 | 0x30;

                  showtext[4]=0x20;

                  }else{

                  if(a3!=0){

                            showtext[0]=a3 | 0x30;

                             showtext[1]=a2 | 0x30;

                           showtext[2]=a1 | 0x30;

                           showtext[3]=0x20;

                           showtext[4]=0x20;

                            }else{

                                if(a2!=0){

                                         showtext[0]=a2 | 0x30;

                                         showtext[1]=a1 | 0x30;

                                            showtext[2]=0x20;

                                         showtext[3]=0x20;

                                         showtext[4]=0x20;

                                         }else{

                                         showtext[0]=a1 | 0x30;

                                                      showtext[1]=0x20;

                                            showtext[2]=0x20;

                                         showtext[3]=0x20;

                                         showtext[4]=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编辑过

出0入0汤圆

发表于 2005-5-11 02:20:07 | 显示全部楼层
最近也在为这事烦恼,ANSI c中用法如下:

函数名: itoa

功 能: 把一整数转换为字符串

用 法: char *itoa(int value, char *string, int radix);



#include <stdlib.h>

//#include



int main(void)

{

int number = 345;

char string[25];



itoa(number, string, 10);

printf("integer = %d string = %s
", number, string);

return 0;

}



我试过,在windows下可以,ICC里面还是有错误。


-----此内容被yelhak于2005-05-11,02:21:58编辑过

出0入0汤圆

发表于 2005-8-10 13:01:11 | 显示全部楼层
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[25];  



itoa(string,number, 10);  

printf("integer = %d string = %s
", number, string);  

return 0;  

}

出0入0汤圆

发表于 2005-8-10 14:32:09 | 显示全部楼层
直接把数字加上48就成数字的ASCII码了!

出0入0汤圆

发表于 2005-8-12 23:28:38 | 显示全部楼层
可以用bcd与数字之间的转化函数,然后分别得到高低位数值,与38h相或即可得到asci码值。存在一个数组中即可。

我用ds1302和液晶1602做的时钟就是用这个方法!

出0入0汤圆

发表于 2005-8-18 14:56:58 | 显示全部楼层
ICCAVR的stdlib.h中是这样定义的:char *itoa(char *buf, int i, int base);



以下代码测试通过:



#include <stdlib.h>  

int main(void)   

{   

int number = 345;

char string[25];   

itoa(string,number,10);   

printf("integer = %d string = %s
", number, string);   

return 0;   

}   


-----此内容被IFine于2005-08-18,15:53:14编辑过

出0入0汤圆

发表于 2012-10-25 17:46:47 | 显示全部楼层
fsclub 发表于 2005-4-25 17:32
那就用查表:

const table[]="0123456789";

temp=2;                               //若要显示2,则把2赋给 ...

非常感谢你的提示,我新手正为这事发愁,看到你的帖子终于明白怎么弄了。谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-9 21:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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