Перейти к содержанию

Помогите Отладить: Самодельная Библиотека Упр. 7-Сегм. 4-Разр. Индикатором


Рекомендуемые сообщения

динамическая индикация на индикатор (общий анод) используется сдвиговый регистр 74HC595 и arduino nano 328p

проблема в заключается функции indicator7seg4razr::displayMain();

//main.cpp
#include "Indicator7s4razr_registr.h"
indicator7seg4razr indicator; //переменная класса
ISR(TIMER2_OVF_vect)
{
indicator.displayMain();
TCNT0 = 0xFF - 10; // Overflow again after 10 ticks = 10 us
}
String hello = "hello it s me";
void setup() {
// put your setup code here, to run once:
//indicator.displayString(hello,300,true);
indicator.displayNumber(1234);
}
void loop() {
// put your main code here, to run repeatedly:
indicator.displayMain();
}

//******************************************************************
// Name : Indicator7s4razr_registr.h					
// Author : ALEX_45
// Date : 01.02.2016	
// Version : 1.0											
// Notes : Программа использует один сдвиговый регистр 74HC595
//		 : для управления 7сегментным 4рех разрядным индикатором
//******************************************************************
/*	 4-разрядный 7-сегментный индикатор
1 A F 2 3 B
1 A F 2 3 B
____________|__|__|__|__|__|____________
| | | | |
| A | A | A | A |
| F B | F B | F B | F B |
| G | G | G | G |
| E C | E C | E C | E C |
| D dp| D dp| D dp| D dp|
|_________|_________|_________|_________|
| | | | | |
E D dp C G 4
74HC595 Map:
 _______					 PINS 15, 1-7 Q0 - Q7 Output Pins
Q1 |1 * 16| Vcc				 PIN 8		 GND	 Ground, Vss
Q2 |2 15| Q0				 PIN 9		 Q7"	 Serial Out
Q3 |3 14| DS				 PIN 10		 MR	 Master Reclear, active low
Q4 |4 13| OE				 PIN 11		 SH_CP	 Shift register clock pin
Q5 |5 12| ST_CP			 PIN 12		 ST_CP	 Storage register clock pin (latch pin)
Q6 |6 11| SH_CP			 PIN 13		 OE	 Output enable, active low
Q7 |7 10| MR				 PIN 14		 DS	 Serial data input
GND |8_____9| Q7"				 PIN 16		 Vcc	 Positive supply voltage
*/
/****|добавить в код main.cpp:|**********************************
indicator7seg4razr indicator; //переменная класса
ISR(TIMER2_OVF_vect)
{
indicator.display();
TCNT0 = 0xFF - 10; // Overflow again after 10 ticks = 10 us
}
*****************************************************************/
#ifndef _7segm4razr_Indicator&registr_H_
#define _7segm4razr_Indicator&registr_H_
#define A 0// Segment A
#define B 1// Segment B
#define C 2// Segment C
#define D 3// Segment D
#define E 4// Segment E
#define F 5// Segment F
#define G 6// Segment G
#define DP 7// Segment DP
class indicator7seg4razr{
private:
 byte lockPin = 8;					 //Пин подключен к ST_CP входу 74HC595
 byte clockPin = 12;					 //Пин подключен к SH_CP входу 74HC595
 byte dataPin = 11;					 //Пин подключен к DS входу 74HC595
 byte segmentPins[4] = {3,5,6,9};	 //Пины разрядов индикатора {1,2,3,4}
 volatile byte display[4] = {255,255,255,255}; //переменная хранящая вывод на дисплей

 byte get_segments(char symvol);		 //получает вывод на сегменты из символа
public:
		 indicator7seg4razr();									 //конструктор-настройщик
 void displayMain();											 //выводит display[4] должна крутится в таймере
 void displayClear();										 //Очищает дисплей

 void displayChar(char simvol,byte pos);					 //выводит символ в позицию 1-4
 void displayString(String str,int zaderjka,bool fromRight); //выводит строку; задержка между символами; с права или слева
 void displayNumber(int number);								 //выводит число 0-9999
 void addDot(byte pos);										 //добавляет точку в позицию 1-4

 void displayTime(byte hour,byte minutes,byte seconds);		 //выводит время должна быть в цикле
 void displayDate(byte date,byte mounth);					 //выводит датту
 void displayYear(int year);									 //выводит год

 void displayZmeika(byte pos,int zaderjka);			 //выводит бегающюю змейку в позицию 1-4; zaderjka - задержка перемещения


};
#endif // _7segm4razr_Indicator&registr_H_

//****************************************************************
// Name : Indicator7s4razr_registr.cpp
// Author : ALEX_45
// Date : 01.02.2016
// Version : 1.0
// Notes : Программа использует один сдвиговый регистр 74HC595
//		 : для на сегментный 4рех разрядный индикатор
//****************************************************************
#include "Arduino.h"
#include "String.h"
//using namespace std;
#include "Indicator7s4razr_registr.h"
byte indicator7seg4razr::get_segments(char symvol) {
byte segments = 0;
switch (symvol) {
case 0:
case '0':
case 'O':
 segments = (1 << A) | (1 <<  | (1 << C) | (1 << D) | (1 << E) | (1 << F);
 break;
case 1:
case '1':
case 'l':
 segments = (1 <<  | (1 << C);
 break;
case 2:
case '2':
 segments = (1 << A) | (1 <<  | (1 << D) | (1 << E) | (1 << G);
 break;
case 3:
case '3':
 segments = (1 << A) | (1 <<  | (1 << C) | (1 << D) | (1 << G);
 break;
case 4:
case '4':
 segments = (1 <<  | (1 << C) | (1 << F) | (1 << G);
 break;
case 5:
case '5':
case 'S':
case 's':
 segments = (1 << A) | (1 << C) | (1 << D) | (1 << F) | (1 << G);
 break;
case 6:
case '6':
 segments = (1 << A) | (1 << C) | (1 << D) | (1 << E) | (1 << F) | (1 << G);
 break;
case 7:
case '7':
 segments = (1 << A) | (1 <<  | (1 << C);
 break;
case 8:
case '8':
 segments = (1 << A) | (1 <<  | (1 << C) | (1 << D) | (1 << E) | (1 << F) | (1 << G);
 break;
case 9:
case '9':
case 'g':
 segments = (1 << A) | (1 <<  | (1 << C) | (1 << D) | (1 << F) | (1 << G);
 break;
case 10:
case 'A':
case 'a':
 segments = (1 << A) | (1 <<  | (1 << C) | (1 << E) | (1 << F) | (1 << G);
 break;
case 11:
case 'B':
case 'b':
 segments = (1 << C) | (1 << D) | (1 << E) | (1 << F) | (1 << G);
 break;
case 12:
case 'C':
 segments = (1 << A) | (1 << D) | (1 << E) | (1 << F);
 break;
case 'c':
 segments = (1 << D) | (1 << E) | (1 << G);
 break;
case 13:
case 'D':
case 'd':
 segments = (1 <<  | (1 << C) | (1 << D) | (1 << E) | (1 << G);
 break;
case 14:
case 'E':
 segments = (1 << A) | (1 << D) | (1 << E) | (1 << F) | (1 << G);
 break;
case 'e':
 segments = (1 << A) | (1 <<  | (1 << D) | (1 << E) | (1 << F) | (1 << G);
 break;
case 15:
case 'F':
case 'f':
 segments = (1 << A) | (1 << E) | (1 << F) | (1 << G);
 break;
case 'G':
 segments = (1 << A) | (1 << C) | (1 << D) | (1 << E) | (1 << F);
 break;
case 'H':
case 'x':
case 'X':
 segments = (1 <<  | (1 << C) | (1 << E) | (1 << F) | (1 << G);
 break;
case 'h':
 segments = (1 << C) | (1 << E) | (1 << F) | (1 << G);
 break;
case 'I':
case 'i':
 segments = (1 <<  | (1 << C);
 break;
case 'J':
case 'j':
 segments = (1 <<  | (1 << C) | (1 << D) | (1 << E);
 break;
case 'L':
 segments = (1 << D) | (1 << E) | (1 << F);
 break;
case 'M':
case 'm':
 segments = (1 << A) | (1 << C) | (1 << E) | (1 << G);
 break;
case 'N':
case 'n':
 segments = (1 << C) | (1 << E) | (1 << G);
 break;
case 'o':
 segments = (1 << C) | (1 << D) | (1 << E) | (1 << G);
 break;
case 'P':
case 'p':
 segments = (1 << A) | (1 <<  | (1 << E) | (1 << F) | (1 << G);
 break;
case 'Q':
case 'q':
 segments = (1 << A) | (1 <<  | (1 << C) | (1 << F) | (1 << G);
 break;
case 'R':
case 'r':
 segments = (1 << E) | (1 << G);
 break;
case 'T':
case 't':
 segments = (1 << D) | (1 << E) | (1 << F) | (1 << G);
 break;
case 'U':
 segments = (1 <<  | (1 << C) | (1 << D) | (1 << E) | (1 << F);
 break;
case 'u':
case 'v':
 segments = (1 << C) | (1 << D) | (1 << E);
 break;
case 'V':
 segments = (1 << A) | (1 << C) | (1 << D) | (1 << E);
 break;
case 'W':
case 'w':
 segments = (1 << A) | (1 << C) | (1 << D) | (1 << E);
 break;
case 'Y':
case 'y':
 segments = (1 <<  | (1 << C) | (1 << D) | (1 << F) | (1 << G);
 break;
case '-':
 segments = (1 << G);
 break;
case '"':
 segments = (1 <<  | (1 << F);
 break;
case 0x27: // "'"
 segments = (1 << ;
 break;
case '_':
 segments = (1 << D);
 break;
case '.':
case ',':
 segments = (1 << DP);
 break;
case '!':
 segments = (1 << DP) | (1 <<  | (1 << C);
 break;
case ' ':
default:
 segments = 0;
 break;
}
return segments;
}
indicator7seg4razr::indicator7seg4razr() { //конструктор-настройщик
//устанавливаем режим OUTPUT
pinMode(lockPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
for(byte i = 1;i<4;i++){
pinMode(segmentPins[i],OUTPUT);
}
//sei(); // Enable interrupts
// Inititalize timer for multiplexing
TCCR2B = (1 << CS22)|(1 << CS21)/*|(1 << CS20)*/;
TIMSK2 |= (1 << TOIE2); // Enable Overflow Interrupt Enable
TCNT2 = 0; // Initialize counter
}
void indicator7seg4razr::displayMain() {
for (int i = 0; i <4; i++) {
digitalWrite(segmentPins[0], LOW);
digitalWrite(segmentPins[1], LOW);
digitalWrite(segmentPins[2], LOW);
digitalWrite(segmentPins[3], LOW);
digitalWrite(segmentPins[i], HIGH);//+ 7сегментного индикатора i-го разряда
digitalWrite(lockPin, LOW);// устанавливаем синхронизацию "защелки" на LOW
shiftOut(dataPin, clockPin, MSBFIRST, ~display[i]);// передаем последовательно на dataPin
digitalWrite(lockPin, HIGH);//"защелкиваем" регистр, тем самым устанавливая значения на выходах

}
}
void indicator7seg4razr::displayChar(char simvol, byte pos = 4) {
display[pos - 1] = get_segments(simvol);
}
void indicator7seg4razr::displayString(String str, int zaderjka = 300, bool fromRight = true) {
if (fromRight) {
for (int i = 0, end = str.length() - 1; i != (end - 3); i++) {
 display[0] = display[1];
 display[1] = display[2];
 display[2] = display[3];
 display[3] = get_segments(str.charAt(i));
 delay(zaderjka);
 display[0] = display[1];
 display[1] = display[2];
 display[2] = display[3];
 display[3] = get_segments(str.charAt(i + 1));
 delay(zaderjka);
 display[0] = display[1];
 display[1] = display[2];
 display[2] = display[3];
 display[3] = get_segments(str.charAt(i + 2));
 delay(zaderjka);
 display[0] = display[1];
 display[1] = display[2];
 display[2] = display[3];
 display[3] = get_segments(str.charAt(i + 3));
 delay(zaderjka);
}
} else {
for (int i = str.length() - 1, end = 0; i != (end + 3); i--) {
 display[3] = display[2];
 display[2] = display[1];
 display[1] = display[0];
 display[0] = get_segments(str.charAt(i));
 delay(zaderjka);
 display[3] = display[2];
 display[2] = display[1];
 display[1] = display[0];
 display[0] = get_segments(str.charAt(i + 1));
 delay(zaderjka);
 display[3] = display[2];
 display[2] = display[1];
 display[1] = display[0];
 display[0] = get_segments(str.charAt(i + 2));
 delay(zaderjka);
 display[3] = display[2];
 display[2] = display[1];
 display[1] = display[0];
 display[0] = get_segments(str.charAt(i + 3));
 delay(zaderjka);
}
}
}
void indicator7seg4razr::displayNumber(int number) {
display[3] = get_segments(number % 10);
number /= 10;
display[2] = get_segments(number % 10);
number /= 10;
display[1] = get_segments(number % 10);
number /= 10;
display[0] = get_segments(number % 10);
}
void indicator7seg4razr::displayTime(byte hour, byte minutes, byte seconds) {
displayNumber((hour * 100) + minutes);
if (seconds % 2) display[1] |= (1 << DP); //точка раз в секунду
else		 display[1] &= ~(1 << DP);
}
void indicator7seg4razr::displayDate(byte date, byte mounth) {
displayNumber((date * 100) + mounth);
display[1] |= (1 << DP);
display[3] |= (1 << DP);
}
void indicator7seg4razr::displayYear(int year) {
displayNumber(year);
display[3] |= (1 << DP);
}
void indicator7seg4razr::addDot(byte pos) {
display[pos - 1] |= (1 << DP);
}
void indicator7seg4razr::displayClear() {
for (byte i = 1; i < 4; i++) {
display[i] = 0;
}
}
void indicator7seg4razr::displayZmeika(byte pos, int zaderjka = 300) {
display[pos - 1] = (1 << A) | (1 <<  | (1 << F);
delay(zaderjka);
display[pos - 1] = (1 << A) | (1 <<  | (1 << G);
delay(zaderjka);
display[pos - 1] = (1 <<  | (1 << G) | (1 << E);
delay(zaderjka);
display[pos - 1] = (1 << G) | (1 << E) | (1 << D) | (1 << DP);
}

Изменено пользователем ALEX__45
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

блин, а что так сложно-то?...

я ничего не понял в плане алгоритма!

сперва опишите словами, потом начинайте кодить

это делается в несколько строк!

я не пишу в среде Ардуино, но, надеюсь, алгоритм поймёте:

Hc595_clock Alias Portc.1 : Config Hc595_clock = Output	 ' Входы управления сдвигового регистра 75HC595
Hc595_load Alias Portd.4 : Config Hc595_load = Output	 '
Hc595_data Alias Portc.0 : Config Hc595_data = Output	 '

Segm7_1 Alias Portb.3 : Config Segm7_1 = Output ' 1 разряд 7-сегментного индикатора
Segm7_2 Alias Portb.2 : Config Segm7_2 = Output ' 2 разряд 7-сегментного индикатора
Segm7_3 Alias Portb.1 : Config Segm7_3 = Output ' 3 разряд 7-сегментного индикатора
Segm7_4 Alias Portb.0 : Config Segm7_4 = Output ' 4 разряд 7-сегментного индикатора
Segm7_5 Alias Portb.5 : Config Segm7_5 = Output ' 5 разряд 7-сегментного индикатора
Segm7_6 Alias Portd.7 : Config Segm7_6 = Output ' 6 разряд 7-сегментного индикатора
Segm7_7 Alias Portc.5 : Config Segm7_7 = Output ' 7 разряд 7-сегментного индикатора
Segm7_8 Alias Portc.3 : Config Segm7_8 = Output ' 8 разряд 7-сегментного индикатора
Segm7_9 Alias Portc.2 : Config Segm7_9 = Output ' 9 разряд 7-сегментного индикатора
Const Indikator_delay = 1

Restore Data_7segm_led : Data_1 = Lookup(digits, Data_prn) 



' ============	 Выводим на 7-сегм. индикатор ==========
Shiftout Hc595_data , Hc595_clock , Data_prn , 3 , 8 , 5
Hc595_load = 1 : Nop : Hc595_load = 0
Segm7_1 = 1								 ' Включаем 1 индикатор
Waitms Indikator_delay
Segm7_1 = 0								 ' Включаем 1 индикатор



Data_7segm_led:
  Data &B_1111_1100							  ' 0
  Data &B_0110_0000							  ' 1
  Data &B_1101_1010							  ' 2
  Data &B_1111_0010							  ' 3
  Data &B_0110_0110							  ' 4
  Data &B_1011_0110							  ' 5
  Data &B_1011_1110							  ' 6
  Data &B_1110_0000							  ' 7
  Data &B_1111_1110							  ' 8
  Data &B_1111_0110							  ' 9


Изменено пользователем Гость
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

ну во первых это библиотека, она использует таймер 2 atmega328p для генерации прерываний в которых по идее на индикатор выводится символы из массива display[4] при этом главный цикл свободен для других действий

проблема в заключается функции indicator7seg4razr::displayMain(); помогите правильно переписать также возможно нужно перенастроить таймер по другому

post-198072-0-93657500-1454524303_thumb.png

попробовал сделать так (поставил аноды на 4-7 ноги):

void indicator7seg4razr::displayMain() {
 for (int i = 0; i <4; i++) {
//    digitalWrite(segmentPins[0], LOW);
//    digitalWrite(segmentPins[1], LOW);
//    digitalWrite(segmentPins[2], LOW);
//    digitalWrite(segmentPins[3], LOW);
//    digitalWrite(segmentPins[i], HIGH);//+ 7сегментного индикатора i-го разряда
     digitalWrite(lockPin, LOW);// устанавливаем синхронизацию "защелки" на LOW
  PORTD &= 0b00001111;
  PORTD &= ~(1<<(i+4));
  shiftOut(dataPin, clockPin, MSBFIRST, ~display[i]);// передаем последовательно на dataPin
     digitalWrite(lockPin, HIGH);//"защелкиваем" регистр, тем самым устанавливая значения на выходах
  PORTD &=  (1<<(i+4));
 }
}

экран воще не горит

Изменено пользователем ALEX__45
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...