📄 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
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 + -