ASCII是一个指向二维数组的指针常量。声明uchar (ip2)[2]数组指针(看过有些书称之为行指针),ip2=ASCII;这样就可以通过编译并引用ASCII数组了。
二维数组在函数调用时可以做实参进行参数传递。
被调函数可以这样声明 void exmpl_fun(uchar (pAryASCII)[2]);;
也可以这样void exmpl_fun(uchar pAryASCII[][2]);。
如果是C语言的,有限关键字会有改变,头文件要重新写,函数的一些写法会有所改变,AVR的编译器很多,每种编译器都有自己的独特写法,要先了解编译器后在做移植,成功率会更高。 另外,先要选择好编译器,C编译器如GCC,ICC,CVAVR,IAR等,看自己选哪种编译器,汇编编译器如AVR Studio。
头文件不需要自己写,每种编译器有自带的头文件,只要#include就可以了,不过要include对。
二、51单片机(包括STC的)程序移植到AVR平台上需要注意事项
1) 头文件, 寄存器名,寄存器设置代码都是要相应修改的。
2) IO端口的位 *** 作要做相应的调整。
3) 中断服务函数的格式也有不同,需做相应调整 。
4) 51单片机的端口寄存器复位值为1,因此作为输出端口时,即使程序中不作设置,也会输出高电平, 而AVR单片机中端口寄存 器PORTX 复位值为0, 因此51单片机的程序移植到avr单片机中时一定要注意端口初始化代码, 假设51程序中没有进行初始化,那么端口默认为高, 到了avr中,如果照搬原来的程序,端口就变成低电平,可能导致系统不能正常运行,而且不好查出来问题
5) 由于两者对于长字节数据存放的方式不同,从地址到高地址, 51平台上依次存放高字节和低字节, AVR上依次存低字节和高字节, 所以如果程序中涉及到采用联合体或是依次访问内存地址的方法对长字节数据进行分离的话,就要注意低地址里读取的是高字节还是低字节了。比如: union UNI_2BYTE {uint dat; uchar tab[2]; }wdat;
在这个联合体wdat中, 成员dat是个占2个字节长度的整形数, 那么wdattab[0]表示dat的低地址的那一个字节,如果是在keil c中, 由于规定低地址存放高字节, 那么wdattab[0]就是dat的高字节; 如果是在IARAVR或者ICCAVR中,由于低地址存放低字节, 那么wdattab[0]就是dat的低字节。
一个大一些的project一般要包含好多个file,编写的时候原则上是一个c类型文件对应一个h类型文件,比如如有delayc文件一般都会有一个delayh文件与之对应,首先要说的是delayh里面不能写真实的函数,它只是用来声明变量和提供外部接口用的。而真正的void delay(uint i){}应该出现在delayc文件里面,然后在delayh文件对它进行一下声明,然后你在包含main函数的file里面#include“delayh”,还要把”delayc“添加到工程里。完成后你就能在main函数里面调用了。如果想在别的file里调用直接#include“delayh”即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)