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

📄 demob-16sm._c

📁 大量ATMEGA16实例, 都可以运行,包括驱动LCD1602, 上位机显示等多功能
💻 _C
字号:
/*
Title: 		DEMOB-16sm.c
Connection:	RS232 connection to PC
            PC runs a terminal program such as Tera Term Pro
			Set Baudrate to 38400, 1 Start, 8 Data and 1 Stop			
Operation:
 			1. Messages "Baudrate=38400" displayed on LCD panel for about 1 minuite
			2. LCD panel is cleared and cursor goes to Home (firat line, first coloumn)
			3. Any key typed on PC's keyboard will be on LCD panel 
			  
Attention:	A terminal program "Tera Term Pro" is contained in CD 
			  for PC to communicate with the AVR Study Board	
*/	 
/* UCSRA: Control & Status Register A
   b7-RXC: 	USART receive complete
   b6-TXC: 	USART transmit complete
   b5-UDRE:	USART Data register empty
   b4-FE:	Frame Error
   b3-DOR:  Data overtun
   b2-PE: 	Parity error
   b1-U2X: 	double the USART transmission speed
   b0-MPCM: multi-processor communication mode
   
   USARB
*  b7-RXCIE: RX complete interrupt enable
   b6-TXCIE: TX complete interrupt enable
   b5-UDRIE: USART data register empty interrupt enable
*  b4-RXEN:	 Receiver enable
*  b3-TXEN:  Transmitter enable
   b2-UCSZ2: chracter size     	 ------->0
   b1-RXB8	 receive data bit 8
   b0-TXB8:	 Transmit data 8
   
   UCSRC
*  b7-URSEL: register select   	 0/UBRRH,	  1/UCSRC
   b6-UMSEL: USART mode select 	 0/Asyn		  1/Synchronous
   b5-UPM1:  -------- Parity mode 00/disable, 01 reserved
   b4-UPM0:	 -------- 		 	  10 even,	  11 odd 
   b3-USBS:	stop bit selection 0/1-bit, 1/2-bit
*  b2-UCSZ1	 		  	   	   --------> 1
*  b1-UCSZ0  				   --------> 1
   b0-UCPOL: clock polarity	  0 rising XCK edge, 1 falling XCK edge  
*/


#include <iom16v.h>
#include <macros.h>

#pragma interrupt_handler uart_rx_isr: 12

// external definition from LCD-16sn.c
extern unsigned char lcd_enable, lcd_disable;
extern unsigned char in_instr_wr, in_data_wr;
extern unsigned char in_instr_rd, in_data_rd;
extern int indexhead, indextail, indexcount;
extern int cursor_index;
extern unsigned char swin, swin2;
extern const char message1[];
extern const char message2[]; 
extern const char message3[];
extern const char message4[];
extern const char message5[];
extern const char message6[];
extern const char message7[];
extern const char message8[];

extern void port_init(void);
extern void WDT_off(void);
extern void delay(int);
extern void ldelay(int);
extern void wr_instruction(unsigned char);
extern void wr_data(unsigned char);
extern void wr_instruction2(unsigned char);
extern void wr_data2(unsigned char);
extern void cursor_home(void);
extern void cursor_line1(void); 
extern void cursor_line2(void);
extern void space(void); 
extern void out_string(const char array[]);
extern void lcd_on(void);
void clear_line1(void);
void clear_line2(void);

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
unsigned char RecBuf[40];
int rec_head=0, rec_tail=0;
unsigned rec_data;

void uart_rx_isr(void)
{
 RecBuf[rec_head]=UDR;
 rec_head++;
 if(rec_head>=40)
 	rec_head=0;			  
}

void port_init(void)
{
 DDRA  = 0xFF;		//set PortA output
 DDRB  = 0xff;		//set PORTB output
 DDRC  = 0x00;		//set PORTC output
 PORTC = 0xff;
 DDRD  = 0x7f;		//set PD.7 input for RX
}

void USART_init(void)
{
 UCSRB=0x00;
 UCSRA=0x00;
 UCSRB=0b10011000;	 //b7: RXCIE enabeled, b4: RXEN enabled, B3: TXEN enabled
 UBRRH=0x00;		 //
 					 //Crystal=16MHx
 //UBRRL=103;		 //Bausdrate=9600 tested work fine
 //UBRRL=51;		 //Baudrate=19200 tested work fine
 UBRRL=25;		 	 //Baudrate=38400 tested work fine
 //UBRRL=8;	 		 //Baurate=115200 tested work fine
 UCSRC=0b10000110;	 //Asyn, No parity, 1-stop, 8-bit, rising edge
 memset(RecBuf, 0, sizeof(RecBuf));
 rec_head=0;
 rec_tail=0;
} 

/*
void delay2(int count)
{
 int i, j;
 for(i=count; i>0; i--)
    for(j=10; j>0; j--)
	   ;
}*/

void transmit(unsigned char abyte)
{
 UDR=abyte;
 while(!(UCSRA&0b01000000))	//b6=1 TXE
	  ;
}

//*****************************************************************
void main(void)
{
 unsigned char outa=0b01010101, outb=0b10101010, outc=0x00, outd=0x00;
 int dswin;
 port_init();
 USART_init();
 SEI();
 WDT_off();
 ldelay(50);
 lcd_on();
 PORTD=0x50;
 ldelay(50);
 PORTD=0x05;
 ldelay(50);
 out_string(message1);
 cursor_line2();
 out_string(message2);
 ldelay(500);
 clear_line2();
 clear_line1();
 while(1)
   {
    WDR();				  	//Watchdog reset
	if(rec_head!=rec_tail)
	   {
	    rec_data=RecBuf[rec_tail];
		rec_tail++;
		if(rec_tail>=40)
		   rec_tail=0;
		   
		dswin=rec_head<<2;
	    PORTD=dswin;
		
		if(rec_data==13)
		  {
		   transmit(13);
		   transmit(10);
		   if(cursor_index<=15)
		      clear_line2();
		   else
		      clear_line1();	  
		  }			
		else
		  {
		  transmit(rec_data);
		  wr_data2(rec_data);
		  }
	   } 
   }
}

⌨️ 快捷键说明

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