вторник, 8 августа 2023 г.

Подключение 74НС595 с 7-ми сегментным светодиодным дисплеем к AVR-микроконтроллеру на примере attiny13

 

        Ранее я описывал как самому изготовить модуль для 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 должны быть включены, а остальные выключены:


 

        Управление дисплеем реализовано в виде функции hc595led(a), где «a» это код числа, который нужно вывести на дисплей. Этот код берется со строки с номером «a» переменной Num.


        Код программы приведен ниже. Также его можно скачать по ссылке.

/*
 * 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);
		}

	}
}

        Данная программа работает как на attiny так и на atmega. Ниже фото с attiny13 и Atmega48:


Комментариев нет:

Отправить комментарий