Микропроцессорные средства и системы / -_3
.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 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);
}
}
}