понедельник, 7 августа 2023 г.

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

         Ранее я описывал как самому изготовить модуль для Arduino, используя двухразрядный семисегментный светодиодный дисплей и микросхеме сдвигового регистра 74hc595. В данной статье я покажу, как подключить его к 8051-совметимому процессору stc15f104w используя язык Си и среду разработки Keil. Данный код без существенных изменений подойдет для процессоров STC и других (например, at89c2051), которые используют систему команд 8051.

Краткое описание программы:

        Команды sbit задают выводы микроконтроллера, к которым подключены пины дисплея (в моем случае Data подключен к P3^0, Latch к P3^1 и Clock соответственно к выводу P3^2 микроконтроллера). При подключении дисплея к другим выводам микроконтроллера нужно соответственно заменить и значения переменных 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.


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


/*
 * main.c
 * Индикатор на 74HC595
 * Created: 13.07.2023 10:46:31
 *	============================================
 *	H A R D W A R E   I N F O R M A T I O N S	
 *	============================================
 *	STC15F104W 	   ___________
 *			 /                       |8
 *                                 o--|P3.4/RST P3.3|--o 
 *                         +5V o--|Vcc	   P3.2|--o clock_pin
 *                                 o--|P3.5         P3.1|--o latch_pin
 *                       GND o--|GND         P3.0|--o data_pin
 *                                     |________ ___|
 *
 * Author : Vyacheslav
 */ 

#include <reg51.h>		// Порты ввода-вывода 

		sbit data_pin = P3^0;		// указывается пин, к которому подключен data 74hc595
		sbit latch_pin = P3^1;		// указывается пин, к которому подключен latch 74hc595
		sbit clock_pin = P3^2;		// указывается пин, к которому подключен 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 Delay_us(int n)  // Делаем задержку времени
				{
					int x;
					while (n--)
								{
								x = 500;
					while (x--);
								}
				}

void hc595led(int NumberOnDisplay)
{
		int i;
//	latch_pin = 1;
	clock_pin = 0;
	latch_pin = 0;

		 for (i=0; i<=7; i++){  // цикл вывода числа на дисплей
			 
			if (0 != (num[NumberOnDisplay] & (1 << i))) {data_pin = 1;} else {data_pin = 0;};  //Проверка разряда переменной на наличие лог. 1, и включаем (выключаем) сегмент на индикаторе
			clock_pin = 1;
			clock_pin = 0;
			
		 }
	latch_pin =1; 
}

int main(void)
{

	int a;
	
    while (1)					// Повторяем все что ниже
    {
for (a=0; a<=19; a++){  // Вывод на дисплей (перебор) чисел от 1 до 19
	hc595led(a);
	Delay_us(1000);			
    }

		}
	}

        Работающая программа на stc15f104w:



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

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