Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
WhatItIs
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
1

Калькулятор на ATmega8

17.05.2014, 15:19. Просмотров 2858. Ответов 7
Метки нет (Все метки)

Доброго дня форумчанам от совсем не профессионала сего дела.
Предупреждение: код более, чем наркоманский.

Задача проста, как 2х2: калькулятор, ATmega8, спецификации - только сложение и только четырёхзначные операнды.

Проблем возникло сразу несколько:
а) Построчный опрос не происходит, т.к. головушка моя пустенькая не понимает, как устроены таймеры и что нужно добавить в коде и где. Т.е., таймеров пока что в данном коде немае.
б) Также моя черепная коробка совсем не поняла, как выводить на экран цифры получившегося числа. Понятно только, что через цикл сей трюк только и делать, а сам трюк у фокусника не выходит.

Прикрепляю огромную дозу кода, которому бы позавидовал помешанный на оптимизации человек (да, оптимизация меня не интересует абсолютно, главное, чтобы работало, звенело и мигало красивенько), на языке C и схему калькулятора (работаю в Proteus и Atmel Studio).

Осторожно, схема!

Схему можно наблюдать вот тут, т.к. картинка что-то не хочет вставляться в виде изображения: - удалено, мне совсем не хочеться идти на какахостинг и рассматривать рекламу -

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#include <avr/io.h>
 
int main(void)
{
    int a[4], b[4], c[4];
    int FC = 0; // Флаг переноса
    // Таймер, реализация - ?
    while(1)
    {
        if (PORTB == 0b1000) // Опрос спроки 1
    {
            if (PORTC == 0b010000) // Опрос столбца 2
            {
                PORTC = 0b000001;
                PORTD = 0b1110000;
                if (a[1] == 0) // Числа четырёхзначные и положительные, есть смысл проверять старший разряд операнда a
                {
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 7;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 7;
                }               
            }
            if (PORTC == 0b001000) // Опрос столбца 3
            {
                PORTC = 0b000001;
                PORTD = 0b1111111;
                if (a[1] == 0)
                {
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 8;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 8;
                }               
            }
            if (PORTC == 0b000100) // Опрос столбца 4
            {
                PORTC = 0b000001;
                PORTD = 0b1111011;
                if (a[1] == 0)
                {                   
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 9;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 9;
                }               
            }
    }
        if (PORTB == 0b0100) // Опрос строки 2
        {
            if (PORTC == 0b010000) // Опрос столбца 2
            {
                PORTC = 0b000001;
                PORTD = 0b0110011;
                if (a[1] == 0)
                {
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 4;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 4;
                }               
            }
            if (PORTC == 0b001000) // Опрос столбца 3
            {
                PORTC = 0b000001;
                PORTD = 0b1011011;
                if (a[1] == 0)
                {           
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 5;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 5;
                }               
            }
            if (PORTC == 0b000100) // Опрос столбца 4
            {
                PORTC = 0b000001;
                PORTD = 0b1011111;
                if (a[1] == 0)
                {
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 6;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 6;
                }               
            }       
        }
        if (PORTB == 0b0010) // Опрос строки 3
        {
            if (PORTC == 0b010000) // Опрос столбца 2
            {
                PORTC = 0b000001;
                PORTD = 0b0110000;
                if (a[1] == 0)
                {
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 1;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 1;
                }               
            }
            if (PORTC == 0b001000) // Опрос столбца 3
            {
                PORTC = 0b000001;
                PORTD = 0b1101101;
                if (a[1] == 0)
                {
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 2;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 2;
                }               
            }
            if (PORTC == 0b000100) // Опрос столбца 4
            {
                PORTC = 0b000001;
                PORTD = 0b1111001;
                if (a[1] == 0)
                {
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = 3;
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 3;
                }               
            }
        }           
            if (PORTC == 0b000010) // Опрос столбца 5, суммирование как таковое
            {
                for (int i = 0; i < 4; i++)
                {
                    c[4-i] = a[4-i] + b[4-i] + FC;
                    if (c[4-i] > 9)
                    {
                        FC = 1;
                        c[4-i] = c[4-i] + 06;
                    }
                    else FC = 0;
                }
                if (FC == 1)
                {
                    PORTC = 0b010000;
                    PORTD = 0b0010101;
                }               
        }
        if (PORTB == 0b0001) // Опрос строки 4
        {
            if (PORTC == 0b010000) // Опрос столбца 2
            {
                if (a[1] == 0)
                {
                    a[1] = a[2];
                    a[2] = a[3];
                    a[3] = a[4];
                    a[4] = a[0];
                }
                else
                {
                    b[1] = b[2];
                    b[2] = b[3];
                    b[3] = b[4];
                    b[4] = 0;
                }
            }
            if (PORTC == 0b000100) // Опрос столбца 4
            {
                for (int i = 1; i <= 4; i++)
                {
                    // Вывод цифр из массива C на табло, реализация - ?
                }
            }
// В повторении случая строки 3 и столбца 5, думаю, нет.        
        }                               
    }
}
Откликнувшимся на эту странную просьбу объявляется огромная, как Советский Союз, благодарность!!!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2014, 15:19
Ответы с готовыми решениями:

Калькулятор на ATMega8
Доброе время суток. Я студент, и мне дали курсовое задания, сделать калькулятор...

Калькулятор на ATMega8
Помогите пожалуйста сделать калькулятор для мк Atmega8 на ассемблере, нужно...

Калькулятор на микроконтроллере atmega8
помогите пожалуйста написать программный код на калькулятор на микроконтроллере...

Разница между ATMEGA8-16AI и ATMEGA8-16AU
Кто подскажет, в чем разница между ATMEGA8-16AI и ATMEGA8-16AU. Смотрю в...

ATMEGA8
Подскажите пожалуйста чем отличаються микроконтролер atmega8 от например етого ...

7
pyzhman
791 / 485 / 66
Регистрация: 15.05.2012
Сообщений: 2,749
17.05.2014, 17:31 2
Лучший ответ Сообщение было отмечено WhatItIs как решение

Решение

C
1
if (PORTB == 0b1000) // Опрос спроки 1
Опрашивать надо PINB.
0
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
17.05.2014, 17:36 3
http://www.cyberforum.ru/microcontrollers/thread1120039.html
Калькулятор на ATMega8
Калькулятор на Atmega16
0
WhatItIs
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
17.05.2014, 18:07  [ТС] 4
Цитата Сообщение от pyzhman Посмотреть сообщение
1
Опрашивать надо PINB.
От я басурманин недоделанный и невнимательный, как десять китайцев, благодарю за сей совет, буду исправлять писанину!

Добавлено через 2 минуты
Цитата Сообщение от raxp Посмотреть сообщение
Калькулятор на МК
Калькулятор на ATMega8
Калькулятор на ATmega16
Глядел я всё это, не понял, почему и обратился. Со второй ссылки вообще списывал пару недель назад, но это не то пальто.

По таймерам бы пару слов замолвили несмышлённому: куда его тут впихнуть-то, в код этот наркоманский? И каким образом?
Период т.н. для опроса строк я высчитал, получилось 6 мс.
0
pyzhman
791 / 485 / 66
Регистрация: 15.05.2012
Сообщений: 2,749
17.05.2014, 18:17 5
Его не надо считать, просто берется порядка 10мсек для борьбы с дребезгом (в реальной клавиатуре, не курсовой ).
А по поводу таймера - инициализировать его и написать подпрограмму обработки прерывания. Всунуть можно в любое место программы, только не в main.
0
WhatItIs
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
17.05.2014, 18:19  [ТС] 6
Цитата Сообщение от pyzhman Посмотреть сообщение
по поводу таймера - инициализировать его и написать подпрограмму обработки прерывания.
Всё, огромное спасибо. Суть понял. Огромная тебе благодарность!
0
pyzhman
791 / 485 / 66
Регистрация: 15.05.2012
Сообщений: 2,749
17.05.2014, 18:22 7
Да и пожалуйста!
В том же обработчике и клаву опросить, и инфу на индикатор можно выводить (если он семисегментный светодиодный многоразрядный).
1
hoff
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 1
07.05.2015, 20:25 8
WhatItIs, не могли бы скинуть проект свой,пожалуйста? передо мной стоит похожая задача
0
07.05.2015, 20:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2015, 20:25

АЦП ATmega8
Доброго времени суток. Написал программу, в которой при выходе из обработчика...

ИЗ Atmega8 на Atmega16U4
Здравствуйте Всем! Прошу помощи, ибо сам не справляюсь. Задумал я в целях...

Atmega8 программирование
Добрый день. Припаял на PD7 ногу светодиод, микроконтроллер ATMEGA8A-PU...


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

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

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