BASIC4MCU | 질문게시판 | 답변 : atmega128 스위치 질문입니다.
페이지 정보
작성자 master 작성일2022-12-16 09:38 조회151회 댓글0건본문
#define F_CPU 16000000UL
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
//
#define aTS75_CONFIG_REG 1
#define aTS75_TEMP_REG 0
//
void I2C_Init(void){
TWBR=12; // 16000000 /(16 +(2x12))x prescaler=400000Hz=400kHz
TWSR=(0<<TWPS1)|(0<<TWPS0); // prescaler=1
TWCR=0x04;
}
//
void I2C_start(void){
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR &(1<<TWINT)));
}
//
void I2C_write(unsigned char data){
TWDR=data;
TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR &(1<<TWINT)));
}
//
unsigned char I2C_read(unsigned char ackVal){
TWCR=(1<<TWINT)|(1<<TWEN)|(ackVal<<TWEA); while(!(TWCR &(1<<TWINT)));
return TWDR;
}
//
void I2c_stop(void){
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
for(int k=0; k<100; k++); //wait
}
/*
* Pointer set followed by immediate write to the Configuration Register 데이터시트 참조
*/
void temp_init(void){
I2C_Init(); I2C_start(); I2C_write(0b10011000); I2C_write(aTS75_CONFIG_REG); I2C_write(0x00); I2c_stop();
}
/*
* Pointer set followed by immediate read from a 2-byte register 데이터시트 참조
*/
int temp_read(void){
char high_byte,low_byte;
I2C_start(); I2C_write(0x98); I2C_write(aTS75_TEMP_REG);
I2C_start(); I2C_write(0x98|1); high_byte=I2C_read(1); low_byte=I2C_read(0);
I2c_stop();
return((high_byte<<8)|low_byte);
}
//
void display_FND(int value){
char digit[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x40,0x00};
char fnd_sel[4]={0x01,0x02,0x04,0x08};
char value_int,value_deci,num[4];
int i;
if((value&0x8000)==0)num[3]=11; // 양수면
else{ num[3]=10; value=-value; } // 음수면 양수로
value_int=(char)((value&0x7f00)>>8);
value_deci=(char)(value&0x00ff);
num[2]=value_int/10%10;
num[1]=value_int%10;
num[0]=((value_deci&0x80)==0x80)*5;
for(i=0;i<4;i++){ PORTC=digit[num[i]]; PORTG=fnd_sel[i]; if(i==1)PORTC|=0x80; _delay_ms(2); }
}
//
void buzzer(int hz){
int ms=(int)(500.0/(float)hz);
PORTB=0x10; _delay_ms(ms);
PORTB=0x00; _delay_ms(ms);
}
//
int main(void){
int temperature=0,temp=0; char sw_flag=0,mode=0;
DDRA=0xff; DDRB=0x10; PORTD=3; DDRE=0x00; DDRC=0xff; DDRG=0xff;
temp_init();
_delay_ms(100);
while(1){
if((PINE&0x10)==0x00){
if(sw_flag==0){ sw_flag=1; if(++mode>2)mode=0; _delay_ms(50); }
}
else{
if(sw_flag){ sw_flag=0; _delay_ms(50); }
}
//-----------------------------------------------------------
temperature=temp_read(); display_FND(temperature); temp=temperature>>8;
//-----------------------------------------------------------
if(mode==0){
if(temp>=30){ PORTA=0xff; buzzer(500); } // LED 모두 ON
else { PORTA=0x00; PORTB=0x00; _delay_ms(1); } // LED 모두 OFF
}
//-----------------------------------------------------------
if(mode==1){ PORTA=0xff; buzzer(500); }
//-----------------------------------------------------------
if(mode==2){ PORTA=0x00; PORTB=0x00; _delay_ms(1); }
}
}
무한루프를 사용 할 때는 빠져나올 수 있는 것까지 고려해야 합니다.
스위치를 한번 누르면 부저
또한번 누르면 LED
다시 누르면 온도체크에 의한 제어
댓글 0
조회수 151등록된 댓글이 없습니다.