
Микропроцессорные средства и системы / lab3
.docxМинистерство образования и науки Кыргызской Республики Государственный Технический Университет им. Раззакова
Факультет Информационных Технологий
Кафедра «Информатика и Вычислительная техника»
Отчет
Лабораторная работа № 3
Бишкек 2019 г.
Задание.
Записать в память текущее значение на дисплее. При следующем включении начинать с этого же значения.
Листинг кода
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
unsigned char Numeral[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char Discharge[4] = {0, 0, 0, 0};
uint16_t* COUNTER = (uint16_t*) 0;
ISR (TIMER1_COMPA_vect) {
static unsigned char ID;
ID++;
switch (ID) {
case 1:
PORTD = 0b00001110;
PORTC = Numeral[Discharge[0]];
break;
case 2:
PORTD = 0b00001101;
PORTC = Numeral[Discharge[1]];
break;
case 3:
PORTD = 0b00001011;
PORTC = Numeral[Discharge[2]];
break;
case 4:
PORTD = 0b00000111;
PORTC = Numeral[Discharge[3]];
ID = 0;
break;
}
}
int main(void) {
DDRC = 0xff;
DDRA = 0x00;
DDRD = 0x0f;
PORTA = 0x0f;
PORTD = 0x00;
TCCR1B |= (1<<WGM12); // устанавливаем режим по совпадению
TIMSK |= (1<<OCIE1A); //разрешаю прерывания
OCR1AH = 0b00000011;//устанавливаю число для сравнения в таймере
OCR1AL = 0b01000010;
TCCR1B |= (1<<CS11); // устанавливаю делитель частоты
int16_t counter = eeprom_read_word(COUNTER);
asm("sei");
while (1) {
if(PINA == 0b1110){
_delay_ms(300);
asm("cli");
counter++;
if(counter == 10000)
counter ^= counter;
uint16_t buff = counter;
for(uint8_t i = 0; i < 4; i++){
Discharge[i] = buff % 10;
buff = buff / 10;
}
eeprom_write_word(COUNTER,counter);
asm("sei");
}
if(PINA == 0b1101){
--counter;
_delay_ms(300);
while(counter > -1){
asm("cli");
uint16_t buff = counter;
for(uint8_t i = 0; i < 4; i++){
Discharge[i] = buff % 10;
buff = buff / 10;
}
--counter;
eeprom_write_word(COUNTER,counter);
asm("sei");
_delay_ms(1000);
}
if (counter == -1)
{
counter=0;
}
}
}
}
Рис. 1. Схема с семисегментныйм индикатором и кнопками управления им.
Рис. 2. Текущее значение в памяти EEPROM