
51单片机Proteus仿真12864中的这个指针是什么意思?
void hanzi(uchar ye,uchar lie,uchar *daima)
{ uchar i,j; for(i=0;i<2;i++)
{ write_com(0xb8+ye+i);
write_com(0x40+lie);
for(j=0;j<16;j++)
{ write_data(daima[i*16+j]); //写数据(汉字) }
} } 展开
51单片机Proteus仿真12864中的这个指针是什么意思?
就是下面*daima指针,为啥在write_data里面这样写?
void hanzi(uchar ye,uchar lie,uchar *daima)
{
uchar i,j;
for(i=0;i<2;i++)
{
write_com(0xb8+ye+i);
write_com(0x40+lie);
for(j=0;j<16;j++)
{
write_data(daima[i*16+j]); //写数据(汉字)
}
}
}
下面逐句分析,重点在指针那一句,请你参考:
void hanzi(uchar ye, uchar lie, uchar *daima)
//三个参数:参数 ye 和参数 lie 指明要写的汉字在屏幕上的起始位置,即,在屏幕上的哪一页的哪一列开始写;//参数 daima 是一个指针,指向该汉字的字模所在区域的首地址
uchar i, j;
//两个临时变量,服务于字模的写入
for(i=0;i<2;i++)
//外层 for 负责两页的内容切换: i = 0 写第一页(汉字的上半截);i = 1 写第二页(汉字的下半截)
write_com(0xb8+ye+i); write_com(0x40+lie);
//这两句,定位汉字在 12864 上地起始位置
for(j=0;j<16;j++)
//内层 for 循环,具体负责写入每一页上的 16 个字节的字模数据
write_data(daima[i*16+j]); //写数据(汉字)
//这一句是重点,先说明一下 write_data 函数每次只能写入一个字节的字模,所以内层 for 循环要循环16次,
//指针 daima 的内容是该汉字 32 个字节字模中,第一个字节的存储地址:
//写第一页时 i = 0 ,内循环变量 j 取值 0~15 ,所以内循环每次写入的字模分别
//是 daima[0], daima[1], daima[2], daima[3],~~~~ daima[15],即前16个字节的字模,第一页写完。
//写第二页是 i = 1,内循环变量 j 取值 0~15,这次内循环每次写入的字模分别
//是 daima[16+0], daima[16+1], daima[16+2], daima[16+3],~~~~ daima[16+15],后16个字节的字模,
//第二页写完。
相关的C语法:指针可以以数组的形式使用,以 daima 为例:daima 本身指向第一个字节,daima[x]中的 x 是相对于daima 所指地址的偏移量,即,以 daima 所指的地址向后偏移 x 个单元取数。