BASIC4MCU | 질문게시판 | 답변 : 코드 관련...
페이지 정보
작성자 master 작성일2018-10-26 17:36 조회700회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=5731
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-10-26 오후 5:40:27// by Ok-Hyun Park/*==========================================================================*//*ASCII(English)-Only Display on Graphic LCD Module*//*==========================================================================*//*Graphic LCD Module: 128x64 dot,LED backlight*//*--------------------------------------------------------------------------*//*LCD_DATABUS PORTC: C0-C7=DB0-DB7(7-14,data bus)*//*LCD_CONTROL PORTA:*//*A0=D/-I(1,data/instruction)*//*A1=R/-W(2,read/write)*//*A2=E(3,enable)*//*A3=GLCD_CS1(4,chip select 1)*//*A4=GLCD_CS2(5,chip select 2)*/#include <avr/io.h>#define F_CPU 16000000UL#include <util/delay.h>#include <avr/interrupt.h>#include <stdio.h>#include "GLCD_kor.h" // define(delay)//#define SENSOR_IN(PINF&0x02)// PB4#define SENSOR_OUT_1 DDRF|=0x02 // PB4#define SENSOR_OUT_0 DDRF&=~0x0 // PB4/*#define MOTER PORTB|=0x01#define LED_R PORTB|=0x08#define LED_B PORTB|=0x04*///#define AM2302_IN(PINE&0x10)// PE4#define AM2302_OUT_1 DDRE|=0x10 // PE4#define AM2302_OUT_0 DDRE&=~0x10 // PE4#define LCD_DATABUS PORTC // GLCD data#define LCD_CONTROL PORTA // GLCD control signal#define lcd_RS_1 PORTC|=1#define lcd_RS_0 PORTC&=~1#define lcd_E_1 PORTC|=4#define lcd_E_0 PORTC&=~4#define lcd_Out PORTA // PORTA.4~7 4bits//unsigned char LineBuf1[17];unsigned char LineBuf2[17];unsigned int half_usec,Temp,Humi,adc_data;unsigned char data[5],Temp_sign;float volt1,volt2,temper,humi;//unsigned int adc_data; /*led_r,led_b,mot,*/unsigned char data[5];//float volt1,water;//void uart0_init(void){ UCSR0B=0x18; UBRR0L=0x67; }//void Tx0char(char m){ while(((UCSR0A>>UDRE0)&0x01)==0); UDR0=m; }int Putchar(char c){ Tx0char(c); return c; }int Getchar(void){ while((UCSR0A&0x80)==0); return UDR0; }void lcdCmd(char c){lcd_RS_0;lcd_Out=c&0xF0; lcd_E_1; _delay_us(1); lcd_E_0; _delay_us(1);lcd_Out=c<<4; lcd_E_1; _delay_us(1); lcd_E_0; _delay_us(40);}//void lcdData(char d){lcd_RS_1;lcd_Out=(d&0xF0)|1; lcd_E_1; _delay_us(1); lcd_E_0; _delay_us(1);lcd_Out=(d<<4)|1; lcd_E_1; _delay_us(1); lcd_E_0; _delay_us(40);}//void lcd_puts(char *s){ while(*s)lcdData(*s++); }//void lcd_init(void){_delay_ms(50);lcdCmd(0x28); lcdCmd(0x28); lcdCmd(0x28);lcdCmd(0x0C); lcdCmd(0x06); lcdCmd(0x01); _delay_ms(2);}//void lcd_gotoxy(char x,char y){if(y==0)lcdCmd(0x80+x);else if(y==1)lcdCmd(0xC0+x);else if(y==2)lcdCmd(0x94+x);else if(y==3)lcdCmd(0xD4+x);}//void AM2302_rd(void){unsigned char i,k;for(i=0; i<8; i++)data[i]=0; // 변수 초기화//host start signalAM2302_OUT_1;_delay_ms(1);AM2302_OUT_0; // 데이터 요구//released timeTCNT1=0; TCCR1B=2;while(AM2302_IN);TCCR1B=0;half_usec=TCNT1; // high_timeif((half_usec<30)||(half_usec>410))goto AM2302_Error; // 30us high 측정,(min20~max200us),실측 20us//response AM2302TCNT1=0; TCCR1B=2;while(!AM2302_IN);TCCR1B=0;half_usec=TCNT1; // low_timeif((half_usec<140)||(half_usec>180))goto AM2302_Error; // 80us low 측정,(min75~max85us),실측 80us//TCNT1=0; TCCR1B=2;while(AM2302_IN);TCCR1B=0;half_usec=TCNT1; // high_timeif((half_usec<140)||(half_usec>180))goto AM2302_Error; // 80us high 측정,(min75~max85us),실측 80us//for(k=0; k<5; k++){for(i=0; i<8; i++){//pulseTCNT1=0; TCCR1B=2; while(!AM2302_IN); TCCR1B=0; half_usec=TCNT1; // low_timeif((half_usec<85)||(half_usec>150))goto AM2302_Error; // 50us low(min48~max55us),실측 56us,68us//TCNT1=0; TCCR1B=2; while(AM2302_IN); TCCR1B=0; half_usec=TCNT1; // high_timeif((half_usec<34)||(half_usec>165))goto AM2302_Error; // 26us&70us high(min22~max75us),실측 24us,72~76us//if(half_usec>96)data[k]|=0x80>>i; // high구간 48us이상이면 1}}//Parity(check sum)checki=data[0]+data[1]+data[2]+data[3];if(i!=data[4])goto AM2302_Error; //Parity error//data copyHumi=(unsigned int)data[0]*256+data[1];Temp=(unsigned int)data[2]*256+data[3];//Temp 영하 체크if(Temp&0x8000){ Temp_sign=1; Temp&=0x7FFF; } // 영하else Temp_sign=0; // 영상return;AM2302_Error: ;Humi=Temp=0; Temp_sign=0;}//int main(void){DDRD=0xff;fdevopen(Putchar,Getchar); // printf 와 scanf 사용가능unsigned char keyDown[20];unsigned int R=0,C=0;printf("Lab_UART0\r\n");printf("%c\n\r",0x0C);printf("*============================================================+\r\n");printf("|Hyper terminal Setting|\r\n");printf("|------------------------------------------------------------|\r\n");printf("|Speed-9600,DataBit-8,Parity-None,StopBit-1,Flow-None|\r\n");printf("*============================================================|\r\n");byte i;MCU_initialize(); // initialize MCU and kit_delay_us(10); // wait for system stabilizationGLCD_init();_delay_us(10);GLCD_clear(); // initialize GLCD screencursor_flag=0; // cursor off//GLCD_String(0,0,"->");// C=3;// C=0; R=0;// printf("(!)User Start=>");lcd_init();lcd_gotoxy(0,0); lcd_puts("AM2302 test");lcd_gotoxy(0,1); lcd_puts("Humi&Temp");_delay_ms(2000);// GLCD_Bitmap((char*)em_font,0,0,64,64);// _delay_ms(2000);ADMUX=0x41; ADCSRA=0xE7;while(1){_delay_ms(10); // AM2302 데이터 요구 주기AM2302_rd();sprintf(LineBuf1,"%d.%d?C 입니다 ",Temp/10,Temp%10);sprintf(LineBuf2,"%d.%d 입니다.",Humi/10,Humi%10);GLCD_String(0,0,"온도는");GLCD_String(1,0,LineBuf1);GLCD_String(2,0,"습도는");GLCD_String(3,0,LineBuf2);if(Humi/10>50){ PORTD=0x08; } else{ PORTD=0x00; }// scanf("%s",&keyDown);// GLCD_String(C,R,keyDown); // C++;// if(C>20){ C=0; R++; }//if(ADC<700){ PORTB=0x04; PORTD=8; }else { PORTB=0x09; _delay_ms(500); PORTB=1; _delay_ms(500); PORTD=0; }}return 0;}
중복된 포트가 있습니다.
포트 설정은 알아서 처리하세요
댓글 0
조회수 700등록된 댓글이 없습니다.