Скачиваний:
3
Добавлен:
27.01.2022
Размер:
69.51 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ и НАУКИ

КЫРГЫЗСКОЙ РЕСПУБЛИКИ

КЫРГЫЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. И. РАЗЗАКОВА

ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

КАФЕДРА «ИНФОРМАТИКА И ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА»

Отчет

По микроконтроллерам и микропроцессорам

Лабораторная работа 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 NumeralPoint[10]= {0x3F|0x80,0x06|0x80,0x5B|0x80,0x4F|0x80,0x66|0x80,0x6D|0x80,0x7D|0x80,0x07|0x80,0x7F|0x80,0x6F|0x80};

unsigned char Discharge[5] = {0,0,0,0,0};

char a[3][4]={

{'1','4','7','*'},

{'2','5','8','0'},

{'3','6','9','#'}

};

int isInputed = 0;

int i=0;

int j=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;

if(Discharge[5] == 0) {

PORTC = NumeralPoint[Discharge[1]];

} else {

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;

}

}

void addNumber(int num) {

if(isInputed == 0) {

Discharge[0] = 0;

Discharge[1] = 7;

Discharge[2] = 1;

Discharge[3] = 8;

isInputed = 1;

}

Discharge[0] = Discharge[1];

_delay_ms(500);

Discharge[1] = Discharge[2];

_delay_ms(500);

Discharge[2] = Discharge[3];

_delay_ms(500);

Discharge[3] = num;

}

int main(void)

{

int stop = 0;

DDRC = 0xff;

PORTD = 0x00;

DDRD = 0xff;

DDRB=0xFF;

PORTB=0xFF;

DDRA=0x00;

PORTA=0x0F;

TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)

TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)

OCR1AH = 0b00000011; //записываем в регистр число для сравнения

OCR1AL = 0b01000010;

TCCR1B |= (1<<CS11); //установим делитель.

Discharge[3] = eeprom_read_word(0x0000);

Discharge[2] = eeprom_read_word(0x0001);

Discharge[1] = eeprom_read_word(0x0010);

Discharge[0] = eeprom_read_word(0x0011);

asm("sei");

while (1)

{

if (stop == 0){

Discharge[3] == 0;

{

Discharge[2] == 0;

{

Discharge[1] == 0;

{

Discharge[0] == 0;

}

}

}

_delay_ms(1);

Discharge[5] = 1;

_delay_ms(500);

Discharge[5] = 0;

_delay_ms(500);

eeprom_write_word(0x0000, Discharge[3]);

eeprom_write_word(0x0001, Discharge[2]);

eeprom_write_word(0x0010, Discharge[1]);

eeprom_write_word(0x0011, Discharge[0]);

}

for (i=0;i<sizeof(a)/sizeof(a[0]);i++)

{

PORTB&=~(1<<i);

for (j=0;j<sizeof(a[i])/sizeof(a[i][0]); j++)

{

if (!(PINA & (1<<j)))

{

switch (a[i][j])

{

case '*':

stop = 1;

isInputed = 0;

break;

case '#':

stop = 0;

isInputed = 0;

break;

case '1':

addNumber(1);

break;

case '2':

addNumber(2);

break;

case '3':

addNumber(3);

break;

case '4':

addNumber(4);

break;

case '5':

addNumber(5);

break;

case '6':

addNumber(6);

break;

case '7':

addNumber(7);

break;

case '8':

addNumber(8);

break;

case '9':

addNumber(9);

break;

case '0':

addNumber(0);

break;

}

}

}

PORTB|=(1<<i);

}

}

}

Соседние файлы в папке Микропроцессорные средства и системы