⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 avr的I/O、串口、定时器/计数器、外部中断、LCD等的例程
💻 C
字号:
#include <avr/io.h>
#include <avr/delay.h> 
#include <avr/interrupt.h> 
#include <avr/signal.h> 
#include <avr/wdt.h>
#include <avr/sleep.h>


#define uint    unsigned int
#define uchar   unsigned char

//管脚定义
#define PIN_RXD			0 	//PD0   RXD
#define PIN_TXD			1 	//PD1   TXD
#define LCD_EN_PORT    PORTA
#define LCD_EN         0x01   //portDA port        out
#define CONTROL_PORT   DDRA   //direction



volatile uchar PC_COMMAND;		//PC发出的当前命令
volatile uchar RX_BUFFER[16];	//存放接收数据的数组
volatile uchar RX_index;			//存放接收数据的个数

void uart_init(void);
void delay_nms(uint n) ;
void put_c(uchar c);

void uart_init(void)
{
	//{{WIZARD_MAP(UART)
	// Baud Rate: 9600
	// Character Size: 8-bit
	// Mode: Asynchronous
	// Parity: Disabled
	// Stop Bit: 1-bit
	UBRRL = 0x2f; //9600
	UBRRH = 0x00;
	UCSRA = 0x00;  //
	UCSRC = 0x86;  //异步工作模式,Parity: Disabled,
	UCSRB = 0x98;  //接收结束中断,接收器使能,发送器使能
	//}}WIZARD_MAP(UART)
}

void put_c(uchar c) //发送采用查询方式
{
	while( !(UCSRA & (1<<UDRE)) );
	UDR=c;
}

void put_s(uchar *ptr)
{
	while (*ptr)
	{
		put_c(*ptr++);
	}
	put_c(0x0D);
	put_c(0x0A);  //结尾发送回车换行
}


SIGNAL(SIG_USART_RECV) //串口接收中断服务程序
{
	PC_COMMAND=UDR;
	switch(PC_COMMAND)
	{
		case '0':	//0x30 ASCII '0'
			//LED0_ON();
			LCD_EN_PORT |= LCD_EN;    //EN=1
			put_s("用户输入0#指令");
			break;
		case '1':
			//LED1_ON();
			LCD_EN_PORT &= ~LCD_EN;   //EN=0
			put_s("用户输入1#指令");
			break;
		case '2':
			//LED0_OFF();
			//LED1_OFF();
			//FLAG=!FLAG;
			put_s("用户输入2#指令");
			break;
		default:
			put_s("用户输入的指令无效!");
			break;
	}
	/*
	  注意,使用put_s函数发送数据需要一定的时间,如果输入数据的速度过高将会导致数据丢失
	  所以,一般建议中断服务程序的处理时间尽量的短,只做采集数据和设标志位,命令的处理交由主程序来完成
	  这里只是示范简单的命令处理
	*/
	RX_BUFFER[RX_index]=PC_COMMAND;		//保存数据到数组里面
	RX_index++;
	if (RX_index>=16) RX_index=0;		//防止数组溢出
		
}

void pro_coammand(void) //多字节命令的处理程序
{
	uchar i;
	
	if (RX_index>=10) 
	{
    	UCSRB&= ~(1<<RXCIE);	//关断USART接收中断
		put_c(0x0D);
		put_c(0x0A);  //发送回车换行
		put_s("Hello! 你之前输入的命令列表是:");
		for (i=0;i<RX_index;i++) put_c(RX_BUFFER[i]);
		put_c(0x0D);
		put_c(0x0A);
		put_c(0x0D);
		put_c(0x0A);  //发送回车换行
		RX_index=0;				//清零
    	UCSRB|= (1<<RXCIE);	//打开USART接收中断
	}
}


int main(void)
{
	PORTA =0xFF;											
	PORTB =0xFF;
    PORTC =0xFF;
    DDRD  =(1<<PIN_TXD);								//TXD为输出
    PORTD =0xFF;
	CONTROL_PORT |= LCD_EN; //out
	uart_init();
	sei();
	while(1)
	{
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -