BASIC4MCU | 질문게시판 | cds를 이용해 부저울리기 질문이요
페이지 정보
작성자 아트왕 작성일2020-11-04 17:15 조회3,613회 댓글2건본문
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
#include <alcd.h>
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Voltage Reference: AREF pin
#define ADC_VREF_TYPE 0x00
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE&0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}
unsigned char sec_cnt;
unsigned char a=1;
unsigned char FONT[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x98};
unsigned char sec=0;
unsigned char sw;
unsigned char A;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
sec_cnt++;
if(sec_cnt == 60)
{
PORTA=FONT[a];
a++;
sec_cnt=0;
sec++;
}
TCNT0 = 0x83;
}
void main(void)
{
unsigned char s;
char lcd_text[16];
int volt;
char x;
char y;
PORTA=0x00;
DDRA=0xFF;
DDRE=0x00;
PORTE=0x00;
PORTB=0xFF;
DDRB=0x00;
ACSR=0x00;
SFIOR=0x00;
ASSR=0x00;
TCCR0=0x07;
TCNT0=0x83;
OCR0=0x00;
TIMSK=0x01;
ETIMSK=0x00;
ADMUX=FIRST_ADC_INPUT|(ADC_VREF_TYPE&0xff);
ADCSRA=0xCC;
lcd_init(16);
#asm("sei")
TCCR3A=0x40;
TCCR3B=0x09;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
lcd_init(16);
while (1)
{
sprintf(lcd_text,"%2i",sec);
lcd_gotoxy(0,0);
lcd_puts(lcd_text);
sw=~PINB;
if(sw==0x01){
A++;
if(A==1){
lcd_init(16);
volt=adc_data[0]*0.0048828125*100;
x=volt/100;
y=volt%100;
sprintf(lcd_text,"Volt=%i.%2i",x,y);
lcd_gotoxy(1,1);
lcd_puts(lcd_text);
delay_ms(100);
}
if(A==2){
if((ACSR&0x20)!=0){
DDRE=0xFF;
for(s=0;s<3;s++){
OCR3AH=31249>>8;
OCR3AL=31249&0x00FF;
delay_ms(500);
OCR3AH=23528>>8;
OCR3AL=23528&0x00FF;
delay_ms(500);
}
OCR3AH=0x00;
OCR3AL=0x00;
}
DDRE=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
}
}
}
}
아트메가 128에서 스위치한번누르면 lcd에 조도센서에따른 저항값이 나오게 하였고 두번눌렀을때
cds를 가리면 부저가 울리도록 코딩했는데 부저가 울리지않는데 어디가 틀린건지 알려주시면 감사하겠습니다 ㅠㅠ
댓글 2
조회수 3,613master님의 댓글
master 작성일
sw=~PINB;
if(sw==0x01){
A++;
if(A==1){
lcd_init(16);
volt=adc_data[0]*0.0048828125*100;
x=volt/100; y=volt%100;
sprintf(lcd_text,"Volt=%i.%2i",x,y); lcd_gotoxy(1,1); lcd_puts(lcd_text);
delay_ms(100);
}
스위치 체크코드에 100ms 딜레이가 있습니다.
만약 0.1초이상 길게 누른다면 A가 증가해서 얼마까지 증가 할런지 모르겠습니다.
상승엣지 혹은 하강엣지 검출방식을 공부하세요
master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/153550
강과 게시판에 다양한 스위치 예제가 있으므로 엣지 검출 예제도 있을 것으로 생각합니다.(강좌글을 만든지 오래되서 기억이 가물~)