BASIC4MCU | 질문게시판 | atmega128 avr usart 질문
페이지 정보
작성자 snoflak 작성일2022-06-21 02:26 조회5,338회 댓글0건본문
어렵기도 하고 도움받을만한 사람이 없어서 적어봅니다 (바쁘거나 귀찮으시면 패스하셔도됩니다.)
목표는 usart 에 1,2 입력시 led 좌,우측 순차점등이고 atmega128 array Fnd 가 좌,우측 나뉘어서 1,2 입력 한 숫자만큼 증가입니다.avr studio 4 기준입니다.
헤더파일
(
#include <avr/io.h>
#include <avr/interrupt.h>
#define CPU_CLOCK 7372800
volatile unsigned int tic_time;
unsigned char display_num[4] = {0.0.0.0}
unsigned char FND[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
unsigned int digit =0;
#define BAUD_RATE 19200
#define BAUD_RATE_L (CPU_CLOCK/(161*BAUD_RATE))-1
#define BAUD_RATE_H ((CPU_CLOCK/(161*BAUD_RATE))-1)>>8
void usart_send_byte(unsigned char byte)
{
while (!(UCSR0A&(1<<UDRE0)));
UDR0 = byte;
}
void usart_send_string(unsigned char *str,unsigned char len)
{
int i;
for (i=0;i<len;i++)
{
usart_send_byte(*(str+i));
}
}
unsigned char usart_recv_byte(void)
{
while(!(UCSR0A & (1<<RXC0)));
return UDR0;
}
ISR(TIMER0_COMP_vect)
{
tic_time++;
TCNT0=256-(CPU_CLOCK/256/100/2);
PORTA = FND[display_num[digit]];
PORTG = ~(0x01>>digit);
digit++;
digit = digit % 4;
}
void delay(unsigned int dsec)
{
tic_time =0;
while(dsec>tic_time);
}
)
메인
#include "1.h"
int main(void)
{
int i;
int count;
int count1;
unsigned char byte;
unsigned char buf1[]="1.led 좌측부터 순차점등 |r|n";
unsigned char buf2[]="2.led 우측부터 순차점등 |r|n";
unsigned char buf3[]="input number(1-2):";
DDRC=0xFF;
PORTC=0x00
DDRA=0xFF;
PORTA=0x00;
DDRG=0xFF;
PORTG=0xFF;
UBRR0L=(unsigned char)BAUD_RATE_L;
UBRR0H=(unsigned char)BAUD_RATE_H;
UCSR0B=(1<<TXEN)|(1<<RXEN)|(0<<UCSZ2);
UCSR0C=(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<UCSZ1)|(1<<UCSZ0);
TCCR0=(0<<WGM00)|(1<<WGM01)|(1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0=256-(CPU_CLOCK/256/100/2);
TIMSK=(1<<OCIE0)|(0<<TOIE0);
sei();
for (;;)
{
usart_send_string(buf1,sizeof(buf1));
usart_send_string(buf2,sizeof(buf2));
usart_send_string(buf3,sizeof(buf3));
byte = usart_recv_byte();
usart_send_byte(byte);
if (byte=='1')
{
for(i=0;i<9;i++)
{
PORTC=(1<<i);
delay(125);
}
count++;
display_num[0]=((count/10)%10);
display_num[1]=((count/1)%10);
PORTC=0x00;
}
else if (byte == '2')
{
for (i=7;i>=0;i--)
{
PORTC=(1<<i);
delay(125);
}
count1++;
display_num[2]=((count1/10)%10);
display_num[3]=((count1/1)%10);
PORTC=0x00;;
}
usart_send_byte('|r');
usart_send_byte('|n');
}
return 0;
}
댓글 0
조회수 5,338등록된 댓글이 없습니다.