BASIC4MCU | 센서 | 온습도센서 | LM35 LCD FND 코드비젼 & AVRstudio
페이지 정보
작성자 키트 작성일2017-08-29 11:37 조회3,269회 댓글0건본문
// 코드비젼
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 #include <mega128.h>#include <stdio.h>#include <delay.h>//#define LCD_DATA PORTD#define LCD_INST PORTD#define LCD_CTRL PORTE#define LCD_RS 0x01 //PE0#define LCD_RW 0x02 //PE1#define LCD_EN 0x04 //PE2//unsigned char fnd_table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};unsigned int adc_value, temp=0, fnd_cnt=0;float temp_f;//void LCD_data(char ch){ LCD_DATA=ch; LCD_CTRL=5; delay_us(1); LCD_CTRL=1; delay_us(50); }void LCD_comm(char ch){ LCD_DATA=ch; LCD_CTRL=4; delay_us(1); LCD_CTRL=0; delay_ms(5); }void LCD_CHAR(char c){ LCD_data(c); }void LCD_STR(char *str){ while(*str)LCD_CHAR(*str++); }void LCD_pos(char col, char row){ LCD_comm(0x80|(col+row*0x40)); }void LCD_clear(void){ LCD_comm(1); }//void LCD_init(void){delay_ms(100);LCD_comm(0x38); LCD_comm(0x38); LCD_comm(0x38);LCD_comm(0x0E); LCD_comm(0x06); LCD_clear();}//interrupt [TIM0_COMP] void timer0_comp_isr(void){ // 매치 인터럽트PORTA=0;switch(fnd_cnt){case 0: PORTC=fnd_table[temp/1000]; PORTA=1; break;case 1: PORTC=fnd_table[(temp/100)%10]; PORTA=2; break;case 2: PORTC=fnd_table[(temp/10)%10]|0x80; PORTA=4; break;case 3: PORTC=fnd_table[temp%10]; PORTA=8; break;}if(++fnd_cnt>3)fnd_cnt=0;}//void main(void){char str[30]="LCD test.. ";DDRA=0x0F; DDRB=1; DDRC=0xFF; DDRD=0xFF; DDRE=0x07;TCCR0=0x0C; OCR0=249; TIMSK=2; //16000000/ 64/(1+249)= 1000Hz=1msLCD_init();LCD_pos(0,1); LCD_STR(str);ADCSRA=0xE7;SREG=0x80;while(1){delay_ms(250);LCD_clear();adc_value=ADCW;temp_f= (float)adc_value * 1000.0 / 1023.0 ;temp=(int)temp_f;if(temp_f>400)PORTB=1; else PORTB=0; // 40도 이상이면 부저 ONLCD_pos(0,0); sprintf(str,"Temp Test Prog."); LCD_STR(str);LCD_pos(0,1); sprintf(str,"TEMP = %4.2f C",temp_f/10.0); str[11]=0xdf; LCD_STR(str);}}cs //-----------------------------------------------------------//avrstudio
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 #include <avr/io.h>#include <avr/interrupt.h>#include <stdio.h>#define F_CPU 16000000UL // 16 MHz#include <util/delay.h>//#define LCD_DATA PORTD#define LCD_INST PORTD#define LCD_CTRL PORTE#define LCD_RS 0x01 //PE0#define LCD_RW 0x02 //PE1#define LCD_EN 0x04 //PE2//volatile unsigned char fnd_table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};volatile unsigned int adc_value, temp=0, fnd_cnt=0;float temp_f;//void LCD_data(char ch){ LCD_DATA=ch; LCD_CTRL=5; _delay_us(1); LCD_CTRL=1; _delay_us(50); }void LCD_comm(char ch){ LCD_DATA=ch; LCD_CTRL=4; _delay_us(1); LCD_CTRL=0; _delay_ms(5); }void LCD_CHAR(char c){ LCD_data(c); }void LCD_STR(char *str){ while(*str)LCD_CHAR(*str++); }void LCD_pos(char col, char row){ LCD_comm(0x80|(col+row*0x40)); }void LCD_clear(void){ LCD_comm(1); }//void LCD_init(void){_delay_ms(100);LCD_comm(0x38); LCD_comm(0x38); LCD_comm(0x38);LCD_comm(0x0E); LCD_comm(0x06); LCD_clear();}//ISR(TIMER0_COMP_vect){ // 매치 인터럽트PORTA=0;switch(fnd_cnt){case 0: PORTC=fnd_table[temp/1000]; PORTA=1; break;case 1: PORTC=fnd_table[(temp/100)%10]; PORTA=2; break;case 2: PORTC=fnd_table[(temp/10)%10]|0x80; PORTA=4; break;case 3: PORTC=fnd_table[temp%10]; PORTA=8; break;}if(++fnd_cnt>3)fnd_cnt=0;}//int main(void){char str[30]="LCD test.. ";DDRA=0x0F; DDRB=1; DDRC=0xFF; DDRD=0xFF; DDRE=0x07;TCCR0=0x0C; OCR0=249; TIMSK=2; //16000000/ 64/(1+249)= 1000Hz=1msLCD_init();LCD_pos(0,1); LCD_STR(str);ADCSRA=0xE7;SREG=0x80;while(1){_delay_ms(250);LCD_clear();adc_value=ADCW;temp_f= (float)adc_value * 1000.0 / 1023.0;temp=(int)temp_f;if(temp_f>400)PORTB=1; else PORTB=0; // 40도 이상이면 부저 ONLCD_pos(0,0); sprintf(str,"Temp Test Prog."); LCD_STR(str);LCD_pos(0,1); sprintf(str,"TEMP = %4.2f C",temp_f/10.0); str[11]=0xdf; LCD_STR(str);}}cs 7세그먼트는 콤몬 캐소드용입니다.
//FND를 빼고 LCD 함수만 남긴 예제입니다.// 코드비젼
123456789101112131415161718192021222324252627282930313233343536373839404142 #include <mega128.h>#include <stdio.h>#include <delay.h>//#define LCD_DATA PORTD#define LCD_INST PORTD#define LCD_CTRL PORTE#define LCD_RS 0x01 //PE0#define LCD_RW 0x02 //PE1#define LCD_EN 0x04 //PE2//unsigned int adc_value, temp=0;//void LCD_data(char ch){ LCD_DATA=ch; LCD_CTRL=5; delay_us(1); LCD_CTRL=1; delay_us(50); }void LCD_comm(char ch){ LCD_DATA=ch; LCD_CTRL=4; delay_us(1); LCD_CTRL=0; delay_ms(5); }void LCD_CHAR(char c){ LCD_data(c); }void LCD_STR(char *str){ while(*str)LCD_CHAR(*str++); }void LCD_pos(char col, char row){ LCD_comm(0x80|(col+row*0x40)); }void LCD_clear(void){ LCD_comm(1); }//void LCD_init(void){delay_ms(100);LCD_comm(0x38); LCD_comm(0x38); LCD_comm(0x38);LCD_comm(0x0E); LCD_comm(0x06); LCD_clear();}//void main(void){char str[20]="LCD test.. ";DDRB=1; DDRD=0xFF; DDRE=0x07;LCD_init();LCD_pos(0,1); LCD_STR(str);ADCSRA=0xE7;while(1){delay_ms(250);LCD_clear();adc_value=ADCW;temp=(int)( (float)adc_value * 1000.0 / 1023.0 );if(temp>400)PORTB=1; else PORTB=0; // 40도 이상이면 부저 ONLCD_pos(0,0); sprintf(str,"Temp Test Prog."); LCD_STR(str);LCD_pos(0,1); sprintf(str,"Temp=%3d.%d",temp/10,temp%10); LCD_STR(str);}}cs //----------------------------------------------
댓글 0
조회수 3,269등록된 댓글이 없습니다.