Микропроцессорные средства и системы / -_4
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ и НАУКИ
КЫРГЫЗСКОЙ РЕСПУБЛИКИ
КЫРГЫЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. И. РАЗЗАКОВА
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
КАФЕДРА «ИНФОРМАТИКА И ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА»
Отчет
По микроконтроллерам и микропроцессорам
Лабораторная работа 4
Бишкек 2019
Собрать схему из семисегментного индикатора и 2 кнопок. Запрограммировать
микроконтроллер так, чтобы при нажатии на одну кнопку число на индикаторе
увеличивалось на 1 и также увеличивалась яркость индикатора, а при нажатии на
другую уменьшалось число и яркость.
#define F_CPU 1000000LU
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define DISP_DDR DDRC
#define DISP_PORT PORTC
#define DEF_PWM_DUTY 0x0019 //255(full brightness) / 6(segments) = 42
#define BTN_PORT PORTA
#define BTN_DDR DDRA
#define BTN_PIN PINA
#define BTN0 PINA0
#define BTN1 PINA1
int8_t current_index = 0;
uint8_t seg_array[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
volatile uint8_t current_num = 0; //segment counter - point on current segment
ISR(TIMER2_OVF_vect){
DISP_PORT = current_num;
}
ISR(TIMER2_COMP_vect){
DISP_PORT = 0;
}
int main(void)
{
current_num = seg_array[current_index];
DISP_DDR = 0x7f; //0-7 pins to out
BTN_DDR = 0 << BTN0 | 0 << BTN1;
BTN_PORT = 1 << BTN0 | 1 << BTN1;
TIMSK = 1 << OCIE2 | 1 << TOIE2;
OCR2 = DEF_PWM_DUTY;
TCCR2 = 1 << WGM21 | 1 << WGM20 | 0 << COM21 | 0 << COM20; //fast_PWM, OC2 disconnected
SFIOR = 1 << PSR2; //reset prescalers
TCCR2 = 1 << CS22; //F_CPU/64
asm("SEI");
while (1){
if(current_index > 9){
OCR2 = DEF_PWM_DUTY;
current_index = 0;
current_num = seg_array[current_index];
}
if(current_index < 0){
OCR2 = DEF_PWM_DUTY;
current_index = 9;
current_num = seg_array[current_index];
}
if(BTN_PIN == 0x02){
_delay_ms(200);
OCR2 += DEF_PWM_DUTY;
current_num = seg_array[++current_index];
}
if(BTN_PIN == 0x01){
_delay_ms(200);
OCR2 -= DEF_PWM_DUTY;
current_num = seg_array[--current_index];
}
}
}