您的位置:首页 > 其它

AVR单片机开发使用的自定义头文件

2012-10-26 08:49 519 查看
/************************************************************************
*
*   文件名:avr.h
*
*   文件描述:AVR开发自定义头文件
*
*   创建人: Crazy_huaer(Neo), 2010年5月6日
*
*   版本号:1.1
*
*   修改记录: 增加了对数码管的操作
*
************************************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
//Define Register Operate
#define clearPA0() (PORTA&=~(1<<PA0))
#define clearPA1() (PORTA&=~(1<<PA1))
#define clearPA2() (PORTA&=~(1<<PA2))
#define clearPA3() (PORTA&=~(1<<PA3))
#define clearPA4() (PORTA&=~(1<<PA4))
#define clearPA5() (PORTA&=~(1<<PA5))
#define clearPA6() (PORTA&=~(1<<PA6))
#define clearPA7() (PORTA&=~(1<<PA7))
#define clearPB0() (PORTB&=~(1<<PB0))
#define clearPB1() (PORTB&=~(1<<PB1))
#define clearPB2() (PORTB&=~(1<<PB2))
#define clearPB3() (PORTB&=~(1<<PB3))
#define clearPB4() (PORTB&=~(1<<PB4))
#define clearPB5() (PORTB&=~(1<<PB5))
#define clearPB6() (PORTB&=~(1<<PB6))
#define clearPB7() (PORTB&=~(1<<PB7))
#define clearPC0() (PORTC&=~(1<<PC0))
#define clearPC1() (PORTC&=~(1<<PC1))
#define clearPC2() (PORTC&=~(1<<PC2))
#define clearPC3() (PORTC&=~(1<<PC3))
#define clearPC4() (PORTC&=~(1<<PC4))
#define clearPC5() (PORTC&=~(1<<PC5))
#define clearPC6() (PORTC&=~(1<<PC6))
#define clearPC7() (PORTC&=~(1<<PC7))
#define clearPD0() (PORTD&=~(1<<PD0))
#define clearPD1() (PORTD&=~(1<<PD1))
#define clearPD2() (PORTD&=~(1<<PD2))
#define clearPD3() (PORTD&=~(1<<PD3))
#define clearPD4() (PORTD&=~(1<<PD4))
#define clearPD5() (PORTD&=~(1<<PD5))
#define clearPD6() (PORTD&=~(1<<PD6))
#define clearPD7() (PORTD&=~(1<<PD7))
#define setPA0() (PORTA|=(1<<PA0))
#define setPA1() (PORTA|=(1<<PA1))
#define setPA2() (PORTA|=(1<<PA2))
#define setPA3() (PORTA|=(1<<PA3))
#define setPA4() (PORTA|=(1<<PA4))
#define setPA5() (PORTA|=(1<<PA5))
#define setPA6() (PORTA|=(1<<PA6))
#define setPA7() (PORTA|=(1<<PA7))
#define setPB0() (PORTB|=(1<<PB0))
#define setPB1() (PORTB|=(1<<PB1))
#define setPB2() (PORTB|=(1<<PB2))
#define setPB3() (PORTB|=(1<<PB3))
#define setPB4() (PORTB|=(1<<PB4))
#define setPB5() (PORTB|=(1<<PB5))
#define setPB6() (PORTB|=(1<<PB6))
#define setPB7() (PORTB|=(1<<PB7))
#define setPC0() (PORTC|=(1<<PC0))
#define setPC1() (PORTC|=(1<<PC1))
#define setPC2() (PORTC|=(1<<PC2))
#define setPC3() (PORTC|=(1<<PC3))
#define setPC4() (PORTC|=(1<<PC4))
#define setPC5() (PORTC|=(1<<PC5))
#define setPC6() (PORTC|=(1<<PC6))
#define setPC7() (PORTC|=(1<<PC7))
#define setPD0() (PORTD|=(1<<PD0))
#define setPD1() (PORTD|=(1<<PD1))
#define setPD2() (PORTD|=(1<<PD2))
#define setPD3() (PORTD|=(1<<PD3))
#define setPD4() (PORTD|=(1<<PD4))
#define setPD5() (PORTD|=(1<<PD5))
#define setPD6() (PORTD|=(1<<PD6))
#define setPD7() (PORTD|=(1<<PD7))
#define opposePA0() (PORTA^=(1<<PA0))
#define opposePA1() (PORTA^=(1<<PA1))
#define opposePA2() (PORTA^=(1<<PA2))
#define opposePA3() (PORTA^=(1<<PA3))
#define opposePA4() (PORTA^=(1<<PA4))
#define opposePA5() (PORTA^=(1<<PA5))
#define opposePA6() (PORTA^=(1<<PA6))
#define opposePA7() (PORTA^=(1<<PA7))
#define opposePB0() (PORTB^=(1<<PB0))
#define opposePB1() (PORTB^=(1<<PB1))
#define opposePB2() (PORTB^=(1<<PB2))
#define opposePB3() (PORTB^=(1<<PB3))
#define opposePB4() (PORTB^=(1<<PB4))
#define opposePB5() (PORTB^=(1<<PB5))
#define opposePB6() (PORTB^=(1<<PB6))
#define opposePB7() (PORTB^=(1<<PB7))
#define opposePC0() (PORTC^=(1<<PC0))
#define opposePC1() (PORTC^=(1<<PC1))
#define opposePC2() (PORTC^=(1<<PC2))
#define opposePC3() (PORTC^=(1<<PC3))
#define opposePC4() (PORTC^=(1<<PC4))
#define opposePC5() (PORTC^=(1<<PC5))
#define opposePC6() (PORTC^=(1<<PC6))
#define opposePC7() (PORTC^=(1<<PC7))
#define opposePD0() (PORTD^=(1<<PD0))
#define opposePD1() (PORTD^=(1<<PD1))
#define opposePD2() (PORTD^=(1<<PD2))
#define opposePD3() (PORTD^=(1<<PD3))
#define opposePD4() (PORTD^=(1<<PD4))
#define opposePD5() (PORTD^=(1<<PD5))
#define opposePD6() (PORTD^=(1<<PD6))
#define opposePD7() (PORTD^=(1<<PD7))
#define clearDA0() (DDRA&=~(1<<PA0))
#define clearDA1() (DDRA&=~(1<<PA1))
#define clearDA2() (DDRA&=~(1<<PA2))
#define clearDA3() (DDRA&=~(1<<PA3))
#define clearDA4() (DDRA&=~(1<<PA4))
#define clearDA5() (DDRA&=~(1<<PA5))
#define clearDA6() (DDRA&=~(1<<PA6))
#define clearDA7() (DDRA&=~(1<<PA7))
#define clearDB0() (DDRB&=~(1<<PB0))
#define clearDB1() (DDRB&=~(1<<PB1))
#define clearDB2() (DDRB&=~(1<<PB2))
#define clearDB3() (DDRB&=~(1<<PB3))
#define clearDB4() (DDRB&=~(1<<PB4))
#define clearDB5() (DDRB&=~(1<<PB5))
#define clearDB6() (DDRB&=~(1<<PB6))
#define clearDB7() (DDRB&=~(1<<PB7))
#define clearDC0() (DDRC&=~(1<<PC0))
#define clearDC1() (DDRC&=~(1<<PC1))
#define clearDC2() (DDRC&=~(1<<PC2))
#define clearDC3() (DDRC&=~(1<<PC3))
#define clearDC4() (DDRC&=~(1<<PC4))
#define clearDC5() (DDRC&=~(1<<PC5))
#define clearDC6() (DDRC&=~(1<<PC6))
#define clearDC7() (DDRC&=~(1<<PC7))
#define clearDD0() (DDRD&=~(1<<PD0))
#define clearDD1() (DDRD&=~(1<<PD1))
#define clearDD2() (DDRD&=~(1<<PD2))
#define clearDD3() (DDRD&=~(1<<PD3))
#define clearDD4() (DDRD&=~(1<<PD4))
#define clearDD5() (DDRD&=~(1<<PD5))
#define clearDD6() (DDRD&=~(1<<PD6))
#define clearDD7() (DDRD&=~(1<<PD7))
#define setDA0() (DDRA|=(1<<PA0))
#define setDA1() (DDRA|=(1<<PA1))
#define setDA2() (DDRA|=(1<<PA2))
#define setDA3() (DDRA|=(1<<PA3))
#define setDA4() (DDRA|=(1<<PA4))
#define setDA5() (DDRA|=(1<<PA5))
#define setDA6() (DDRA|=(1<<PA6))
#define setDA7() (DDRA|=(1<<PA7))
#define setDB0() (DDRB|=(1<<PB0))
#define setDB1() (DDRB|=(1<<PB1))
#define setDB2() (DDRB|=(1<<PB2))
#define setDB3() (DDRB|=(1<<PB3))
#define setDB4() (DDRB|=(1<<PB4))
#define setDB5() (DDRB|=(1<<PB5))
#define setDB6() (DDRB|=(1<<PB6))
#define setDB7() (DDRB|=(1<<PB7))
#define setDC0() (DDRC|=(1<<PC0))
#define setDC1() (DDRC|=(1<<PC1))
#define setDC2() (DDRC|=(1<<PC2))
#define setDC3() (DDRC|=(1<<PC3))
#define setDC4() (DDRC|=(1<<PC4))
#define setDC5() (DDRC|=(1<<PC5))
#define setDC6() (DDRC|=(1<<PC6))
#define setDC7() (DDRC|=(1<<PC7))
#define setDD0() (DDRD|=(1<<PD0))
#define setDD1() (DDRD|=(1<<PD1))
#define setDD2() (DDRD|=(1<<PD2))
#define setDD3() (DDRD|=(1<<PD3))
#define setDD4() (DDRD|=(1<<PD4))
#define setDD5() (DDRD|=(1<<PD5))
#define setDD6() (DDRD|=(1<<PD6))
#define setDD7() (DDRD|=(1<<PD7))
#define getPA0() (PINA&(1<<PA0))
#define getPA1() (PINA&(1<<PA1))
#define getPA2() (PINA&(1<<PA2))
#define getPA3() (PINA&(1<<PA3))
#define getPA4() (PINA&(1<<PA4))
#define getPA5() (PINA&(1<<PA5))
#define getPA6() (PINA&(1<<PA6))
#define getPA7() (PINA&(1<<PA7))
#define getPB0() (PINB&(1<<PB0))
#define getPB1() (PINB&(1<<PB1))
#define getPB2() (PINB&(1<<PB2))
#define getPB3() (PINB&(1<<PB3))
#define getPB4() (PINB&(1<<PB4))
#define getPB5() (PINB&(1<<PB5))
#define getPB6() (PINB&(1<<PB6))
#define getPB7() (PINB&(1<<PB7))
#define getPC0() (PINC&(1<<PC0))
#define getPC1() (PINC&(1<<PC1))
#define getPC2() (PINC&(1<<PC2))
#define getPC3() (PINC&(1<<PC3))
#define getPC4() (PINC&(1<<PC4))
#define getPC5() (PINC&(1<<PC5))
#define getPC6() (PINC&(1<<PC6))
#define getPC7() (PINC&(1<<PC7))
#define getPD0() (PIND&(1<<PD0))
#define getPD1() (PIND&(1<<PD1))
#define getPD2() (PIND&(1<<PD2))
#define getPD3() (PIND&(1<<PD3))
#define getPD4() (PIND&(1<<PD4))
#define getPD5() (PIND&(1<<PD5))
#define getPD6() (PIND&(1<<PD6))
#define getPD7() (PIND&(1<<PD7))
#define setInterrupt()      (SREG|=0x80)
#define clearInterrupt()      (SREG&=~0x80)
//Define Type
#define uint unsigned int
#define uchar unsigned char
#define ufloat unsigned float
#define udouble unsigned double
/************************************************************************
*
*   文件名: delay.h
*
*   文件描述: 延时函数
*
*   创建人: Crazy_huaer(Neo), 2010年5月9日
*
*   版本号:1.0
*
*   修改记录: 无
*
************************************************************************/
/*******************************************
函数名称: delayus
功    能: 延时指定微秒(8M晶振)
参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值 : 无
/********************************************/
void delayus( uint us )
{
uint i;
us = us * 5 / 4;    //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<us;i++);
}
/*******************************************
函数名称: delayms
功    能: 延时指定毫秒(8M晶振)
参    数: MS--延时的毫秒数
返回值 : 无
/********************************************/
void delayms( uint MS )
{
uint i,j;
for( i=0;i<MS;i++)
for( j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}

/************************************************************************
*
*   文件名: key.h
*
*   文件描述: 延时函数
*
*   创建人: Crazy_huaer(Neo), 2010年5月9日
*
*   版本号:1.0
*
*   修改记录: 无
*
************************************************************************/
/*******************************************
函数名称: scan_key
功    能: 键盘扫描
参    数: 无
返回值 : 无
/********************************************/
//键盘扫描信号
uchar scan_signal[4] = { 0xfe , 0xfd , 0xfb , 0xf7 };
uchar scan_key(void)
{
uchar col_value,row_value,find = 0;
uchar i,j,in;
for( i = 0 ; i < 4 ; i++)
{
PORTB = scan_signal[i];
delayms(6);
delayus(500);
in = PINB;
in = (in >> 4) | 0xf0;

for( j = 0; j < 4 ;j++ )
{
if( scan_signal[j] == in)
{
find = 1;
col_value = i;
row_value = j;
}

}
}
return ( find == 1 ) ? ( 4 * col_value + row_value ) : 16;
}
/************************************************************************
*
*   文件名: beep.h
*
*   文件描述: 蜂鸣器宏定义
*
*   创建人: Crazy_huaer(Neo), 2010年5月9日
*
*   版本号:1.0
*
*   修改记录: 无
*
************************************************************************/
/******************蜂鸣器音乐常量******************/
#define BEEP     PA6
//      计时值=65536-8000000/8/2/频率
//      音名     计时值       频率Hz
#define DO_L     63627       //262
#define DOA_L    63731       //277
#define RE_L     63835       //294
#define REA_L    63928       //311
#define MI_L     64021       //330
#define FA_L     64103       //349
#define FAA_L    64185       //370
#define SO_L     64270       //392
#define SOA_L    64331       //415
#define LA_L     64400       //440
#define LAA_L    64463       //466
#define TI_L     64524       //494
#define DO       64580       //523
#define DOA      64633       //554
#define RE       64684       //587
#define REA      64732       //622
#define MI       64777       //659
#define FA       64820       //698
#define FAA      64860       //740
#define SO       64898       //784
#define SOA      64934       //831
#define LA       64968       //880
#define LAA      65000       //932
#define TI       65030       //988
#define DO_H     65058       //1046
#define DOA_H    65085       //1109
#define RE_H     65110       //1175
#define REA_H    65134       //1245
#define MI_H     65157       //1318
#define FA_H     65178       //1397
#define FAA_H    65198       //1480
#define SO_H     65217       //1568
#define SOA_H    65235       //1661
#define LA_H     65252       //1760
#define LAA_H    65268       //1865
#define TI_H     65283       //1976
#define ZERO     0           //休止符
//十进制:     0
//休止符:     0

//十进制:     1     2     3     4     5     6     7     8     9     10    11     12
//低音 :     1     #1    2     #2    3     4     #4    5     #5    6     #6     7

//十进制:     13    14    15    16    17    18    19    20    21    22    23     24
// 中音 :     1     #1    2     #2    3     4     #4    5     #5    6     #6     7
//十进制:     25    26    27    28    29    30    31    32    33    34    35     36
// 高音 :     1     #1    2     #2    3     4     #4    5     #5    6     #6     7
/************************************************************************
*
*   文件名: int.h
*
*   文件描述:中断处理
*
*   创建人: Crazy_huaer(Neo), 2010年5月9日
*
*   版本号:1.0
*
*   修改记录: 无
*
************************************************************************/
/*============================================================
*
* 函 数 名: INTERRUPT_init
*
* 参 数:
*
*        int flag;用于标识开启的中断量
int clock;用于标识中断是上升沿还是下降沿
*
* 功能描述:
*
*       中断初始化
*
* 返 回 值:空
*
* 抛出异常:
*
* 作 者:Crazyhuaer(Neo) 2010/5/9
*
============================================================*/
#define UP 0
#define DOWN 1
void INTERRUPT_init(int flag,int clock)
{
switch(flag)
{
case 0: //开启中断0
if(clock == UP)
{
MCUCR |= (1 << ISC00) | (1 << ISC01);
GICR |= (1 << INT0);
}
else
{
MCUCR |= (1 << ISC01);
GICR |= (1 << INT0);
}
setPD2();
break;
case 1: //开启中断1
if(clock == UP)
{
MCUCR |= (1 << ISC11) | (1 << ISC10);
GICR |= (1 << INT1);
}
else
{
MCUCR |= (1 << ISC11);
GICR |= (1 << INT1);
}
setPD3();
break;
case 2: //开启中断2
GICR |= (1 << INT2);
if(clock == UP)
{
MCUCSR |= (1 << ISC2);
}
setPB2();
break;
default:
MCUCR |= (1 << ISC11) | (1 << ISC10)
| (1 << ISC01) | (1 << ISC00);
GICR |= (1 << INT2) | (1 << INT1) | (1 << INT0);
setPD2();
setPD3();
setPB2();
break;
}
}
/************************************************************************
*
*   文件名: ioinit.h
*
*   文件描述:串口的使用
*
*   创建人: Crazy_huaer(Neo), 2010年5月9日
*
*   版本号:1.0
*
*   修改记录: 无
*
************************************************************************/
void ioinit()
{
DDRA = 0xff;
DDRB = 0xff;
DDRC = 0xff;

PORTA = 0x00;
PORTB = 0xff;
PORTC = 0xff;
}
/************************************************************************
*
*   文件名:usart.h
*
*   文件描述:串口的使用
*
*   创建人: Crazy_huaer(Neo), 2010年5月9日
*
*   版本号:1.0
*
*   修改记录: 无
*
************************************************************************/
/***********************************************/
// UART
// CPU Frequence and Baud 单片机频率和波特率
#define FRE_CPU 8000000
#define BAUD 9600
//数据接收变量
volatile char recieve_data=0;
/*============================================================
*
* 函 数 名:usart_init
*
* 参 数:
*
*        void
*
* 功能描述:
*
*       USART初始化
*
* 返 回 值:空
*
* 抛出异常:
*
* 作 者:Crazyhuaer(Neo) 2010/5/9
*
============================================================*/
void usart_init(void)
{
// Data write register and Date read register----UBRRH and UBRRL
UCSRA = 0x00;
UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据位+1位停止位
UBRRH = (FRE_CPU/BAUD/16-1)/256;
UBRRL = (FRE_CPU/BAUD/16-1)%256;
UCSRB |= (1 << RXCIE) | (1 << RXEN) | ( 1 << TXEN); //允许发送和接收,接收中断使能
}
/*============================================================
*
* 函 数 名: uart_charsend
*
* 参 数:
*
*        char data :发送的字符
*
* 功能描述:
*
*       USART字符发送函数
*
* 返 回 值: 空
*
* 抛出异常:
*
* 作 者:Crazyhuaer(Neo) 2010/5/9
*
============================================================*/
void uart_charsend( char data )
{
/* Is not completly? */
// Use Query approach send and Interrupt approach recieve
// UCSRA ...UDRE(BIT)
while ( !( UCSRA &( 1<<UDRE)) );
/* send data */
UDR = data;
}
/*============================================================
*
* 函 数 名: uart_charsend_str
*
* 参 数:
*
*        char *str :发送的字符串
*
* 功能描述:
*
*       USART字符发送串函数
*
* 返 回 值: 空
*
* 抛出异常:
*
* 作 者:Crazyhuaer(Neo) 2010/5/9
*
============================================================*/
void uart_charsend_str(char *str)
{
while(*str != '\0')
{
uart_charsend(*str);
str++;
}
uart_charsend(0x0a); //结尾时回车
uart_charsend(0x0d);
}
/******************************************************************/
/************************************************************************
*
*   文件名: board.h
*
*   文件描述: 开发板初始化
*
*   创建人: Crazy_huaer(Neo), 2010年5月9日
*
*   版本号:1.0
*
*   修改记录: 无
*
************************************************************************/
/*******************************************
函数名称: Board_init
功    能: 初始化实验板,关闭全部功能
参    数: 无
返回值 : 无
/********************************************/
void Board_init(void)
{
DDRA=0xFF; //将四个IO口全部配置为输出
DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
SPCR=0x00; //还原SPI口,使其为正常端口
setPA6();//(BEEP)关闭蜂鸣器
clearPC6();   //(RELAY)初始化继电器为常闭连接状态
clearPA1(); //关闭SPI总线DA
PORTB=0xFF; //关闭LED
setPA2(); //锁存数据,使LED熄灭
delayus(5);
clearPA2();

PORTB=0x00;    //输出段选
setPA3();
delayus(50);
clearPA3();

PORTB=0xFF;    //输出位选
setPA4();
delayus(50);
clearPA4();

PORTD=0xFF;
setPA7();
delayus(50);
clearPA7();
}
/************************************************************************
*
*   文件名: seg.h
*
*   文件描述: 数码管操作
*
*   创建人: Crazy_huaer(Neo), 2010年5月9日
*
*   版本号:1.0
*
*   修改记录: 无
*
************************************************************************/
//数字代码宏定义
#define NUM_0 0x3F
#define NUM_1 0x06
#define NUM_2 0x5B
#define NUM_3 0x4F
#define NUM_4 0x66
#define NUM_5 0x6D
#define NUM_6 0x7D
#define NUM_7 0x07
#define NUM_8 0x7F
#define NUM_9 0x6F
#define NUM_A 0x77
#define NUM_B 0x7C
#define NUM_C 0x39
#define NUM_D 0x5E
#define NUM_E 0x79
#define NUM_F 0x71
char display_seg(char num)
{
switch(num)
{
case 0:
return NUM_0;
break;
case 1:
return NUM_1;
break;
case 2:
return NUM_2;
break;
case 3:
return NUM_3;
break;
case 4:
return NUM_4;
break;
case 5:
return NUM_5;
break;
case 6:
return NUM_6;
break;
case 7:
return NUM_7;
break;
case 8:
return NUM_8;
break;
case 9:
return NUM_9;
break;
case 10:
return NUM_A;
break;
case 11:
return NUM_B;
break;
case 12:
return NUM_C;
break;
case 13:
return NUM_D;
break;
case 14:
return NUM_E;
break;
case 15:
return NUM_F;
break;
default:
return 0x00;
break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: