Микропроцессорные средства и системы / -_5
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ и НАУКИ
КЫРГЫЗСКОЙ РЕСПУБЛИКИ
КЫРГЫЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. И. РАЗЗАКОВА
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
КАФЕДРА «ИНФОРМАТИКА И ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА»
Отчет
По МПС
Лабораторная работа 5
Бишкек 2019
Собрать схему из 5 кнопок и 16 светодиодов. Реализовать гирлянду из 5 режимов
На каждой из кнопок должен быть свой режим 1 должна работать через ШИМ
2 должна работать по прерыванию и 3 остальных режима
#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);
}
}
}
}