Вс ноя 05, 2023 20:23:39
#define F_CPU 32000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
#include "keyboard.h"
#include "lcd_lib.h"
#define PAUSE 150
int k = 0;
int b = 0;
int i = 0;
int c = 0;
int cont = 0;
int col[5] = {0b00000000, 0b00000001, 0b00000010, 0b00000100, 0b00001000};
int row[6] = {0b00011111, 0b00011110, 0b00011101, 0b00011011, 0b00010111, 0b00001111};
unsigned char buf = 0;
unsigned char buttons[4];
void selectKey(int r, int c, int delay)
{
PORTD = col[r];
PORTC = row[c];
_delay_ms(PAUSE);
PORTC = row[0];
PORTD = col[0];
_delay_ms(delay);
}
void send(void)
{
selectKey(1, 5, PAUSE); // RES
selectKey(1, 4, PAUSE); // PRI
selectKey(1, 1, PAUSE); // TOT
selectKey(1, 2, PAUSE); // CAL
int i;
for ( i = 0; i < 4; i++)
{
selectKey(3, 5, PAUSE); // 0
}
selectKey(4, 5, PAUSE); // OK
selectKey(2, 2, PAUSE); // 1
}
void end(void)
{
selectKey(1, 4, PAUSE); // PRI
selectKey(1, 5, PAUSE); // RES
}
void fin(void)
{
LCD_Clear();
LCD_Goto(0, 0);
LCD_SendString("Kod otpravlen! ");
_delay_ms(1000);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
{
buttons[i] = 0;
}
cont = 0;
}
int main(void)
{
DDRD=0xFF;
DDRC=0xFF;
LCD_Init();
LCD_Goto(0, 0);
LCD_SendString("Vvedite ");
LCD_Goto(4, 1);
LCD_SendString("Koefitsent: ");
_delay_ms(2000);
LCD_Clear();
KEYB_Init();
while (1)
{
KEYB_ScanKeyboard();
buf = KEYB_GetKey();
if (buf)
{
if (b < 4 && buf != '*'&& buf != '#')
{
// Проверяем, есть ли еще место в массиве и выполняем ограничения на ввод
if (b == 0 && buf != '1')
{
LCD_Goto(0, 0);
LCD_SendString("Oshibka");
_delay_ms(2000);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
{
buttons[i] = 0;
}
continue; // Пропускаем ввод, если первый адрес массива не равен единице
}
if (b == 1 && (buf != '0' && buf != '1'))
{
LCD_Clear();
LCD_Goto(0, 0);
LCD_SendString("Oshibka");
_delay_ms(2000);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
{
buttons[i] = 0;
}
continue; // Пропускаем ввод, если второй адрес массива не равен нулю или единице
}
buttons[b++] = buf;
LCD_Goto(k++, 1);
LCD_WriteData(buf);
}
if (buf == '*')
{
for (c = 0; c < 4; c++)
{
if (buttons[c] >= '0' && buttons[c] <= '9')
{
int digit = buttons[c] - '0';
cont = cont * 10 + digit;
}
}
switch(cont)
{
case 1001:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1002:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1003:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1004:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1005:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1006:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1007:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1008:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
case 1009:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
end();
fin();
break;
case 1010:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1011:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1012:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1013:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1014:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1015:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1016:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1017:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1018:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
case 1019:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 2, PAUSE);
selectKey(4, 4, PAUSE);
end();
fin();
break;
case 1020:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1021:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1022:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1023:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1024:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1025:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1026:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1027:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1028:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
case 1029:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 2, PAUSE);
selectKey(4, 4, PAUSE);
end();
fin();
break;
case 1030:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1031:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1032:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1033:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1034:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1035:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1036:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1037:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1038:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
case 1039:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 2, PAUSE);
selectKey(4, 4, PAUSE);
end();
fin();
break;
case 1040:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1041:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1042:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1043:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1044:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1045:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1046:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1047:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1048:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1049:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 3, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1050:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1051:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1052:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1053:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1054:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1055:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1056:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1057:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1058:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1059:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 3, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1060:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1061:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1062:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1063:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1064:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1065:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1066:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1067:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1068:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
case 1069:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 3, PAUSE);
selectKey(4, 4, PAUSE);
end();
fin();
break;
case 1070:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1071:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1072:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1073:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1074:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1075:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1076:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1077:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1078:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
case 1079:
send();
selectKey(3, 5, PAUSE);
selectKey(2, 4, PAUSE);
selectKey(4, 4, PAUSE);
end();
fin();
break;
case 1080:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1081:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1082:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1083:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1084:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1085:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1086:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1087:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1088:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
case 1089:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
selectKey(4, 4, PAUSE);
end();
fin();
break;
case 1090:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
case 1091:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(2, 2, PAUSE);
end();
fin();
break;
case 1092:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(3, 2, PAUSE);
end();
fin();
break;
case 1093:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(4, 2, PAUSE);
end();
fin();
break;
case 1094:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(2, 3, PAUSE);
end();
fin();
break;
case 1095:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(3, 3, PAUSE);
end();
fin();
break;
case 1096:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(4, 3, PAUSE);
end();
fin();
break;
case 1097:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(2, 4, PAUSE);
end();
fin();
break;
case 1098:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
case 1099:
send();
selectKey(3, 5, PAUSE);
selectKey(4, 4, PAUSE);
selectKey(4, 4, PAUSE);
end();
fin();
break;
case 1100:
send();
selectKey(2, 2, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
end();
fin();
break;
}
}
if (b > 0&&buf == '#')
{
LCD_Clear();
LCD_Goto(0, 4);
LCD_SendString("Ochistka");
_delay_ms(2000);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
{
buttons[i] = 0;
}
}
}
}
return 0;
}
Вс ноя 05, 2023 20:38:51
Вс ноя 05, 2023 20:55:09
Вс ноя 05, 2023 21:01:55
Вс ноя 05, 2023 21:18:39
selectKey(3, 5, PAUSE); // 0
selectKey(2, 2, PAUSE); //1
selectKey(3, 2, PAUSE); //2
void selectKey(int r, int c)
{
PORTD = col[r];
PORTC = row[c];
_delay_ms(PAUSE);
PORTC = row[0];
PORTD = col[0];
_delay_ms(PAUSE);
}
void end(void)
{
selectKey(1, 4); // PRI
selectKey(1, 5); // RES
_delay_ms(2);
LCD_Clear();
LCD_Goto(0, 0);
LCD_SendString("Kod otpravlen! ");
_delay_ms(1000);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
{
buttons[i] = 0;
}
cont = 0;
}
case 1001:
send();
selectKey(3, 5);
selectKey(3, 5);
selectKey(2, 2);
end();
break;
Вс ноя 05, 2023 21:56:50
void selectKey(unsigned char r, unsigned char c) // чтобы не вычитать единицу, номера столбов-строк должны начинаться с 0
{
PORTD = (unsigned char)(1 << r);
PORTC = (0x1f & (unsigned char)(~(1 << c)));
_delay_ms(PAUSE);
PORTC = 0x1f;
PORTD = 0;
_delay_ms(PAUSE);
}
switch(cont)
{
case 1001:
send();
selectKey(3, 5, PAUSE);
selectKey(3, 5, PAUSE);
selectKey(3, 4, PAUSE);
end();
fin();
break;
send();
switch(cont)
{
case 1001:
selectKey(2, 4);
selectKey(2, 4);
selectKey(2, 3);
break;
}
end();
fin();
send();
for (i = 0; i < 4; i++)
{
switch(buttons[i] - '0')
{
case 0:
selectKey(3, 5, PAUSE);
break;
case 1:
selectKey(3, 5, PAUSE);
break;
case 2:
selectKey(3, 5, PAUSE);
break;
case 3:
selectKey(3, 5, PAUSE);
break;
case 4:
selectKey(3, 5, PAUSE);
break;
case 5:
selectKey(3, 5, PAUSE);
break;
case 6:
selectKey(3, 5, PAUSE);
break;
case 7:
selectKey(3, 5, PAUSE);
break;
case 8:
selectKey(3, 5, PAUSE);
break;
case 9:
selectKey(3, 5, PAUSE);
break;
}
end();
fin();
send();
for (i = 0; i < 4; i++)
{
selectKey(arr1[buttons[i] - '0'], arr2[buttons[i] - '0'], PAUSE);
}
end();
fin();
Вс ноя 05, 2023 22:03:04
{
selectKey(arr1[buttons[i] - '0'], arr2[buttons[i] - '0'], PAUSE);
}
Вс ноя 05, 2023 22:04:56
Пн ноя 06, 2023 10:34:42
const uint8_t r0[] = {3, 3, 3 ... };
const uint8_t c0[] = {5, 5, 5 ... };
const uint8_t r1[] = {3, 3, 3 ... };
const uint8_t c1[] = {5, 5, 5 ... };
const uint8_t r2[] = {2, 3, 4 ... };
const uint8_t c2[] = {2, 2, 2 ... };
...
uint8_t x = count - 1001;
send();
selectKey(r0[x], c0[x]);
selectKey(r1[x], c1[x]);
selectKey(r2[x], c2[x]);
end();
fin();
Пн ноя 06, 2023 13:06:35
Пн ноя 06, 2023 15:49:18
// Пропускаем ввод, если первый адрес массива не равен единице
char isKeycodeInvalid_First = (b == 0 && buf != '1');
// Пропускаем ввод, если второй адрес массива не равен нулю или единице
char isKeycodeInvalid_Second = (b == 1 && (buf != '0' && buf != '1'));
if (isKeycodeInvalid_First ||
isKeycodeInvalid_Second)
{
if (isKeycodeInvalid_Second)
LCD_Clear();
LCD_Goto(0, 0);
LCD_SendString("Oshibka");
_delay_ms(2000);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
buttons[i] = 0;
continue;
}
typedef struct {
char Row;
char Col;
} TSelectedKey;
typedef struct {
TSelectedKey Key[3];
} TSelectedKeys;
// все возможные комбинации
const TSelectedKeys SelectedKeys[100] = {
{ {3, 5}, {3, 5}, {2, 2} }, // 1001
{ {3, 5}, {3, 5}, {3, 2} }, // 1002
{ {3, 5}, {3, 5}, {4, 2} }, // 1003
{ {3, 5}, {3, 5}, {2, 3} }, // 1004
{ {3, 5}, {3, 5}, {3, 3} }, // 1005
...
// и т.д.
};
...
// работаем с оригинальной глобальной переменной 'cont', в которой уже посчитано введённое значение
{
int index = cont - (1001); // т.к. массивы индексируются с нуля
const TSelectedKey* key = SelectedKeys[index].Key;
// далее из оригинала:
send();
selectKey(key[0].Row, key[0].Col, PAUSE);
selectKey(key[1].Row, key[1].Col, PAUSE);
selectKey(key[2].Row, key[2].Col, PAUSE);
end();
fin();
}
Пн ноя 06, 2023 18:57:05
Вт ноя 07, 2023 21:21:17
#define F_CPU 32000000UL // Определение тактовой частоты для функций задержки
#include <inttypes.h> // Библиотека для работы с типами int
#include <avr/io.h> // Библиотека для ввода-вывода
#include <avr/interrupt.h> // Библиотека для работы с прерываниями
#include <avr/sleep.h> // Библиотека для управления режимами сна
#include <util/delay.h> // Библиотека для работы с задержками
#include "keyboard.h" // Библиотека для работы с клавиатурой
#include "lcd_lib.h" // Библиотека для работы с LCD
#define PAUSE 150 // Определение времени задержки
int k = 0;
int b = 0;
int i = 0;
int c = 0;
int cont = 0;
// Определение столбцов и строк
int col[5] = {0b00000000, 0b00000001, 0b00000010, 0b00000100, 0b00001000};
int row[6] = {0b00011111, 0b00011110, 0b00011101, 0b00011011, 0b00010111, 0b00001111};
unsigned char buf = 0;
unsigned char buttons[4];
// Функция выбора ключа
void selectKey(int r, int c)
{
PORTD = col[r]; // Выбор столбца
PORTC = row[c]; // Выбор строки
_delay_ms(PAUSE); // Ждем
PORTC = row[0]; // Выбираем первую строку
PORTD = col[0]; // Выбираем первый столбец
_delay_ms(PAUSE); // Ждем
}
// Функция отправки
void send(void)
{
selectKey(1, 5); // RES
selectKey(1, 4); // PRI
selectKey(1, 1); // TOT
selectKey(1, 2); // CAL
int i;
for ( i = 0; i < 4; i++)
{
selectKey(3, 5); // 0
}
selectKey(4, 5); // OK
selectKey(2, 2); // 1
}
// Функция завершения
void end(void)
{
selectKey(1, 4); // PRI
selectKey(1, 5); // RES
_delay_ms(2); // задержка
LCD_Clear(); // очищаем экран
LCD_Goto(0, 0); // выбираем позицию на экране
LCD_SendString("Kod otpravlen! "); // выводим сообщение
_delay_ms(1000); // задержка
LCD_Clear(); // очищаем экран
b = 0;
k = 0;
for (i = 0; i < 4; i++) // обнуляем массив
{
buttons[i] = 0;
}
cont = 0; // обнуляем вход
}
int main(void)
{
// Установить все выводы порта D и C как выводы
DDRD=0xFF;
DDRC=0xFF;
// Инициализировать LCD, установить курсор в начало и отобразить сообщение.
LCD_Init();
LCD_Goto(0, 0);
LCD_SendString("Vvedite ");
LCD_Goto(4, 1);
LCD_SendString("Koefitsent: ");
_delay_ms(2000); // задержка
LCD_Clear(); // очищаем экран
KEYB_Init(); // инициализируем клавиатуру
//начинаем основной цикл
while (1)
{
// сканируем клавиатуру и получаем значение введенной клавиши
KEYB_ScanKeyboard();
buf = KEYB_GetKey();
// если была нажата клавиша
if (buf)
{
// условие ввода символов и исключения некоторых клавиш
if (b < 4 && buf != '*'&& buf != '#')
{
// проверяем правильность кода
char isKeycodeInvalid_First = (b == 0 && buf != '1');
char isKeycodeInvalid_Second = (b == 1 && (buf != '0' && buf != '1'));
if (isKeycodeInvalid_First || isKeycodeInvalid_Second)
{
if (isKeycodeInvalid_Second)
LCD_Clear();
LCD_Goto(0, 0);
LCD_SendString("Oshibka");
_delay_ms(2000);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
buttons[i] = 0;
continue;
}
buttons[b++] = buf;
LCD_Goto(k++, 1);
LCD_WriteData(buf);
}
// по нажатию '*' выполняем обработку и отправку введенных данных
if (buf == '*')
{
for (c = 0; c < 4; c++)
{
if (buttons[c] >= '0' && buttons[c] <= '9')
{
int digit = buttons[c] - '0';
cont = cont * 10 + digit;
}
}
send();
switch(cont) // здесь указана привязка введенных значений к функциям (это нужно прокомментировать подробнее)
{
case 1000:
selectKey(3, 5);
selectKey(3, 5);
selectKey(3, 5);
break;
// и так далее... для каждого действия
}
end();
}
// Клавиша '#' очищает все введенные значения
if (b > 0&&buf == '#')
{
LCD_Clear();
LCD_Goto(0, 4);
LCD_SendString("Ochistka");
_delay_ms(2000);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
{
buttons[i] = 0;
}
}
}
}
return 0;
}
Вт ноя 07, 2023 21:55:02
#define F_CPU 32000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
#include "keyboard.h"
#include "lcd_lib.h"
#define PAUSE 150
unsigned char k = 0;
unsigned char b = 0;
unsigned char i = 0;
unsigned char buf = 0;
unsigned char col[5] = {0b00000000, 0b00000001, 0b00000010, 0b00000100, 0b00001000};
unsigned char row[6] = {0b00011111, 0b00011110, 0b00011101, 0b00011011, 0b00010111, 0b00001111};
unsigned char buttons[4];
void selectKey(unsigned char r, unsigned char c)
{
PORTD = col[r];
PORTC = row[c];
_delay_ms(PAUSE);
PORTC = row[0];
PORTD = col[0];
_delay_ms(PAUSE);
}
void clear(void)
{
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
{
buttons[i] = 0;
}
}
void send(void)
{
selectKey(1, 5); // RES
selectKey(1, 4); // PRI
selectKey(1, 1); // TOT
selectKey(1, 2); // CAL
for (i = 0; i < 4; i++)
{
selectKey(3, 5); // 0
}
selectKey(4, 5); // OK
selectKey(2, 2); // 1
}
void end(void)
{
selectKey(1, 4); // PRI
selectKey(1, 5); // RES
LCD_Clear();
LCD_Goto(0, 0);
LCD_SendString("Kod otpravlen! ");
_delay_ms(1000);
clear();
}
int main(void)
{
DDRD=0xFF;
DDRC=0xFF;
LCD_Init();
LCD_Goto(0, 0);
LCD_SendString("Vvedite ");
LCD_Goto(4, 1);
LCD_SendString("Koefitsent: ");
_delay_ms(2000);
LCD_Clear();
KEYB_Init();
while (1)
{
KEYB_ScanKeyboard();
buf = KEYB_GetKey();
if (buf)
{
if (b < 4 && buf != '*'&& buf != '#')
{
// Проверяем, есть ли еще место в массиве и выполняем ограничения на ввод
if ((b == 0 && buf != '1') || (b == 1 && (buf != '0' && buf != '1')))
{
LCD_Goto(0, 0);
LCD_SendString("Oshibka");
_delay_ms(2000);
clear();
continue; // Пропускаем ввод, если первый адрес массива не равен единице и если если второй адрес массива не равен нулю или единице
}
buttons[b++] = buf;
LCD_Goto(k++, 1);
LCD_WriteData(buf);
}
if ((buf == '*') && (buttons[0] = '1'))
{
send();
for (i = 1; i < 4; i++)
{
switch(buttons[i])
{
case '0':
selectKey(3, 5);
break;
case '1':
selectKey(2, 2);
break;
case '2':
selectKey(3, 2);
break;
case '3':
selectKey(4, 2);
break;
case '4':
selectKey(2, 3);
break;
case '5':
selectKey(3, 3);
break;
case '6':
selectKey(4, 3);
break;
case '7':
selectKey(2, 4);
break;
case '8':
selectKey(3, 4);
break;
case '9':
selectKey(4, 4);
break;
}
end();
}
if (b > 0&&buf == '#')
{
LCD_Clear();
LCD_Goto(0, 4);
LCD_SendString("Ochistka");
_delay_ms(2000);
LCD_Clear();
clear();
}
}
}
}
if (buf)
{
if (b < 4 && buf != '*'&& buf != '#')
{
// Проверяем, есть ли еще место в массиве и выполняем ограничения на ввод
if ((b == 0 && buf != '1') || (b == 1 && (buf != '0' && buf != '1')))
Вт ноя 07, 2023 22:21:06
Вт ноя 07, 2023 22:53:08
if ((buf == '*') && (buttons[0] = '1'))
{
send();
for (i = 1; i < 4; i++)
if (b < 4 && buf != '*'&& buf != '#')
{
// Проверяем, есть ли еще место в массиве и выполняем ограничения на ввод
if ((b == 0 && buf != '1') || (b == 1 && (buf != '0' && buf != '1')))
{
#define F_CPU 32000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
#include "keyboard.h"
#include "lcd_lib.h"
#define PAUSE 150
unsigned char k = 0;
unsigned char b = 0;
unsigned char i = 0;
unsigned char buf = 0;
unsigned char col[5] = {0b00000000, 0b00000001, 0b00000010, 0b00000100, 0b00001000};
unsigned char row[6] = {0b00011111, 0b00011110, 0b00011101, 0b00011011, 0b00010111, 0b00001111};
unsigned char buttons[4];
void selectKey(unsigned char r, unsigned char c)
{
PORTD = col[r];
PORTC = row[c];
_delay_ms(PAUSE);
PORTC = row[0];
PORTD = col[0];
_delay_ms(PAUSE);
}
void Message(string message, unsigned short delay)
{
LCD_Clear();
LCD_Goto(0, 0);
LCD_SendString(message);
_delay_ms(delay);
LCD_Clear();
b = 0;
k = 0;
for (i = 0; i < 4; i++)
{
buttons[i] = 0;
}
}
int main(void)
{
DDRD=0xFF;
DDRC=0xFF;
LCD_Init();
LCD_Goto(0, 0);
LCD_SendString("Vvedite ");
LCD_Goto(4, 1);
LCD_SendString("Koefitsent: ");
_delay_ms(2000);
LCD_Clear();
KEYB_Init();
while (1)
{
KEYB_ScanKeyboard();
buf = KEYB_GetKey();
if (buf)
{
if ((b < 4) && (buf != '*') && (buf != '#'))
{
// Проверяем, есть ли еще место в массиве и выполняем ограничения на ввод
if (((b == 0) && (buf != '1')) || ((b == 1) && ((buf != '0') && (buf != '1'))))
{
Message("Oshibka", 2000);
continue; // Пропускаем ввод, если первый адрес массива не равен единице
}
buttons[b++] = buf;
LCD_Goto(k++, 1);
LCD_WriteData(buf);
}
if (buf == '*')
{
selectKey(1, 5); // RES
selectKey(1, 4); // PRI
selectKey(1, 1); // TOT
selectKey(1, 2); // CAL
for (i = 0; i < 4; i++)
{
selectKey(3, 5); // 0
}
selectKey(4, 5); // OK
for (i = 0; i < 4; i++)
{
switch(buttons[i])
{
case '0':
selectKey(3, 5);
break;
case '1':
selectKey(2, 2);
break;
case '2':
selectKey(3, 2);
break;
case '3':
selectKey(4, 2);
break;
case '4':
selectKey(2, 3);
break;
case '5':
selectKey(3, 3);
break;
case '6':
selectKey(4, 3);
break;
case '7':
selectKey(2, 4);
break;
case '8':
selectKey(3, 4);
break;
case '9':
selectKey(4, 4);
break;
}
selectKey(1, 4); // PRI
selectKey(1, 5); // RES
Message("Kod otpravlen!", 1000);
}
if ((b > 0) && (buf == '#'))
{
Message("Ochistka", 2000);
}
}
}
}
Ср ноя 08, 2023 10:17:07
Ср ноя 08, 2023 10:22:31
Ср ноя 08, 2023 10:44:48
Ср ноя 08, 2023 10:47:55
grachevvlad2023 писал(а):Так же прикрепил немного оптимизированный код.