
Лабораторные работы готовые / Лабораторная работа 5 Динамическая индикация
.docxВариант 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;
}
}
}
Схема