Код: Выделить всё
#include <mega8.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
#define TTT_PIN PORTD.0 // пин управления
#define pljus_PIN PINC.0
#define minus_PIN PINC.1
unsigned char procent=52;
// Таблица задержек для 16-тибитного таймера
flash const unsigned int Period[99] = {
20324, // 1% нагрузки
19794, // 2% нагрузки
19384, // 3% нагрузки
19036,18728,18450,18190,17948,17720,17504,17296,17096,16904,16718,16536,16360,16188,16022,15858,15696,
15538,15384,15232,15082,14934,14788,14644,14500,14360,14220,14082,13944,13808,13674,13540,13406,13274,13142,
13012,12882,12752,12622,12494,12366,12238,12110,11982,11854,11728,11600,11472,11346,11218,11090,10962,10834,
10706,10578,10448,10318,10188,10058,9926,9794,9660,9526,9392,9256,9118,8980,8840,8700,8556,8412,8266,8118,
7968,7816,7662,7504,7342,7178,7012,6840,6664,6482,6296,6104,5904,5696,5480,5252,5010,4750,4472,4164,
3816, // 97% нагрузки
3406, // 98% нагрузки
2876 // 99% нагрузки
};
interrupt [EXT_INT0] void ext_int0_isr(void)
{
TTT_PIN = 1;
TCNT1 = 0; // сбросили таймер
GICR&=~(1<<6); // запретили прерывание INT0 // GIFR = 0x10000000
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TTT_PIN = 0;
GIFR|=(1<<6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1<<6);
OCR1A = Period [procent]*2;
//OCR1B = Period [procent]+100;
// TCNT0=0xFA; // запускаем таймер на 96 мкс
// TCCR0=0x04; // частота таймера 62.500 кГц
}
// Declare your global variables here
void main(void)
{
PORTB=0b00000000;
DDRB=0b00000000;
PORTC=0b00000011;
DDRC=0b00000000;
PORTD=0b00000000;
DDRD=0b00000001;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x9C;
OCR1AL=0x40;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
GICR|=0x40;
MCUCR=0x03;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
lcd_gotoxy(0,0);
lcd_putchar((procent/100)%10+0x30);
lcd_putchar((procent/10)%10+0x30);
// lcd_putchar('.');
lcd_putchar(procent%10+0x30);
if((pljus_PIN==0)&&(procent !=99))
procent+=1;
delay_ms(10); // задержка 10 мс.
if((minus_PIN==0)&&(procent !=1))
procent-=1;
delay_ms(10); // задержка 10 мс.
};
}