Материал: Лабораторная работа №2

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ КЫРГЫЗСКОЙ РЕСПУБЛИКИ

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

УНИВЕРСИТЕТ ИМ. И. РАЗЗАКОВА

Лабораторная работа

Бишкек 2021

Лабораторная работа №2

7. Собрать схему из матричной клавиатуры и светодиодов. Запрограммировать микроконтроллер так, чтобы на клавиатуре можно было выбирать один из 5 режимов светомузыки.

Листинг кода:

#define F_CPU 1000000UL

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>

#define TRUE 1

#define FALSE 0

#define LO(x) ((x) & 0xff)

#define HI(x) ((x) >> 8)

#define LED_DDR_0 DDRC

#define LED_DDR_1 DDRA

#define LED_PORT_0 PORTC

#define LED_PORT_1 PORTA

#define BTN_0 0

#define BTN_1 1

#define BTN_2 2

#define BTN_3 3

#define BTN_4 4

#define BTN_PIN PINB

#define BTN_DDR DDRB

#define BTN_PORT PORTB

#define PWM_DUTY 0xaf

volatile uint32_t num = 0x01;

volatile uint8_t INT0_flag = FALSE;

volatile uint8_t ENA_FLAG = TRUE;

ISR(TIMER2_OVF_vect){

LED_PORT_0 = LO(num);

LED_PORT_1 = HI(num);

}

ISR(TIMER2_COMP_vect){

LED_PORT_0 = 0;

LED_PORT_1 = 0;

}

ISR(INT0_vect){

INT0_flag = TRUE;

}

int main(void){

LED_DDR_0 = 0xff;

LED_DDR_1 = 0xff;

BTN_DDR = 0;

BTN_PORT = 0x1f;

OCR2 = PWM_DUTY;

TIMSK |= 1 << OCIE2 | 1 << TOIE2;

TCCR2 |= 1 << WGM21 | 1 << WGM20;

GICR |= 1 << INT0;

MCUCR = 1 << ISC01;

DDRD = 0 << PD2;

PORTD = 1 << PD2;

GIFR = 1 << INTF0;

sei();

while(1){

if(!(BTN_PIN & (1 << BTN_0)))

{

_delay_ms(300);

num = 0x01;

LED_PORT_0 = 0;

LED_PORT_1 = 0;

SFIOR = 1 << PSR2;

TCCR2 |= 1 << CS21 | 1 << CS20;

while(BTN_PIN == 0x1f && !INT0_flag){

num <<= 1;

num |= 1;

if(num > 0xffff)

num = 0x01;

_delay_ms(200);

}

cli();

TCCR2 &= ~(1 << CS22 | 1 << CS21 | 1 << CS20);

sei();

}

if(!(BTN_PIN & (1 << BTN_1))){

_delay_ms(300);

num = 0x01;

LED_PORT_0 = 0;

LED_PORT_1 = 0;

while(BTN_PIN == 0x1f && !INT0_flag){

LED_PORT_0 = LO(num);

LED_PORT_1 = HI(num);

num <<= 1;

if(num > 0xffff)

num = 0x01;

_delay_ms(200);

}

}

if(!(BTN_PIN & (1 << BTN_3))){

_delay_ms(300);

LED_PORT_0 = 0;

LED_PORT_1 = 0;

if(ENA_FLAG){

ENA_FLAG = FALSE;

LED_PORT_0 = 0xff;

LED_PORT_1 = 0xff;

}else{

ENA_FLAG = TRUE;

LED_PORT_0 = 0;

LED_PORT_1 = 0;

}

}

if(!(BTN_PIN & (1 << BTN_4))){

_delay_ms(300);

num = 0x03;

LED_PORT_0 = 0x3;

LED_PORT_1 = 0;

while(BTN_PIN == 0x1f && !INT0_flag){

LED_PORT_0 = LO(num);

LED_PORT_1 = HI(num);

num <<= 2;

if(num > 0xffff)

num = 0x03;

_delay_ms(400);

}

}

if(INT0_flag){

INT0_flag = FALSE;

num = 0x07;

LED_PORT_0 = 7;

LED_PORT_1 = 0;

while(BTN_PIN == 0x1f && !INT0_flag){

LED_PORT_0 = LO(num);

LED_PORT_1 = HI(num);

num <<= 1;

if(num > 0xffff)

num = 0x07;

_delay_ms(400);

}

}

}

}

Фото результат: