Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы готовые / Лабораторная работа 5 Динамическая индикация

.docx
Скачиваний:
0
Добавлен:
21.06.2024
Размер:
46.85 Кб
Скачать

Вариант 2

Задание 1

К=2083(0х823)

Задание 2

#define F_CPU 8000000L

#include <avr/interrupt.h>

#include <util/delay.h>

#include <stdlib.h>

int gr1=-314;

int gr2=271;

int ch=-314;

int znak=0;

void segcharCC (unsigned char seg)

{

switch(seg)

{

case 1: PORTC = 0b00000110; break;

case 2: PORTC = 0b01011011; break;

case 3: PORTC = 0b01001111; break;

case 4: PORTC = 0b01100110; break;

case 5: PORTC = 0b01101101; break;

case 6: PORTC = 0b01111101; break;

case 7: PORTC = 0b00000111; break;

case 8: PORTC = 0b01111111; break;

case 9: PORTC = 0b01100111; break;

case 0: PORTC = 0b00111111; break;

case 10: PORTC = 0b01000000; break;

}

}

// функция инициализации таймера/счетчика TC1

void timer_ini(void)

{

// установить режим CTC (сброс по совпадению)

TCCR1B |= (1<<WGM12);

// разрешить прерывания TC1 по совпадению

TIMSK |= (1<<OCIE1A);

// установить константу

// K=0x2000 для 8 МГц / 8

OCR1AH = 0b00100000;

OCR1AL = 0b10000000;

// задать делитель (f/8)

TCCR1B |= (1<<CS11);

}

// переменная для переключения между разрядами

unsigned char n_count = 0;

int a,b,c;

// обработка прерывания по достижении счета

ISR (TIMER1_COMPA_vect)

{

a=abs(ch);

a=a/100;

a=a%10;

b=abs(ch);

b=b/10;

b=b%10;

c=abs(ch);

c=c%10;

// вывод на 1 линию индикатора

if(n_count==0 && ch < 0)

{

// PORTD = 0b10001000

PORTD = (PORTD | (1<<PORTD1) | (1<<PORTD2) |(1<<PORTD3)) & ~(1<<PORTD0);

segcharCC(10);

}

// вывод на 2 линию индикатора

if(n_count == 1)

{

// PORTD = 0bxxxx1101

PORTD = (PORTD | (1<<PORTD0) | (1<<PORTD2) | (1<<PORTD3)) & ~(1<<PORTD1);

segcharCC(a);

//ch++;

}

// вывод на 3 линию индикатора

if(n_count == 2)

{

// PORTD = 0bxxxx1011

PORTD = (PORTD | (1<<PORTD0) | (1<<PORTD1) | (1<<PORTD3)) & ~(1<<PORTD2);

segcharCC(b);

}

// вывод на 4 линию индикатора

if(n_count == 3)

{

// PORTD = 0bxxxx0111

PORTD = (PORTD | (1<<PORTD0) | (1<<PORTD1) | (1<<PORTD2)) & ~(1<<PORTD3);

segcharCC(c);

}

n_count++; // перейти к следующему разряду

// при достижении последнего разряда начать с начала

if (n_count > 3)

{

n_count = 0;

ch+=3;

}

if (ch>=gr2) ch=gr1;

}

int main(void)

{

timer_ini();

DDRC = 0xFF;

DDRD = 0x0F;

DDRA=0x00;

PORTA=0x00;

PORTC = 0xFF;

sei();

while(1)

{

if (!(PINA &&(1<< PINA0))){

ch=gr1;

}

}

}

Схема