ICCAVR
#pragma interrupt_handler
如果想要多个中断入口使用同一个中断服务程序,只要用不同的向量号多次声明就可以了,例如,计划定时器1和0溢出共用time_ovf中断函数,可以定义如下:
#pragma interrupt_handler time_ovf:7 time_ovf:8
CodeVisionAVR
中断的用法:
interrupt[interrupt_vetor_number] function_name
如:
interrupt [TIM1_OVF] void timer1_overflow(void)
2. 头文件
ICCAVR
在macros.h中,定义了一个“#define BIT(x) (1<<(x))”的宏,用该宏来操作位变量,编译后生成的代码质量更高。如下例:
#define PORTA0 0
#define PORTA1 1
#define PORTA2 2
#define PORTA3 3
#define PORTA4 4
#define PORTA5 5
#define PORTA6 6
#define PORTA7 7
在使用时,应该在文件头加入“#include
PORTA&=~BIT(PORTA7)
要装饰PORTA7置位,可以使用如下语句:
PORTA|=BIT(PORTA7)
3. 对寄存器变量的访问
CodeVisionAVR
定义了新的数据类型“sfrb”和“sfrw”,使C语言可以直接访问MCU的有关寄存器。如:
sfrb DDRD=x011
ICCAVR
没有定义类似的数据类型,而是采用强制类型转换和指针的概念来实现访问MCU的寄存器,如:
#define DDRD (*(volatile unsigned char *)0x31) //加上了0x20
则在ICCAVR中访问:
DDRD=0xff;
4. 使用AVR片内不同的存储空间
由于AVR单片机内部有三种类型的存储空间(ARM、EEPROM和FLASH),CodeVisionAVR和ICCAVR均对语法进行的扩充。
对字符串的处理两者相同,即对于用户没有指定只能保存在Flash中的字符串,在启动时将字符从程序存储区复制到数据存储区。
ICCAVR
对const类型进行的扩充,编译器会自将const类型数据分配进FLASH存储中,对片内EEPROM存贮器的访问,ICCAVR只能通过调用头文件eeprom.h中的函数EEPROM进行。ICCAVR不支持将全局变量或局部变量分配至EEPROM,通常只将常量分配至有EEPROM中,一般定义如下:
#program data:eeprom/flash
const unsigned char table[]={0x3f,0x06...,};
#program data:data
CodeVisionAVR
扩充了flash和eeprom两个关键词,使用flash将const定义的常量分配进Flash存器,以节省RAM的使用。而eeprom关键词限定的变量则被分配进片内EEPROM中,在C语言中访问EEPROM中变量的方法与访问RAM中变量的方法完全相同,包括指针形式的访问。
注意:在CVAVR中,有两种存储模式“TINY”和“SMALL”,其中“TINY”模式使用1个字节(8位)的指针,因此只能访问不大于256字节的存储空间;“SMALL”模式使用2个字节的指针,可以访问不大于64K字节的存储空间。当使用外部数据存储器时,必须使用“SMALL”,如果没有使用外部数据存储器,应优先使用“TINY”模式。
CVAVR指向字符串的指针数组至多只支持8个元素,注意,是指向字符串的指针数组,普通数组则没有这个限制。
如:
char flash *string[8]={"a","b","c","d","e","f","g","h"};
5. 位变量
CodeVisionAVR
可以直接定义位变量
bit on_off=1;
ICCAVR
在ICCAVR 6.26C中,不能直接定义位变量,但是可以使用C语言中的结构体定义位变量,如下例:
struct data //存放于SRAM中
{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
}
上例中,成员列表的位域的类型必须用unsigned或signed定义关键字。a、b均占用一个字节的存储空间。定义之后就可以直接使用位变量了,如:
a.bit1=0;
a.bit7=1;
if(a.bit5==1)
上一篇:基于AVR单片机的SPI接口的25C256
下一篇:AVR USART串口程序
推荐阅读最新更新时间:2024-03-16 15:16