51单片机1602 这两个函数看不懂!问题在具体看不懂的那行注释里面!

/*------------------------------------------------
写入字符串的函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0) //这个是看是否在第一行显示吗?
{
LCD_Write_Com(0x80 + x); /*这个里面用一个十六进制的整数和字符变量相加干什么?*/
}
else
{
LCD_Write_Com(0xC0 + x);//问题同上一个
}
while (*s) // 这个指针怎么能用作真值条件?它不是一个内存地址吗?不是永远为真?
{
LCD_Write_Data( *s); //完全不知用意
s ++; //完全不知用意
}
}
/*------------------------------------------------
写入字符的函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data); //为什么这里没有用指针而直接用了变量本身?
}

我好像是一年之前看了下1602模块,其实你该多看看模块使用手册啊,应该有讲解的,前面if、else里面的问题该去查模块使用手册,0x80/0xC0这两个值应该是相应的控制字,用于确定显示字符的位置,那么我先给你说说后面的问题:
1.while(*s)
看清楚,*s代表的意思是取指针s所指向地址的值,那么,你传进来的是个字符串对吧?字符串的最后一个结束符是0知道吧?while循环到字符串最后一个结束符是*S值为0就跳出循环知道吧?

2.LCD_Write_Data( *s)
不知道指针怎么用吗?将指针所指向的字符打印到1602上,这很难理解么?

3.s ++;
还是那句话,不知道指针怎么用么?指针S指向下一个需要打印的字符,很难理解么?

4.LCD_Write_Data( Data);
你就是光看函数名字void LCD_Write_Char也知道这是用于单个字符打印的函数吧?那么本来它只打印单个字符到1602上,为什么需要用指针?

如果你还是大一大二的学生,刚接触编程,以上问题不清楚还情有可原,好好学,不懂就问就对了,若是已经毕业参加工作了,那还是换个职业吧。

如果你还是学生,if-else里面的问题还是没找到答案,那么再回复,我去看看资料给你答案追问

谢谢,前面两个回答已经搞定了。

我刚接触单片机,这是第二天。我觉得单片机总体上挺简单的,但是要想积累经验真不容易。想跨进这行的门槛太难,我准备去广东深圳的电子小作坊试试看。

追答

嗯, 这东西急不来, 得慢慢来。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-01-24
LCD_Write_Com(0x80 + x);/*这个里面用一个十六进制的整数和字符变量相加干什么?*/
LCD_Write_Com(0xC0 + x);//问题同上一个
80、C0,用来区分液晶屏上面的“行”,x是“列”。
具体解释,楼主应该去看LCD1602的说明书。
====
while (*s) // 这个指针怎么能用作真值条件?它不是一个内存地址吗?不是永远为真?
{ --没有到字符串的末尾,就循环
LCD_Write_Data(*s); //完全不知用意 --写入一个字符
s++; //完全不知用意  --指针加一
====
LCD_Write_Data( Data); //为什么这里没有用指针而直接用了变量本身?
--本函数就是写入一个字符的,用指针就多余了。追问

谢谢你!但是关于*s,你说“没有到字符串的末尾,就循环”,那按你的经验,通常搞开发的人都怎么让指针一直加一直加,加到字符数组末尾是恰好值为零?难道是定义一个长度为9的字符数组,但是只赋前8个值,这样最后一个为零?

菜鸟,请多多包涵指教!

追答

C语言的字符串,末尾就是一个0,建议去看看C语言的书,这真是太基本的知识了。
参考一下:
http://zhidao.baidu.com/question/361358783.html

追问

谢谢,百度过了,已经搞明白末尾是0这个问题了。

本回答被网友采纳
第2个回答  2012-01-24
0x80和0xC0是1602的行列的起始地址,说明书里有;下面的问题我要看看 LCD_Write_Data()函数才知道·怎么回答。追问

void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //æÔòµÈ´ý
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

也没啥,就是盘忙,然后把数据给P0口并保持一个空操作的时间。 DataPort之前被定义成了P1口。

追答

*s是字符串的首地址

相似回答