📄 init.h
字号:
函数:void LED_Wait(void)
返回值:无
备注:
******************************************************************************/
void LED_Wait(void)
{
LED2;LED00;
// LED_Run();
}
/******************************************************************************
功能:LED灯闪动
函数:void LED_Wait_ISP(void)
void LED_Texting_ISP(void)
返回值:无
备注:
******************************************************************************/
void LED_Wait_ISP(void)
{
Red_LedON; delay_nms(200); Red_LedOFF; delay_nms(200);
Green_LedON; delay_nms(200); Green_LedOFF; delay_nms(200);
Red_LedON; delay_nms(200); Red_LedOFF; delay_nms(200);
Green_LedON; delay_nms(200); Green_LedOFF; delay_nms(200);
Red_LedON; delay_nms(200); Red_LedOFF; delay_nms(200);
Green_LedON; delay_nms(200); Red_LedOFF; delay_nms(200);
// LED_Run();
}
void LED_Texting_ISP(void)
{
Green_LedON;//delay_nms(100); Green_LedOFF;
Red_LedON; delay_nms(200); Red_LedOFF; delay_nms(200);
Red_LedON; delay_nms(200); Red_LedOFF; delay_nms(200);
Red_LedON; delay_nms(200); Red_LedOFF; delay_nms(200);
}
/******************************************************************************
功能:LED灯跑马观花
函数:void LED_Run(void)
返回值:无
备注:
******************************************************************************/
void LED_Run(void)
{
uint i;
for (i=5;i>0;i--){LED1;LED12;LED23;LED34;LED41;}
for (i=5;i>0;i--){LED1;LED14;LED43;LED32;LED21;}
for (i=4;i>0;i--){LED1;LED14;LED2;LED23;LED3;LED32;LED4;LED41;}
for (i=4;i>0;i--){LED1;LED13;LED2;LED24;LED3;LED31;LED4;LED42;}
for (i=3;i>0;i--){LED1;LED12;LED2;LED21;LED2;LED23;LED3;LED32;LED3;LED34;LED4;LED43;LED4;LED41;LED1;LED14}
for (i=3;i>0;i--){LED1;LED14;LED4;LED41;LED4;LED43;LED3;LED34;LED3;LED32;LED2;LED23;LED2;LED21;LED1;LED12}
}
/******************************************************************************
功能:设置波特以及串口中断相关函数
函数:void USART_InitM1681( unsigned int baud )
void USART_InitM1682( unsigned int baud )
#pragma interrupt_handler uart0_rx_isr_m16:12
#pragma interrupt_handler uart0_tx_isr_m16:14
返回值:无
备注:Fosc 晶振 如:4000000 4MHz
baud 传输速度 19200
1681意思是8位 1停止位
1682意思是8位 2停止位
#define F_CPU 3686400
#define F_CPU 4000000
//其他根据需要填写必须要定义的
******************************************************************************/
#define F_CPU 3686400
void USART_InitM1681( unsigned int baud )
{
unsigned int tmp;
//设置波特率
tmp= F_CPU/baud/16-1;
//tmp= F_CPU3864/baud/16-1;
UBRRH = (unsigned char)(tmp>>8);
UBRRL = (unsigned char)tmp;
//接收器与发送器使能//
// UCSRB = (1<<RXEN)|(1<<TXEN);
//接收器与发送器使能及接收中断使能
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
//接收器与发送器使能及收发中断使能
// UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
// 设置帧格式: 8 个数据位, 1 个停止位//
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
void USART_InitM1682( unsigned int baud )
{
unsigned int tmp;
// 设置波特率//
tmp= F_CPU/baud/16-1;
UBRRH = (unsigned char)(tmp>>8);
UBRRL = (unsigned char)tmp;
//接收器与发送器使能//
// UCSRB = (1<<RXEN)|(1<<TXEN);
//接收器与发送器使能及接收中断使能
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
//接收器与发送器使能及收发中断使能
// UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
//设置帧格式: 8 个数据位, 2 个停止位//
UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
}
/*以下为接收及发送相关中断函数,使用时调用即可
//中断向量号很重要不能搞错
uint tmp;
#pragma interrupt_handler uart0_rx_isr_m16:12
void uart0_rx_isr_m16(void)
{
tmp=USART_Receive8();
USART_Transmit8(tmp);
//有数据接收时的提示红灯闪动
if(tmp=='a')
{
USART_Transmit8('O');
USART_Transmit8('K');
USART_Transmit_2();
}
Green_LedOFF;
for(tmp=0;tmp<3;tmp++){
Red_LedOFF;
delay_nms(300);
Red_LedON;
delay_nms(300);}
}
#pragma interrupt_handler uart0_tx_isr_m16:14
void uart0_tx_isr_m16(void)
{ //有数据发出时的提示绿灯闪动
Red_LedOFF;
for(tmp=0;tmp<3;tmp++){
Green_LedON;
delay_nms(300);
Green_LedOFF;
delay_nms(300);}
// USART_Transmit8('O');///如果再次发送数据则会进入死循环。不建议
//USART_Transmit8('K');
//USART_Transmit8('?');
}
*/
/******************************************************************************
功能:外中断定义
函数:#pragma interrupt_handler INT0_isr_m16:2
#pragma interrupt_handler INT1_isr_m16:3
返回值:无
备注:
包括初始化程序:void INT0_init(void)//外中断0使能
void INT1_init(void)//外中断1使能
void INT01_init(void)//外中断0和1使能
特别要注意的是:PORTD = 0xff;如果低电平触发则初始化时要高电平。
******************************************************************************/
void INT0_init(void)//外中断0使能
{
CLI();
MCUCR = 0x00;//外中断01低电平触发
GIFR=(1<<INTF1)|(1<<INTF0);//GIFR=0x00;通用中断标志寄存器
GICR=(1<<INT0);
SEI();
}
void INT1_init(void)//外中断1使能
{
CLI();
MCUCR = 0x00;//外中断01低电平触发
GIFR=(1<<INTF1)|(1<<INTF0);//GIFR=0x00;通用中断标志寄存器
GICR=(1<<INT1);
SEI();
}
void INT01_init(void)//外中断0和1使能
{
CLI();
MCUCR = 0x00;//外中断01低电平触发
GIFR=(1<<INTF1)|(1<<INTF0);//GIFR=0x00;通用中断标志寄存器
GICR=(1<<INT1)|(1<<INT0);
SEI();
}
/*
#pragma interrupt_handler INT0_isr_m16:2
void INT0_isr_m16(void)
{
//中断程序
}
#pragma interrupt_handler INT1_isr_m16:3
void INT1_isr_m16(void)
{
//中断程序
}
*/
/******************************************************************************
功能:串口发送
函数:void USART_Transmit8( unsigned char data )
void USART_Transmit9( unsigned char data )
void USART_Transmit_2( void ) 发送Hello
返回值:无
备注:
******************************************************************************/
void USART_Transmit8( unsigned char data )
{
/*检空发送标志*/
while ( !( UCSRA & (1<<UDRE)) );
/*发送数据*/
UDR = data;
}
void USART_Transmit9( unsigned int data )
{
/*检空发送标志 */
while ( !( UCSRA & (1<<UDRE)));
/* 将第9位复制到TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x0100 )
UCSRB |= (1<<TXB8);
/*发送数据 */
UDR = data;
}
void USART_Transmit_2( void )
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = 'H';
while ( !( UCSRA & (1<<UDRE)) );
UDR = 'e';
while ( !( UCSRA & (1<<UDRE)) );
UDR = 'l';
while ( !( UCSRA & (1<<UDRE)) );
UDR = 'l';
while ( !( UCSRA & (1<<UDRE)) );
UDR = 'o';
}
/******************************************************************************
功能:串口接收
函数:unsigned int USART_Receive8( void )
unsigned int USART_Receive9( void )
返回值:无
备注:
******************************************************************************/
unsigned int USART_Receive8( void )
{
/*等待 数据*/
while ( !(UCSRA & (1<<RXC)) );
return UDR;
}
unsigned int USART_Receive9( void )
{
unsigned char status, resh, resl;
/*等待 数据*/
while ( !(UCSRA & (1<<RXC)) );
/*收到数据、状态及第9位*/
/* from buffer */
status = UCSRA;
resh = UCSRB;
resl = UDR;
/*如果出错返回1 */
if ( status & (1<<FE)|(1<<DOR)|(1<<PE) ){return -1;}
/*过滤第9位然后返回*/
resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl);
}
/******************************************************************************
功能:串口接收防止缓冲器FIFO被刷新
函数:void USART_Flush( void )
返回值:无
备注:
******************************************************************************/
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSRA & (1<<RXC) ) dummy = UDR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -