Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 11
1

Двоичный счетчик(декремент)

30.10.2018, 22:34. Просмотров 1907. Ответов 4
Метки нет (Все метки)

Приветствую. с этой темы https://www.cyberforum.ru/csha... 42967.html меня отправили сюда.
Прошу помощи, нужна программа которая показывает визуально работу этого счетчика "декрементный двоичный счетчик".
0
Миниатюры
Двоичный счетчик(декремент)  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2018, 22:34
Ответы с готовыми решениями:

Двоичный счетчик(декремент)
Приветствую. Прошу помощи скинуть код для декрементного двоичного счетчика.

Двоичный счетчик
Требуется написать 16-разрядный счетчик двоичных чисел. Т.е. вводишь двоичное число - и получаешь...

4-разрядный двоичный счётчик
Синтезировать на Т-триггерах 4-разрядный вычитающий двоичный счётчик с последовательным переносом и...

Двоичный счетчик на Си для atmega16
Нужно построить в avr studio на Си программу для atmega16. Суть программы заключается в...

4
546 / 353 / 152
Регистрация: 08.10.2018
Сообщений: 1,180
Записей в блоге: 11
31.10.2018, 10:38 2
Лучший ответ Сообщение было отмечено dessed как решение

Решение

dessed, задачка поддалась...
Сначала определим класс D-триггера:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/// <summary>
/// D-триггер
/// </summary>
public class DataTrigger : INotifyPropertyChanged
{
    // внутренее состояние
    private bool _state;
 
    // номер бита
    public int Bit { get; set; }
 
    // ссылка на триггер следующей ступени
    public DataTrigger Next { get; set; }
 
    // вход данных D-триггера
    public bool Data
    {
        internal get; 
        set;
    }
 
    // вход строба D-триггера
    public bool DoCountStep
    {
        set
        {
            if (!value) return;
            _state = Data;
            NotQ = Q = _state;
        }
    }
 
    // прямой выход D-триггера
    public bool Q 
    {
        get { return _state; }
        private set
        {
            _state = value;
            OnPropertyChanged("Q");
        }
    }
 
    // инверсный выход D-триггера
    public bool NotQ
    {
        get { return !_state; }
        private set
        {
            _state = value;
            OnPropertyChanged("NotQ");
        }
    }
 
    // сброс D-триггера
    public void Reset()
    {
        Q = NotQ = Data = _state = false;
    }
 
    // установкаD-триггера
    public void Set()
    {
        Q = NotQ = Data = _state = true;
    }
 
    // событие изменения значений выходов D-триггера
    public event PropertyChangedEventHandler PropertyChanged;
 
    [Annotations.NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

Потом определим класс декрементного счётчика, состоящего из 4-х D-триггеров:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/// <summary>
/// Дискретный вычитающий счётчик
/// </summary>
public class DecCounter : INotifyPropertyChanged
{
    // внутренние D-триггеры для хранения состояний
    private readonly DataTrigger[] _dataTrig;
 
    // конструктор
    public DecCounter()
    {
        // создаём массив D-триггеров
        _dataTrig = new DataTrigger[4];
        // создаём каждый D-триггер в массива и присваиваем его рабочий бит
        for (var i = 0; i < _dataTrig.Length; i++)
            _dataTrig[i] = new DataTrigger() {Bit = i};
        // для созданных триггеров определяем событие и
        // связанную работу триггеров для вычитания
        for (var i = 0; i < _dataTrig.Length; i++)
        {
            _dataTrig[i].PropertyChanged += (sender, args) =>
                {
                    // событие вызвал этот триггер
                    var dt = (DataTrigger) sender;
                    // есть два выхода триггера: Q и неQ
                    switch (args.PropertyName)
                    {
                        case "Q":
                            // если есть следующий триггер,
                            // то передаем ему с прямого выхода этого триггера
                            // на его счетный вход
                            if (dt.Next != null)
                                dt.Next.DoCountStep = dt.Q;
                            // создаём оповещение, что выход изменился
                            OnPropertyChanged("Q" + dt.Bit);
                            break;
                        case "NotQ":
                            // заводим инверсию с инверсного выхода на вход данных 
                            // этого же триггера
                            dt.Data = dt.NotQ;
                            break;
                    }
                };
            // здесь дприсваиваем ссылки на следующий триггер в цепочке
            if (i < _dataTrig.Length - 1)
                _dataTrig[i].Next = _dataTrig[i + 1];
        }
    }
 
    // метод для установки всех выходов счётчика
    public void Set()
    {
        foreach (var dt in _dataTrig)
            dt.Set();
    }
 
    // метод для сброса всех выходов счётчика
    public void Reset()
    {
        foreach (var dt in _dataTrig)
            dt.Reset();
    }
 
    // метод для одного шага счёта
    public void DoCountStep()
    {
        _dataTrig[0].DoCountStep = true;
    }
 
    // выход 0 счётчика
    public bool Q0
    {
        get { return _dataTrig[0].Q; }
    }
 
    // выход 1 счётчика
    public bool Q1
    {
        get { return _dataTrig[1].Q; }
    }
 
    // выход 2 счётчика
    public bool Q2
    {
        get { return _dataTrig[2].Q; }
    }
 
    // выход 3 счётчика
    public bool Q3
    {
        get { return _dataTrig[3].Q; }
    }
 
    // событие изменения состояния выходов счётчика
    public event PropertyChangedEventHandler PropertyChanged;
 
    [Annotations.NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

Теперь использование счетчика:
Создадим локальную переменную счётчика:
C#
1
private readonly DecCounter _counter;
В конструкторе формы, после InitializeComponent() создадим объект счётчика и
подключим обработчик изменения значений выходов счётчика:
C#
1
2
_counter = new DecCounter();
_counter.PropertyChanged += Counter_PropertyChanged;
В обработчике события запишем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Counter_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "Q0":
            checkBox1.Checked = _counter.Q0;
            break;
        case "Q1":
            checkBox2.Checked = _counter.Q1;
            break;
        case "Q2":
            checkBox3.Checked = _counter.Q2;
            break;
        case "Q3":
            checkBox4.Checked = _counter.Q3;
            break;
    }
}
Предполагается, что чекбоксы означают выходы счётчика,
checkBox1 - младший разряд, checkBox4 - старший разряд.
Разместим кнопку "Установка" для установки всех разрядов счетчика:
C#
1
2
3
4
private void buttonSetCounter_Click(object sender, EventArgs e)
{
    _counter.Set();
}
и кнопку "Шаг", для пошагового вычитания:
C#
1
2
3
4
private void buttonStep_Click(object sender, EventArgs e)
{
    _counter.DoCountStep();
}
Вуаля! Нажимаем кнопочку "Шаг" и наблюдаем смену галочек чекбоксов.
2
177 / 151 / 31
Регистрация: 28.09.2018
Сообщений: 204
31.10.2018, 11:43 3
ashsvis, красиво ))

Но тут далеко не факт, что требовалась реализация на столь низком уровне.
а то может достаточно что-то типа такого :

C#
1
2
3
4
5
6
7
            Counter--;
            if (Counter < 0) Counter = 15;
            BitArray bitArr = new BitArray(BitConverter.GetBytes(Counter));
            bool Q0 = bitArr[0];
            bool Q1 = bitArr[1];
            bool Q2 = bitArr[2];
            bool Q3 = bitArr[3];
2
546 / 353 / 152
Регистрация: 08.10.2018
Сообщений: 1,180
Записей в блоге: 11
31.10.2018, 12:43 4
Лучший ответ Сообщение было отмечено dessed как решение

Решение

Вот исходники и скомпилированный пример для этого счётчика,
кому интересно: DecrementCounter.7z
1
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 11
31.10.2018, 14:43  [ТС] 5
ashsvis Благодарствую!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.10.2018, 14:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подскажите 16-20 разрядный двоичный счетчик...
Подумываю над изготовлением устройства захвата для осцилографа.. входная цепь пока простая до АЦП...

Описать класс, реализующий двоичный счетчик
Всем привет! Никак не могу написать программу на C# по данному условию, помогите! Условие: Описать...

Машина Тьюринга: Двоичный суммирующий счётчик
Пожалуйста, помогите написать программу для машины Тьюринга, реализующую двоичный суммирующий...

8 разрядный двоичный счетчик 200МГц считать будет успевать?
Добрый день уважаемые! собсно сабж. вобщем нужно ~200МГц частоту померить с точностью до 1Гц....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.