Author SHA1 Message Date
stud126184 e92c73260d Загрузил(а) файлы в '' 2023-05-25 13:50:06 +00:00
stud126184 8dc104ed91 Удалить 'calc.c' 2023-05-25 13:48:56 +00:00
stud126184 fbe148d487 c 2023-05-22 13:12:36 +00:00
stud126184 b2e4931c15 Создал(а) 'c_programm' 2023-05-13 12:27:49 +00:00
stud126184 364fb988e6 Изменил(а) на 'README.md' 2023-05-11 12:12:31 +00:00
7 changed files with 392 additions and 403 deletions
-279
View File
@@ -1,279 +0,0 @@
#include <avr/interrupt.h>
#include <avr/io.h>
#define SPI_PORTX PORTB
#define SPI_DDRX DDRB
#define SPI_MISO 4
#define SPI_MOSI 3
#define SPI_SCK 5
#define SPI_SS 2
enum calculator_state
{
NUMBER_FIRST,
NUMBER_SECOND,
RESULT
};
enum calculator_op
{
NO_OP, //0
ADD, // 1
SUB,
DIV,
MUL
};
struct calculator
{
// 1 число
int num1;
// 2 число
int num2;
// 3 операция
enum calculator_op operation;
// 4 результат
double result;
// 5 состояние атомата
enum calculator_state state;
};
void output_on_display(struct calculator * calc) {
char buffer[8];
switch (state) {
case NUMBER_FIRST:
size_t b_size = display_all_clear(0, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
//первое число
char[12] string_num;
itoa(calc.num1, &string_num, 10);
b_size = display_add_simbol(&string_num, strlen(string_num), &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
case NUMBER_SECOND:
size_t b_size = display_all_clear(0, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
//первое число
b_size = display_add_simbol(&string_num, strlen(string_num), &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
// операция
switch (calc.operation) {
case NO_OP:
break;
case ADD:
b_size = display_add_simbol("+", 1, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
case SUB:
b_size = display_add_simbol("-", 1, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
case DIV:
b_size = display_add_simbol("/", 1, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
case MUL:
b_size = display_add_simbol("*", 1, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
}
// второе число
char[12] string_num;
itoa(calc.num2, &string_num, 10);
b_size = display_add_simbol(&string_num, strlen(string_num), &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
case RESULT:
size_t b_size = display_all_clear(0, size_buffer);
SPI_MasterTransmit(&buffer[0], b_size);
// первое число
b_size = display_add_simbol(&string_num, strlen(string_num), &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
// операция
switch (calc.operation) {
case NO_OP:
break;
case ADD:
b_size = display_add_simbol("+", 1, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
case SUB:
b_size = display_add_simbol("-", 1, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
case DIV:
b_size = display_add_simbol("/", 1, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
case MUL:
b_size = display_add_simbol("*", 1, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
}
// второе число
b_size = display_add_simbol(&string_num, strlen(string_num), &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
// линия
b_size = display_draw_line( , , , , 0, &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
// результат
char[12] string_num;
itoa(calc.result, &string_num, 10);
b_size = display_add_simbol(&string_num, strlen(string_num), &buffer[0]);
SPI_MasterTransmit(&buffer[0], b_size);
break;
default:
display_all_clear(0, size_buffer);
}
}
void SPI_MasterInit(void)
{
/* Настройка MOSI и SCK как выход,
все остальные сигналы как вход: */
SPI_DDRX = (1 << SPI_MOSI) | (1 << SPI_SCK) | (1 << SPI_SS) | (0 << SPI_MISO);
/* Разрешить работу SPI, режим Master,
установить скорость тактов fck/16: */
SPCR = (1 << SPE) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (1 << SPR0);
SPI_PORTX |= (1 << SPI_SS);
}
void SPI_MasterTransmit(char* buffer, size_t length)
{
SPI_PORTX &= ~(1 << SPI_SS);
for (int i = 0; i < length; i++ ) {
SPDR = buffer[i];
while (!(SPSR & (1 << SPIF)));
Serial.println("Transmitede");
delay(2000);
}
SPI_PORTX |= (1 << SPI_SS);
}
byte crc8(byte *data, int length) {
byte crc = 0x00;
byte poly = 0x07; //полином для CRC
for (int i = 0; i < length - 2; i++) {
crc ^= data[i]; //XOR текущего байта с CRC
for (int j = 0; j < length; j++) {
if (crc & 0x80) { //если старший бит CRC равен 1
crc = (crc << 1) ^ poly; //сдвигаем CRC на 1 бит влево и XOR с полиномом
} else {
crc <<= 1; //иначе просто сдвигаем на 1 бит влево
}
}
}
return crc;
}
void setup() {
SPI_MasterInit();
Serial.begin(9600);
Serial.println("Arduino 1 starded");
}
void loop() {
char buffer[] = {'a', 't', 'g', '1', 0};
for (int y = 5; y < 21; y++) {
// buffer[0] = 0x06;
// buffer[1] = 3;
// buffer[2] = y;
// buffer[3] = 0x01;
// buffer[4] = crc8(&buffer[0], 4);
SPI_MasterTransmit(&buffer[0], 5);
}
}
//очищение экранa
size_t display_all_clear(char color, uint8_t* buffer, size_t *size_b) {
buffer[0] = 0x01;
buffer[1] = color;
buffer[2] = crc8(&buffer[0], 2);
// int a[17];
// size_t n = sizeof(a) / sizeof(a[0]);
return 3;
}
//выбор точки
size_t display_set_page(char point, uint8_t* buffer) {
buffer[0] = 0x02;
buffer[1] = point;
buffer[2] = crc8(&buffer[0], 2);
return 3;
}
//добавление нового символа и его параметров
size_t display_add_simbol(char* str, size_t str_len, uint8_t* buffer) {
size_t idx;
buffer[idx] = 0x04;
idx++;
for (int i = 0; i < str_len; i++) {
buffer[idx] = str;
idx++;
}
buffer[idx] = crc8(&buffer[0], idx);
idx++;
return idx;
}
//удаление символа и его параметров
size_t display_del_simbol(char number, uint8_t* buffer) {
buffer[0] = 0x05;
buffer[1] = number;
buffer[2] = crc8(&buffer[0], 2);
return 3;
}
//закрашивание пикселя
size_t display_draw_pixel(char x, char y, char color, uint8_t* buffer) {
buffer[0] = 0x06;
buffer[1] = x;
buffer[2] = y;
buffer[3] = color;
buffer[4] = crc8(&buffer[0], 4);
return 5;
}
//рисует линию
size_t display_draw_line(char x1, char y1, char x2, char y2, char color, uint8_t* buffer) {
buffer[0] = 0x07;
buffer[1] = x1;
buffer[2] = y1;
buffer[3] = x2;
buffer[4] = y2;
buffer[5] = color;
buffer[6] = crc8(&buffer[0], 6);
return 7;
}
//рисует круг
size_t display_draw_circle(char x, char y, char r, char color, uint8_t* buffer) {
buffer[0] = 0x08;
buffer[1] = x;
buffer[2] = y;
buffer[3] = r;
buffer[4] = color;
buffer[5] = crc8(&buffer[0], 5);
return 6;
}
//рисует прямоугольник
size_t display_draw_rectangle(char x, char y, char height, char width, char color, uint8_t* buffer) {
buffer[0] = 0x09;
buffer[1] = x;
buffer[2] = y;
buffer[3] = height;
buffer[4] = widht;
buffer[5] = color;
buffer[6] = crc8(&buffer[0], 6);
return 7;
}
+204
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
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
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
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);
}
}
-39
View File
@@ -1,39 +0,0 @@
#include <avr/io.h>
#include <util/delay.h>
#define SPI_MISO 5
#define SPI_PORTX PORTB
#define SPI_DDRX DDRB
void SPI_SlaveInit(void)
{
/* Настройка ножки порта MISO как выход,
все остальные сигналы как вход: */
SPI_DDRX = (1 << SPI_MISO);
/* Разрешить работу SPI: */
SPCR = (1 << SPE);
}
char SPI_SlaveReceive(void)
{
/* Ожидание завершения приема: */
while(!(SPSR & (1 << SPIF)));
/* Чтение принятых данных и возврат: */
return SPDR;
}
void setup() {
SPI_SlaveInit();
Serial.begin(9600);
Serial.println("Arduino 2 started");
}
void loop() {
SPDR = 0;
char str[2];
str[0] = SPI_SlaveReceive(); // Прием данных
str[1] = '\n';
Serial.println(str);
}
-85
View File
@@ -1,85 +0,0 @@
#include <avr/interrupt.h>
#include <avr/io.h>
#define SPI_PORTX PORTB
#define SPI_DDRX DDRB
#define SPI_MISO 4
#define SPI_MOSI 3
#define SPI_SCK 5
#define SPI_SS 2
void SPI_MasterInit(void)
{
/* Настройка MOSI и SCK как выход,
все остальные сигналы как вход: */
SPI_DDRX = (1 << SPI_MOSI)|(1 << SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO);
/* Разрешить работу SPI, режим Master,
установить скорость тактов fck/16: */
SPCR = (1 << SPE)|(1 << MSTR)|(0<<CPOL)|(0<<CPHA)|(1 << SPR0);
SPI_PORTX |= (1 << SPI_SS);
}
void SPI_MasterTransmit(char* buffer, size_t length)
{
SPI_PORTX &= ~(1 << SPI_SS);
for(int i=0; i<length; i++ ){
SPDR = buffer[i];
while(!(SPSR & (1 << SPIF)));
Serial.println("Transmitede");
delay(2000);
}
SPI_PORTX |= (1 << SPI_SS);
}
byte crc8(byte* data, int length) {
byte crc = 0x00;
byte poly = 0x07;
for (int i=0; i<length-2; i++){
crc ^= data[i];
for (int j=0; j<length; j++) {
if (crc & 0x80){
crc = (crc << 1) ^ poly;
}else{
crc <<= 1;
}
}
}
return crc;
}
/*void SPI_MasterTransmit(char cData)
{
Serial.println("SPI_MasterTransmitSPI_MasterTransmitSPI_MasterTransmit");
SPI_PORTX &= ~(1 << SPI_SS);
Запуск передачи данных:
SPDR = cData;
Ожидание завершения передачи:
while(!(SPSR & (1 << SPIF)));
Serial.println("Transmitede");
SPI_PORTX |= (1 << SPI_SS);
}*/
void setup() {
SPI_MasterInit();
Serial.begin(9600);
Serial.println("Arduino 1 starded");
}
void loop() {
char buffer[] = {'a', 't', 'g', '1', 0};
for(int y=5; y<21; y++) {
buffer[0]=0x06;
buffer[1]=3;
buffer[2]=y;
buffer[3]=0x01;
buffer[4]=crc8;
SPI_MasterTransmit(&buffer[0], 5);
}
}