- 打卡等级:以坛为家III
- 打卡总天数:666
- 最近打卡:2025-11-09 08:24:34
荣誉版主
- 积分
- 4521
|
楼上这位朋友你好!
看了上面实验的源代码和你提出的问题, 有几点交流供参考...
1, 数组的长度在数组的定义时已经明确了, 也可以根据数据类型计算出长度是多少字节的.
例如,你定义了数组:
unsigned cancode[4][6]={ ...... };
这里有一点小问题, 就是没有说明数据类型, 编译器默认它是无符号整型数了,严谨一点应该要说明:
unsigned int cancode[4][6]={ ...... };
这是可以用sizeof(cancode)函数来计算出它的长度的, 应该是4*6*2=48字节.(每一个数据占两字节,一共24个数据)
2,注意和理解 LCD_A24()和LCD_H24()这两个函数的区别:
这两个函数是自创编写的,有不同的含义和用法,以适应不同的需要.
LCD_A24()是显示纯西文字符串的函数, 入口参数中有指定长度(可强制指定长度),
LCD_H24()是显示中西文混合字符串的函数, 入口参数中无指定长度, 内部有strlen()计算长度函数自动计算.所以不需要指定显示长度.
为什么 LCD_A24((i-2)*60,80,buffer,15,1,12);会出错呢?
因为你指定它显示长度是12, 其实前面有一句:
sprintf(buffer,"0x%02x",cancode[0]);
这就说明buffer这字符串长度是4, 你却让它强制显示12字节,它就只好显示乱码点阵了.
为什么你说用LCD_H24((i-2)*60,102,buffer,15,1); 就显示是正确的呢?
(在标准C语言中,字符串是以0x00结尾的,虽然有时与字符数组可转换通用,但还是要注意有所区别.)
因为buffer这字符串是以0x00结束的,进入LCD_H24()以后, 有strlen()函数自动计算长度,所以显示正确.
3, 写这样的语句 LCD_A24((i-2)*60,80,buffer,15,1,12);还是有一点点小问题的.
那个x坐标参数(i-2)有可能出现负值,这是要尽量避免的,
尽管你在程序中用if(i<1)和(i>1)分开处理,用以避免出现负值, 但如果当i==1时呢,就啥也不执行了吗?
4, 上面实验程序, 如果目的是为了用16进制格式显示所定义的数组的话,那么是可以稍稍修改一下的,
这段显示程序代码可以放在while(1)之前, 不必要反复循环不断地显示.
我试着来编写一下(没上机仿真运行),供你参考, 可试试看...
前面增加两个全局变量: (便于跟踪观察)
unsigned int Row,Col; //行列计数器
在main函数中...
...
LCD_Init();
LCD_CLS(1); //蓝色清屏
for(Row=0;Row<4;Row++) //循环显示4行
{ for(Col=0;Col<6;Col++) //循环显示6列
{ sprintf(buffer,"0x%02X",cancode[Row][Col]); //格式化显示数据
LCD_H16(Col*50,Row*24,buffer,15,1); //每列间隔50像素,每行间隔24像素(限于屏幕像素改用LCD_H16,原理相同)
}
}
while(1)
{ }
5, 关于数组的定义
源程序是这样的:
unsigned cancode[4][6]=
{
{0x5f0,4,0xe4,0xff,0x00,0x00},
{0x5f0,4,0x00,0x00,0x00,0x00},
{0x3c0,4,0xa0,0xa0,0x03,0x00},
{0x3c0,4,0x00,0x00,0x00,0x00},
};
虽然没有什么错误,但给人感觉是概念有点模糊了.
一般而言,一个数组中的每个成员,数据类型应该是相同的. (并不是结构定义)
在定义数组的同时赋值也是可以的, 如果前面不说明类型,编译器只好根据具体数据来默认了.
因为cancode[0][0]=0x5F0, 这个数据超出了1字节的范围(0--255)了,因此编译器默认所有数据都是两字节无符号整型数,其取值范围是0...65535. sizeof(cancode[0][0])应该是2. 因此后面的4, 实际是0x0004, 占两字节空间. 0xe4实际是0x00E4,都是占两字节空间的....
整个数组占用48字节空间.
然而,在后面的语句中,有sprintf(buffer,"0x%02x",cancode[0]);
这又表明是单字节显示,又让人感觉前面的定义有点浪费空间了.
虽然0x5F0按单字节也能显示,这是sprintf()函数能容忍,但是突破了格式,且前导零也没有了.
如果cancode(顾名思义是CAN指令串)数组有其特定用途, 那么是可以这样定义的:
unsigned char cancode[4][7]=
{
{ 0x05,0xF0,0x04,0xE4,0xFF,0x00,0x00 },
{ 0x05,0xF0,0x04,0x00,0x00,0x00,0x00 },
{ 0x03,0xC0,0x04,0xA0,0xA0,0x03,0x00 },
{ 0x03,0xC0,0x04,0x00,0x00,0x00,0x00 },
};
这样整个数组只占28字节空间. (个人习惯,除0x中的x是小写外,后面都是用大写)
|
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+1
给力啊!
|