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; } }
相关文章推荐
- 开发和使用自定义服务器控件
- 开发和使用自定义服务器控件
- 安卓开发之使用PathMeasure自定义加载动画控件
- 安卓开发之ViewDragHelper的使用及自定义可下拉展示内容的ViewGroup
- Arduino单片机使用和开发问题记录
- iOS 开发导航栏使用系统自定义属性基本4条
- SharePoint开发学习笔记4——使用aspx自定义表单的工作流(1)
- IOS开发 使用XIB自定义一个UIView
- 基于地图开发控件GMap.Net 使用 (五) 原创 用户自定义标签图片
- iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程
- 传智播客java web 学习,自定义标签的开发和使用
- 开发和使用自定义服务器控件
- Android 开发中使用的颜色可以分为两种,自定义颜色和系统颜色
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- 安卓开发:弹出自定义对话框自动播放视频(仿视频广告效果,使用mediaplayer和surfaceview做播放器)
- 自定义Flex4+的Spark组件part1:使用ActionScript3开发Spark组件Component类
- 使用eclipse与android studio 在开发自定义控件时的区别
- [Phonegap+Sencha Touch] 移动开发7、Sencha Touch图标的使用与自定义
- ios开发 使用纯代码自定义UItableviewcell
- SPARK排序算法,使用Scala开发 二次排序 自定义KEY值,相比JAVA的罗嗦,Scala优雅简洁!!!