В этом материале будем одной кнопкой переключать цифры на семисегментном индикаторе.
Начнем с алгоритма работы нашей программы!
1. При включении питания на индикаторе светится 0.
2. При первом нажатии на кнопку КН1 переключаем с 0 на 1 .
3. При втором нажатии на кнопку КН1 переключаем с 1 на 2 .
4. При третьем нажатии на кнопку КН1 переключаем с 2 на 3 .
5. При четвертом нажатии на кнопку КН1 переключаем с 3 на 0 , далее цикл повторяется.
Перейдем к написанию программы и рисованию электрической схемы!
1. Создаем новый проект в Atmel Studio 7 по пути File > New > Projec..., выбираем C/C++ и тип проекта GCC C Executable Project, вводим название проекта (Name: и Solution name:).
2. Выбираем тип микроконтроллера с которым будем работать, в нашем случае Atmega8.
Программа нам выдает код в файле main.c*
Приводим его к читабельному виду, удаляем лишние комментарии.
Рисуем электрическую принципиальную схему:
И так схема у нас есть, на ней обозначены микроконтроллер, источник напряжения 5В, к порту PB через токоограничительные резисторы номиналом 300Ом подключен семисегментный индикатор, на порт PD2 кнопка, а также обозначены выводы для подключения программатора, вернемся к программе.
Настроим в программе ножки порта РB на выход, допишем в программе DDRB = 0b11111111;, командой DDRD &= ~(1 << 2); настраиваем ножку порта PD2 на вход, а также строчкой PORTD |= (1 << 2); подтягиваем порт PD2 внутренним резистором к +5в, на который мы подключили кнопку КН1.
С настройкой портов закончили, присвоим директиве #define имя S которое будет хранить данные о задержке на 0,05 секунды. Добавим в программу библиотеку задержек #include <util/delay.h>, для задержки будем использовать функцию _delay_ms(), а также добавим библиотеку прерываний #include <avr/interrupt.h>, далее с помощью оператора #define укажем программе, что наш контроллер будет работать от внутреннего генератора с частой 8МГц допишем в код #define F_CPU 8000000UL.
Добавим массив int puls [10] = {}; - с цифрами от 0 до 9 и переменную int clik=0; - присвоим ей значение 0.
Вот такой получился код:
Теперь займемся вызовом вектора прерывания и его настройкой , допишем в нашу программу вектор прерывания.
В прерывании будем переменную clik увеличивать на 1, после каждого нажатия на кнопку.
Наше прерывание может работать в нескольких режимах, мы будем работать с первым режимом - если низкий уровень на INT0 генерируем запрос прерывания. Выделил его красным.
Допишем в программе
Режимы работы и настройка взяты из datasheet на ATmega8, разрешаем глобальное прерывание командой asm("sei"); - это обязательно, без этой команды работать не будет. В бесконечном цикле с помощью If будем проверять сработало или нет у нас прерывание, в соответствии с срабатываем прерывания будем выдергивать из массива int puls [10] = {}; с цифрами, нужную нам цифру и выводить на индикатор.