📄 demob-16sm._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 + -