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