Ранее я описывал как самому изготовить модуль для Arduino, используя двухразрядный семисегментный светодиодный дисплей и микросхему сдвигового регистра 74hc595 и как управлять им используя 8051-совметимый процессор stc15f104w . В данной статье я покажу, как подключить его к процессору attiny13 используя язык Си и среду разработки Microchip Studio. Данный код без существенных изменений подойдет для других процессоров AVR серий attiny и Atmega.
Краткое описание программы:
Команды #define задают выводы микроконтроллера, к которым подключены пины дисплея (в моем случае Data подключен к PB0, Latch к PB1 и Clock соответственно к выводу PB3 микроконтроллера). При подключении дисплея к другим выводам микроконтроллера нужно соответственно заменить и значения переменных data_pin, latch_pin и clock_pin.
В массиве Num задан знакогенератор дисплея.
Как видно со схемы ниже вместо точки (DP) через резисторы R8 и К9 подключен разряды B и С первой цифры дисплея. Теперь при подаче на DP логической единицы на первой цифре засветится цифра 1, что вместе со значением второй цифры даст число в диапазоне от 10 до 19. Данная хитрость позволила управлять одной микросхемой 74HC595 сразу двумя разрядами дисплея хоть и не полноценно (первый разряд может выводить только цифру «1»).
Таким образом чтоб засветить на дисплее цифру «3» подать число 0xF2, что в двоичном виде значит 11110010 (A-B-C-D-E-F-G-DP). Другими словами, разряды ABCD и G должны быть включены, а остальные выключены:
Код программы приведен ниже. Также его можно скачать по ссылке.
/* * avr_74hc595.c *Индикатор на 74HC595 * Created: 21.07.2023 11:45:33 * ============================================ * H A R D W A R E I N F O R M A T I O N S * ============================================ * Attiny13a ___________ * 1 /____ |8 * o--|RESET Vcc|--o +5V * ADC o--|PB3/ADC3 PB2|--o Key2 * Led2 o--|PB4/ADC2 PB1|--o Key1 * GND o--|GND PB0|--o Led1 ----LED--->+5V * |_____________| * * Author : Vyacheslav */ #define F_CPU 1000000L // Частота для delay.h #include <avr/io.h> #include <util/delay.h> // Задержка в ms #define data_pin PB0 // указывается пин, к которому подключен data 74hc595 #define latch_pin PB1 // указывается пин, к которому подключен latch 74hc595 #define clock_pin PB2 // указывается пин, к которому подключен clock 74hc595 // Массив в котором указано, какие сегменты должны зажигаться // Подробное описание дисплея и его подключение в https://mynobook.blogspot.com/2018/09/74595-7.html // например, в "0" должны светиться сегменты abcdef (0b11111100) int num[21] = { 0xFC, //ob11111100 цифра 0 0x60, //0b01100000 число 1 0xDA, //0b11011010 число 2 0xF2, //0b11110010 число 3 0x66, //0b01100110 число 4 0xB6, //0b10110110 число 5 0xBE, //0b10111110 число 6 0xE0, //0b11100000 число 7 0xFE, //0b11111110 число 8 0xF6, //0b11110110 число 9 0xFD, //0b01100000 число 10 0x61, //0b01100000 число 11 0xDB, //0b11011010 число 12 0xF3, //0b11110010 число 13 0x67, //0b01100110 число 14 0xB7, //0b10110110 число 15 0xBF, //0b10111110 число 16 0xE1, //0b11100000 число 17 0xFF, //0b11111110 число 18 0xF7, //0b11110110 число 19 0x0D, //0b00001101 знак || (Пауза) }; void hc595led(int NumberOnDisplay) { int i; PORTB &= ~ (1 << clock_pin); // Низкий уровень на clock_pin PORTB &= ~ (1 << latch_pin); // Низкий уровень на latch_pin for (i=0; i<=7; i++){ // цикл вывода числа на дисплей if (0 != (num[NumberOnDisplay] & (1 << i))) {PORTB |= (1 << data_pin);} else {PORTB &= ~ (1 << data_pin);}; //Проверка разряда переменной на наличие лог. 1, и включаем (выключаем) сегмент на индикаторе PORTB |= (1 << clock_pin); // Подаеи импульс на clock_pin // _delay_ms(100); PORTB &= ~ (1 << clock_pin); } PORTB |= (1 << latch_pin); } int main(void) { //DDRB = 0b00000000; // Устанавливаем порт DDRB на вход //DDRB |= (1 << data_pin)|(1 << latch_pin)|(1 << clock_pin) ; или уст. пины как выход DDRB |= (1 << data_pin)|(1 << latch_pin)|(1 << clock_pin) ; // уст. пины к которым поднючены data_pin, latch_pin и clock_pin как выходы, остальные как входы hc595led(3); while (1) { for (int a=0; a<=19; a++){ // Вывод на дисплей (перебор) чисел от 1 до 19 hc595led(a); _delay_ms(1000); } } }
Комментариев нет:
Отправить комментарий