指针是C语言的精髓,在C51中合理使用指针能极大提高编程效率和执行效率。但是一定要注意,因常规的C51编程没有操作系统加持,指针管理一定要极其严格,否者一旦内存泄漏,设备便不能工作了。
一、指针的简单使用
可以如同PC端的C语言一样使用指针,做一个简单实验。
实验一:指针方式实现流水灯
电路图如下图:
这里是使用一块开发板完成。
做一个流水灯,效果为从两端向中间一次点亮,在从两端向中间依次灭灯。
程序代码如下:
/* test1.c */
#include <reg52.h>
void delay_1ms(unsigned int ms)
{
unsigned int i,j;
for(i = 0;i < ms; i++)
for(j = 0; j < 120; j++);
}
unsigned char code table[8] = {0xff, 0x7e, 0x3c, 0x18, 0x00, 0x81, 0xc3, 0xe7};
void main(void)
{
unsigned char i;
P2 = 0xff;
while(1) {
for(i = 0; i < 8; i++) {
P2 = *(table + i);
delay_1ms(500);
}
}
}
我们可以看到,这里就是使用指针方式来对P3口赋值的,这种方式可用,效果如下。
流水灯
你可以自己试验,在ANSI-C中可以使用常规指针方式在这里都可以使用。
二、指针的使用(技巧高级一点)
我们用一种比较高级的方法,实现LED灯跳动。
实验二:LED跳动
8个LED灯,使用一个随机数,如果为奇偶数不同时,间隔点亮4个不同的LED管。代码如下:
/* test2.c */
#include <reg52.h>
// 引入头文件,使用伪随机函数rand()
#include <stdlib.h>
// 用一个结构体定义LED管的动作,使用函数指针
typedef struct LED LED;
struct LED {
void (*run)(struct LED *);
};
//延时函数
void delay_1ms(unsigned int ms)
{
unsigned int i,j;
for(i = 0;i < ms; i++)
for(j = 0; j < 120; j++);
}
// 判断奇偶性
unsigned char is_odd(unsigned char num)
{
return num % 2;
}
// LED管运行函数
static void run(struct LED * w)
{
unsigned char i;
while(1) {
i = (unsigned char)(rand() / 255);
if(is_odd(i)){
P2 = 0x55;
} else {
P2 = 0xaa;
}
delay_1ms(100);
}
}
// 申请一块内存池
char xdata mem_pool[64];
void main(void)
{
LED * led;
// 清理内存池
init_mempool(mem_pool, sizeof(mem_pool));
// 构建LED类,以获得动作
led = (LED *)malloc(sizeof(LED));
// LED动作的函数映射
led->run = run;
// LED进行动作
led->run(led);
}
效果如下:
C51指针
三、结论
这里展示怎样使用指针完成函数映射,使用malloc函数,内存池申请等,注意申请内存池时分配空间的大小,如果过大,程序不会报错,但是无法运行。