답변 : 블루투스 관련 질문드립니다
페이지 정보
작성자 master 작성일18-12-10 11:04 조회7,488회 댓글1건본문
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-12-10 오전 11:09:25
// by Ok-Hyun Park
//
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
//
#define TRIG1 PORTA|=0x40 // 트리거 출력 PA6
#define TRIG0 PORTA&=~0x40
#define ECHO (PINA&0x80)// Echo 입력 PA7
//
#define BIT4_LINE2_DOT58 0x28 // 4 Bit Mode,2 Lines,5x8 Dot
#define DISPON_CUROFF_BLKOFF 0x0C // Display On,Cursor Off,Blink Off
#define DISPOFF_CUROFF_BLKOFF 0x08 // Display Off,Cursor Off,Blink Off
#define INC_NOSHIFT 0x06 // Entry Mode,Cursor Increment,Display No Shift
#define DISPCLEAR 0x01 // Display Clear,Address 0
#define CURHOME 0x02 // Cursor Home
#define CUR1LINE 0x80
#define CUR2LINE 0xC0
//
char CLCD_NUM[]="000.0";
char state=0;
int distance_1st,distance_2nd,height,number;
//-------------------------------------------------
void CLCD_cmd(char cmd){
PORTC=cmd&0xf0; PORTD=0x10; _delay_us(1); PORTD=0;
PORTC=cmd<<0x4; PORTD=0x10; _delay_us(1); PORTD=0; _delay_ms(5);
}
//
void CLCD_data(char data){
PORTC=data&0xf0; PORTD=0x14; _delay_us(1); PORTD=4;
PORTC=data<<0x4; PORTD=0x14; _delay_us(1); PORTD=4; _delay_us(50);
}
//
void CLCD_puts(char *s){ while(*s)CLCD_data(*s++); }
//
void CLCD_num_display(int n){
CLCD_NUM[0]=(n/1000)%10+0x30;
CLCD_NUM[1]=(n/100)%10+0x30;
CLCD_NUM[2]=(n/10)%10+0x30;
CLCD_NUM[3]='.';
CLCD_NUM[4]=n%10+0x30;
CLCD_NUM[5]=0; //null
CLCD_puts(CLCD_NUM);
}
//
void init_CLCD(){
_delay_ms(50);
CLCD_cmd(BIT4_LINE2_DOT58); CLCD_cmd(DISPON_CUROFF_BLKOFF);
CLCD_cmd(INC_NOSHIFT); CLCD_cmd(DISPCLEAR);
}
//-------------------------------------------------
unsigned int read_distance(){
unsigned int distance=0;
TRIG1; _delay_us(10); TRIG0;
while(!ECHO); TCNT1=0; TCCR1B=2; //0.5us
while( ECHO); TCCR1B=0;
distance=TCNT1;
distance=(unsigned int)((float)distance/11.6);
return(distance);
}
//-------------------------------------------------
void menu0(){
CLCD_cmd(DISPCLEAR);
CLCD_cmd(CUR1LINE); CLCD_puts("If Ready");
CLCD_cmd(CUR2LINE); CLCD_puts("Press Switch!");
state=1;
}
//-------------------------------------------------
void menu1(){
distance_1st=read_distance(); //초음파센서
CLCD_cmd(DISPCLEAR);
CLCD_cmd(CUR1LINE); CLCD_puts("First: "); CLCD_num_display(distance_1st);
state=2;
}
//-------------------------------------------------
void menu2(){
distance_2nd=read_distance(); //초음파센서
CLCD_cmd(CUR2LINE); CLCD_puts("Second: "); CLCD_num_display(distance_2nd);
state=3;
}
//-------------------------------------------------
void menu3(){
CLCD_cmd(DISPCLEAR);
CLCD_cmd(CUR1LINE); CLCD_puts("Height: ");
height=distance_2nd-distance_1st;
if(height<0)CLCD_puts("Error!");
else CLCD_num_display(height);
state=0;
}
//-------------------------------------------------
ISR(INT4_vect){
_delay_ms(100); EIFR|=0x10; if(PINE&=0x10)return; // 채터링 return
//-------------------------------------------------------------------
switch(state){ // 스위치 누른 횟수
case 0: menu0(); break;
case 1: menu1(); break;
case 2: menu2(); break;
case 3: menu3(); break;
}
}
//-------------------------------------------------
void TX1_char(char c){ while(!(UCSR1A&0x20)); UDR1=c; }
void TX1_STR(char *s){ while(*s)TX1_char(*s++); }
//-------------------------------------------------
ISR(USART1_RX_vect){ // 수신 인터럽트
char r;
r=UDR1;
if(r=='0')menu0();
if(r=='1')menu1();
if(r=='2')menu2();
if(r=='3')menu3();
}
//
int main(void){
DDRA=0x40; // 초음파거리센서 TRIG(PA6,출력),ECHO(PA7,입력)
DDRC=0xFF; // CLCD PORT(data&command)
DDRD=0x1C; // CLCD PORT(control 출력: RS=bit2,RW=bit3,E=bit4)
PORTE=0x10; // SW1 내부플업저항
init_CLCD();
UCSR1B=0x98; UBRR1L=8; // 115200
EICRB=0xAA; EIMSK=0x10; // INT4 하강 에지(Fallin Edge)
SREG|=0x80;
while(1);
}
먼저번 답변글은 UART0 9600 이었고
지금 글은 UART1 115200 입니다.
댓글 : 1
조회수 : 7,488
도리비님의 댓글
도리비 작성일답변 정말 감사드립니다!!