Compare commits

...

10 Commits

6 changed files with 406 additions and 4 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
.idea
cmake-buid-debug
# Executables
*.exe

View File

@ -2,8 +2,14 @@
**Терминал**.
Устройство представляет из себя микроконтроллер с клавиатурой (матрица 4 х 4) и подключенное устройство из задания №5. Простейший калькулятор.
# Список участников
**Батухтин Михаил\n**
**Бочкина Кристина\n**
**Уткин Никита\n**
**Хромова Полина\n**
* Батухтин Михаил
* Бочкина Кристина
* Уткин Никита
* Хромова Полина
## Части задачи
- GPIO + GPIO в контексте Atmega328. Pull up, Pull down (Михаил Батухтин/Уткин Никита)
- Физическая реализация клавиатуры (Кристина Бочкина/Полина Хромова)
- SPI интерфейс + SPI у Atmega328 (Кристина Бочкина)
- Программная реализация клавиатуры (Полина Хромова)
- Архитектура ПО (Михаил Батухтин)

204
c_programm Normal file
View File

@ -0,0 +1,204 @@
#include <stdio.h>
#include <stdlib.h>
enum calculator_state
{
NUMBER_FIRST,
NUMBER_SECOND,
RESULT
};
enum calculator_op
{
NO_OP,
ADD,
SUB,
DIV,
MUL
};
struct calculator
{
// 1 число
int num1;
// 2 число
int num2;
// 3 операция
enum calculator_op operation;
// 4 результат
double result;
// 5 состояние атомата
enum calculator_state state;
};
// double calculate(char op, double num1, double num2) {
// double result = 0;
// switch (op) {
// case '+':
// result = num1 + num2;
// break;
// case '-':
// result = num1 - num2;
// break;
// case '*':
// result = num1 * num2;
// break;
// case '/':
// result = num1 / num2;
// break;
// }
// return result;
// }
int main()
{
struct calculator calc;
calc.state = NUMBER_FIRST;
calc.operation = NO_OP;
calc.num1 = 0;
calc.num2 = 0;
calc.result = 0;
char input;
while (1)
{
scanf("%d", &input);
switch (calc.state)
{
case NUMBER_FIRST:
switch (input)
{
case 0:
calc.num1 = (calc.num1 * 10) + 7;
printf("%d",calc.num1);
break;
case 1:
calc.num1 = (calc.num1 * 10) + 8;
break;
case 2:
calc.num1 = (calc.num1 * 10) + 9;
break;
case 3:
calc.operation = DIV;
calc.state = NUMBER_SECOND;
break;
case 4:
calc.num1 = (calc.num1 * 10) + 4;
break;
case 5:
calc.num1 = (calc.num1 * 10) + 5;
break;
case 6:
calc.num1 = (calc.num1 * 10) + 6;
break;
case 7:
calc.operation = MUL;
calc.state = NUMBER_SECOND;
break;
case 8:
calc.num1 = (calc.num1 * 10) + 1;
break;
case 9:
calc.num1 = (calc.num1 * 10) + 2;
case 10:
calc.num1 = (calc.num1 * 10) + 3;
break;
case 11:
calc.operation = SUB;
calc.state = NUMBER_SECOND;
break;
case 12:
calc.num1 = 0;
break;
case 13:
calc.state = NUMBER_FIRST;
calc.operation = NO_OP;
calc.num1 = 0;
calc.num2 = 0;
calc.result = 0;
break;
case 14:
break;
case 15:
calc.operation = ADD;
calc.state = NUMBER_SECOND;
break;
}
case NUMBER_SECOND:
switch (input)
{
case 0:
calc.num2 = (calc.num2 * 10) + 7;
break;
case 1:
calc.num2 = (calc.num2 * 10) + 8;
break;
case 2:
calc.num2 = (calc.num2 * 10) + 9;
break;
case 3:
break;
case 4:
calc.num2 = (calc.num2 * 10) + 4;
break;
case 5:
calc.num2 = (calc.num2 * 10) + 5;
break;
case 6:
calc.num2 = (calc.num2 * 10) + 6;
break;
case 7:
break;
case 8:
calc.num2 = (calc.num2 * 10) + 1;
break;
case 9:
calc.num2 = (calc.num2 * 10) + 2;
case 10:
calc.num2 = (calc.num2 * 10) + 3;
break;
case 11:
break;
case 12:
calc.num2 = 0;
break;
case 13:
calc.state = NUMBER_FIRST;
calc.operation = NO_OP;
calc.num1 = 0;
calc.num2 = 0;
calc.result = 0;
break;
case 14:
calc.state = RESULT;
break;
case 15:
break;
}
case RESULT:
switch (calc.operation)
{
case ADD:
calc.result = calc.num1 + calc.num2;
break;
case SUB:
calc.result = calc.num1 - calc.num2;
break;
case MUL:
calc.result = calc.num1 * calc.num2;
break;
case DIV:
calc.result = calc.num1 / calc.num2;
break;
return calc.result;
}
}
}
return 0;
}

143
calculator.c Normal file
View File

@ -0,0 +1,143 @@
#include <stdio.h>
#include "calculator.h"
void handleCalc(struct calculator *calc, int input) {
switch (calc->state) {
case NUMBER_FIRST:
switch (input) {
case 0:
calc->num1 = (calc->num1 * 10) + 7;
break;
case 1:
calc->num1 = (calc->num1 * 10) + 8;
break;
case 2:
calc->num1 = (calc->num1 * 10) + 9;
break;
case 3:
calc->operation = DIV;
calc->state = NUMBER_SECOND;
break;
case 4:
calc->num1 = (calc->num1 * 10) + 4;
break;
case 5:
calc->num1 = (calc->num1 * 10) + 5;
break;
case 6:
calc->num1 = (calc->num1 * 10) + 6;
break;
case 7:
calc->operation = MUL;
calc->state = NUMBER_SECOND;
break;
case 8:
calc->num1 = (calc->num1 * 10) + 1;
break;
case 9:
calc->num1 = (calc->num1 * 10) + 2;
break;
case 10:
calc->num1 = (calc->num1 * 10) + 3;
break;
case 11:
calc->operation = SUB;
calc->state = NUMBER_SECOND;
break;
case 12:
calc->num1 = (calc->num1 * 10);
break;
case 13:
clearCalc(calc);
break;
case 14:
break;
case 15:
calc->operation = ADD;
calc->state = NUMBER_SECOND;
break;
}
break;
case NUMBER_SECOND:
switch (input) {
case 0:
calc->num2 = (calc->num2 * 10) + 7;
break;
case 1:
calc->num2 = (calc->num2 * 10) + 8;
break;
case 2:
calc->num2 = (calc->num2 * 10) + 9;
break;
case 3:
break;
case 4:
calc->num2 = (calc->num2 * 10) + 4;
break;
case 5:
calc->num2 = (calc->num2 * 10) + 5;
break;
case 6:
calc->num2 = (calc->num2 * 10) + 6;
break;
case 7:
break;
case 8:
calc->num2 = (calc->num2 * 10) + 1;
break;
case 9:
calc->num2 = (calc->num2 * 10) + 2;
break;
case 10:
calc->num2 = (calc->num2 * 10) + 3;
break;
case 11:
break;
case 12:
calc->num2 = (calc->num2 * 10);
break;
case 13:
clearCalc(calc);
break;
case 14:
switch (calc->operation) {
case ADD:
calc->result = calc->num1 + calc->num2;
calc->state = RESULT;
break;
case SUB:
calc->result = calc->num1 - calc->num2;
calc->state = RESULT;
break;
case MUL:
calc->result = calc->num1 * calc->num2;
calc->state = RESULT;
break;
case DIV:
calc->result = calc->num1 / calc->num2;
calc->state = RESULT;
break;
}
break;
case 15:
break;
}
break;
case RESULT:
switch (input) {
case 14:
clearCalc(calc);
break;
}
break;
}
}
void clearCalc(struct calculator* calc) {
calc->state = NUMBER_FIRST;
calc->operation = NO_OP;
calc->num1 = 0;
calc->num2 = 0;
calc->result = 0;
}

32
calculator.h Normal file
View File

@ -0,0 +1,32 @@
#ifndef TESTCALC_MAIN_H
#define TESTCALC_MAIN_H
enum calculator_state {
NUMBER_FIRST,
NUMBER_SECOND,
RESULT
};
enum calculator_op {
NO_OP,
ADD,
SUB,
DIV,
MUL
};
struct calculator {
// 1 число
int num1;
// 2 число
int num2;
// 3 операция
enum calculator_op operation;
// 4 результат
int result;
// 5 состояние атомата
enum calculator_state state;
};
void clearCalc(struct calculator *calc);
void handleCalc(struct calculator *calc, int input);
#endif //TESTCALC_MAIN_H

13
main.c Normal file
View File

@ -0,0 +1,13 @@
#include <stdio.h>
#include "calculator.h"
int main() {
struct calculator calc;
clearCalc(&calc);
int input;
while (1) {
scanf("%d", &input);
handleCalc(&calc, input);
printf("num1: %d | num2: %d | result: %d | operation: %d | state: %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state);
}
}