在串口章节和液晶屏章节的部分代码中总是看到“ *str!='\0' ”和“ *str++ ”却一时难以理解意思,本节我们将简要讲解这两部分代码的含义,但前提需要大家有对指针方面的知识基础,建议先了解《手把手教你学51单片机》文档12.1节知识内容先。
1.代码解析
我们先定义一个数组“u8 LEDSET[4]={0x7E,0xBD,0xDB,0xE7};”
假设这四个元素的内存排布如下,5,6,7,8代表的是指向元素的指针。
每个数组初始化之后都会在最后那个元素内存的下一个内存分配有一个结束符的数据,“‘\0’”的ASCII码值就是0。
接着我们先把下面代码下载进开发板中观察现象
#include <reg52.h>
#include <function.h>//详见第六章第8讲
void LED_task(u8 *str)
{
while (*str != '\0' )
{
P0=*str++;
delay_ms(1000);
}
}
void main()
{
u8 LEDSET[4]={0x7E,0xBD,0xDB,0xE7};
LED_Init();
LED_task(LEDSET);
while (1);
}
|
主函数里我们只需关注“LED_task(LEDSET);”,传入的参数是指针类型,LEDSET就是指向数组第一个元素的指针,也就是指向的是0x7E,指针是5。
在“while(*str != '\0')”里,由于传入的指针里面的值不是结束符,所以可以进入循环体,此时执行“P0=*str++;”。
“*str++;”的意思是,先把0x7E这个值赋给P0先,然后指针加1,此时的指针就是6了。
那么就有“P0=0x7E;”延时一秒之后,重新判断“while(*str != '\0')”,显然指针为6的内存里也不是结束符,而是0xBD,所以执行“P0=0xBD;”延时一秒。
后面再执行两次赋值给P0为0xDB,0xE7之后,由于此时指针加1之后指向了0x00,也就是结束符,不满足了“while(*str
!= '\0')”,该函数就执行完了。于是就到执行主函数里的“while(1);”,后面我们看到开发板的实验现象就是中间两盏灯一直保持常亮,因为已经执行完“LED_task(LEDSET);”了。
|