Загрузил(а) файлы в ''

This commit is contained in:
Кристина Бочкина 2023-05-22 12:54:34 +00:00
parent 88b55c0d90
commit 13d7246559

View File

@ -9,42 +9,109 @@
#define SPI_SCK 5 #define SPI_SCK 5
#define SPI_SS 2 #define SPI_SS 2
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;
};
void output_on_display(struct calculator * calc) {
char buffer[];
size_t size_buffer;
switch (state) {
case NUMBER_FIRST:
display_all_clear( 0, &buffer[0]);
SPI_MasterTransmit(&buffer[0], size_buffer);
displ1ay_add_simbol( , , &buffer[0]);
SPI_MasterTransmit(&buffer[0], 1);
break;
case NUMBER_SECOND:
display_all_clear();
SPI_MasterTransmit(&buffer[0], )
display_add_simbol();
SPI_MasterTransmit(&buffer[0], )
display_add_simbol();
SPI_MasterTransmit(&buffer[0], )
display_add_simbol();
SPI_MasterTransmit(&buffer[0], )
break;
case RESULT:
display_all_clear();
SPI_MasterTransmit(&buffer[0], )
display_add_simbol();
SPI_MasterTransmit(&buffer[0], )
display_add_simbol();
SPI_MasterTransmit(&buffer[0], )
display_add_simbol();
SPI_MasterTransmit(&buffer[0], )
display_draw_line();
SPI_MasterTransmit(&buffer[0], )
display_add_simbol();
SPI_MasterTransmit(&buffer[0], )
break;
default:
display_all_clear();
}
}
void SPI_MasterInit(void) void SPI_MasterInit(void)
{ {
/* Настройка MOSI и SCK как выход, /* Настройка MOSI и SCK как выход,
все остальные сигналы как вход: */ все остальные сигналы как вход: */
SPI_DDRX = (1 << SPI_MOSI)|(1 << SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO); SPI_DDRX = (1 << SPI_MOSI) | (1 << SPI_SCK) | (1 << SPI_SS) | (0 << SPI_MISO);
/* Разрешить работу SPI, режим Master, /* Разрешить работу SPI, режим Master,
установить скорость тактов fck/16: */ установить скорость тактов fck/16: */
SPCR = (1 << SPE)|(1 << MSTR)|(0<<CPOL)|(0<<CPHA)|(1 << SPR0); SPCR = (1 << SPE) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (1 << SPR0);
SPI_PORTX |= (1 << SPI_SS); SPI_PORTX |= (1 << SPI_SS);
} }
void SPI_MasterTransmit(char* buffer, size_t length) void SPI_MasterTransmit(char* buffer, size_t length)
{ {
SPI_PORTX &= ~(1 << SPI_SS); SPI_PORTX &= ~(1 << SPI_SS);
for(int i=0; i<length; i++ ){ for (int i = 0; i < length; i++ ) {
SPDR = buffer[i]; SPDR = buffer[i];
while(!(SPSR & (1 << SPIF))); while (!(SPSR & (1 << SPIF)));
Serial.println("Transmitede"); Serial.println("Transmitede");
delay(2000); delay(2000);
} }
SPI_PORTX |= (1 << SPI_SS); SPI_PORTX |= (1 << SPI_SS);
} }
byte crc8(byte *data, int length) { byte crc8(byte *data, int length) {
byte crc = 0x00; byte crc = 0x00;
byte poly = 0x07; //полином для CRC byte poly = 0x07; //полином для CRC
for (int i=0; i<length-2; i++){ for (int i = 0; i < length - 2; i++) {
crc ^= data[i]; //XOR текущего байта с CRC crc ^= data[i]; //XOR текущего байта с CRC
for (int j=0; j<length; j++) { for (int j = 0; j < length; j++) {
if (crc & 0x80){ //если старший бит CRC равен 1 if (crc & 0x80) { //если старший бит CRC равен 1
crc = (crc << 1) ^ poly; //сдвигаем CRC на 1 бит влево и XOR с полиномом crc = (crc << 1) ^ poly; //сдвигаем CRC на 1 бит влево и XOR с полиномом
}else{ } else {
crc <<= 1; //иначе просто сдвигаем на 1 бит влево crc <<= 1; //иначе просто сдвигаем на 1 бит влево
} }
} }
@ -62,89 +129,97 @@ void setup() {
void loop() { void loop() {
char buffer[] = {'a', 't', 'g', '1', 0}; char buffer[] = {'a', 't', 'g', '1', 0};
for(int y=5; y<21; y++) { for (int y = 5; y < 21; y++) {
buffer[0]=0x06; // buffer[0] = 0x06;
buffer[1]=3; // buffer[1] = 3;
buffer[2]=y; // buffer[2] = y;
buffer[3]=0x01; // buffer[3] = 0x01;
buffer[4]=crc8(&buffer[0], 4); // buffer[4] = crc8(&buffer[0], 4);
SPI_MasterTransmit(&buffer[0], 5); SPI_MasterTransmit(&buffer[0], 5);
} }
} }
size_t display_all_clear(char color, uint8_t* buffer){ //очищение экранa
buffer[0]=0x01; size_t display_all_clear(char color, uint8_t* buffer) {
buffer[1]=color; buffer[0] = 0x01;
buffer[2]=crc8(&buffer[0], 2); buffer[1] = color;
return 3; buffer[2] = crc8(&buffer[0], 2);
return 3;
} }
size_t display_set_page(char point, uint8_t* buffer){ //выбор точки
buffer[0]=0x02; size_t display_set_page(char point, uint8_t* buffer) {
buffer[1]=point; buffer[0] = 0x02;
buffer[2]=crc8(&buffer[0], 2); buffer[1] = point;
return 3; 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; size_t display_add_simbol(char* str, size_t str_len, uint8_t* buffer) {
buffer[idx]=0x04; size_t idx;
idx++; buffer[idx] = 0x04;
for(int si=0; i<str_len; i++) {
buffer[idx]=str;
idx++;
}
buffer[idx]=crc8(&buffer[0], idx);
idx++; idx++;
return 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; size_t display_del_simbol(char number, uint8_t* buffer) {
buffer[1]=number; buffer[0] = 0x05;
buffer[2]=crc8(&buffer[0], 2); buffer[1] = number;
return 3; 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; size_t display_draw_pixel(char x, char y, char color, uint8_t* buffer) {
buffer[1]=x; buffer[0] = 0x06;
buffer[2]=y; buffer[1] = x;
buffer[3]=color; buffer[2] = y;
buffer[4]=crc8(&buffer[0], 4); buffer[3] = color;
return 5; 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; size_t display_draw_line(char x1, char y1, char x2, char y2, char color, uint8_t* buffer) {
buffer[1]=x1; buffer[0] = 0x07;
buffer[2]=y1; buffer[1] = x1;
buffer[3]=x2; buffer[2] = y1;
buffer[4]=y2; buffer[3] = x2;
buffer[5]=color; buffer[4] = y2;
buffer[6]=crc8(&buffer[0], 6); buffer[5] = color;
return 7; 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; size_t display_draw_circle(char x, char y, char r, char color, uint8_t* buffer) {
buffer[1]=x; buffer[0] = 0x08;
buffer[2]=y; buffer[1] = x;
buffer[3]=r; buffer[2] = y;
buffer[4]=color; buffer[3] = r;
buffer[5]=crc8(&buffer[0], 5); buffer[4] = color;
return 6; 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; size_t display_draw_rectangle(char x, char y, char height, char width, char color, uint8_t* buffer) {
buffer[1]=x; buffer[0] = 0x09;
buffer[2]=y; buffer[1] = x;
buffer[3]=height; buffer[2] = y;
buffer[4]=widht; buffer[3] = height;
buffer[5]=color; buffer[4] = widht;
buffer[6]=crc8(&buffer[0], 6); buffer[5] = color;
return 7; buffer[6] = crc8(&buffer[0], 6);
return 7;
} }