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

📄 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 
			4. When 'CR' key pressed, the cursor of LCD panel will starts from next line  
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 + -