這是用來練習如何在AVR單晶片上利用RS232傳輸,電腦端輸入數值傳送到開發板,透過七段顯示器顯示數值,程式碼如下:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/delay.h>
#include <string.h>
#include <stdio.h>
#define F_CPU 7372800
#define BAURDRATE 9600
#define UBRR_VALUE (unsigned char)((unsigned long)F_CPU/(16*(unsigned long)BAURDRATE)-1)
#define UBRR_VALUE_H (unsigned char)UBRR_VALUE>>8
#define UBRR_VALUE_L (unsigned char)UBRR_VALUE
#define D_LE0 PORTD &= ~(1 << PD4)
#define D_LE1 PORTD |= (1 << PD4)
#define W_LE0 PORTD &= ~(1 << PD5)
#define W_LE1 PORTD |= (1 << PD5)
#define DATA PORTA
#define SIZE 8
unsigned char str[SIZE];
unsigned char getstr[SIZE];
short int counter = -1;
void initialize(void);
void show_one(unsigned char,unsigned char);
void show(unsigned char[]);
void uart0Init(void)
{
UBRR0H = UBRR_VALUE_H;
UBRR0L = UBRR_VALUE_L;
UCSR0B = _BV(RXEN1) | _BV(RXCIE1) | _BV(TXEN1);
UCSR0C = _BV(UCSZ11) | _BV(UCSZ10);
}
SIGNAL(SIG_USART0_RECV)
{
//str[++counter] = UDR0;
//if (counter== 7)counter = -1;
getstr[++counter] = UDR0;
while(!(UCSR0A&_BV(UDRE1)));
UDR0=getstr[counter];
if (!getstr[counter] | getstr[counter] == (unsigned char)13) {
getstr[counter] = 0;
strcpy(str,getstr);
counter = -1;
}
}
int main(void)
{
initialize();
uart0Init();
sei();
while(1)
{
show(str);
}
return 0;
}
void show_one(unsigned char number,unsigned char place)
{
unsigned char pattern[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x40,0x79};
D_LE1;
W_LE1;
DATA=~(0x01<<place);
W_LE0;
DATA=pattern[number];
D_LE0;
return;
}
void show(unsigned char seg7[])
{
unsigned char i;
for(i=0;seg7[i];i++)
{
show_one(seg7[i]-'0',SIZE-(strlen(seg7)-1-i)-1);
_delay_ms(1);
}
for(;i<SIZE;i++)
{
show_one(0,SIZE-i-1);
_delay_ms(1);
}
_delay_ms(1);
return;
}
void initialize(void)
{
DDRA=0XFF;
PORTA=0xFF;
DDRC=0XF0;
PORTC=0xF0;
DDRD=0XFF;
PORTD=0xFF;
}
