قسمت کلید های فشاری فرضیه و خواندن کلیدها با شما ببخشید که توضیحات تو کد ننوشتم سوالی هست بپرسید
کد:
/* * CFile1.c
*
* Created: 12/3/2015 10:36:14 AM
* Author: erf
*/
#define F_CPU 4000000UL
#include <stdint.h>
#include <avr/interrupt.h>
#define TCNT100KVAL 984
#define TCNT1MVAL 1020
#define DUTYMIN 35
#define DUTYMAX 55
#define BUTTON 0 /*just for example*/
volatile uint16_t freqVal;
volatile uint8_t DutyVal;
void PWM_Init_Start();
void Freq_Inc();
void Freq_Dec();
void Duty_Inc();
void Duty_Dec();
void Timer_Stop();
void Timer_Start();
void main(void)
{
freqVal = TCNT100KVAL;
DutyVal = 50;
sei();
PWM_Init_Start();
while (1)
{
switch(BUTTON)
{
case 1:
Freq_Inc();
break;
case 2:
Freq_Dec();
break;
case 3:
Duty_Inc();
break;
case 4:
Duty_Dec();
break;
}
}
}
void Timer_Stop()
{
TCCR1B &= ~(1<<CS10);
}
void Timer_Start()
{
TCCR1B |= (1<<CS10);
}
void PWM_Init_Start()
{
DDRD = (1<<PORTD5);
TCNT1 = freqVal;
OCR1A = (1024 - freqVal) * (DutyVal/100);
TIMSK |= (1 << TOIE1);
TCCR1A |= (1<<WGM11) | (1<<WGM10) | (1<<COM1A1);
TCCR1B |= (1<<CS10) | (1<<WGM12);
}
void Freq_Inc()
{
if (freqVal < TCNT1MVAL)
{
Timer_Stop();
freqVal++;
OCR1A = (1024 - freqVal) * (DutyVal/100);
Timer_Start();
}
}
void Freq_Dec()
{
if (freqVal > TCNT100KVAL)
{
Timer_Stop();
freqVal--;
OCR1A = (1024 - freqVal) * (DutyVal/100);
Timer_Start();
}
}
void Duty_Inc()
{
if (DutyVal<DUTYMAX)
{
Timer_Stop();
DutyVal++;
OCR1A = (1024 - freqVal) * (DutyVal/100);
Timer_Start();
}
}
void Duty_Dec()
{
Timer_Stop();
DutyVal--;
OCR1A = (1024 - freqVal) * (DutyVal/100);
Timer_Start();
}
ISR(TIMER1_OVF_vect)
{
TCNT1 = freqVal;
}