#include #include #include //заменили названия портов микроконтроллера названиями контактов платы, к которым ведут порты #define E PORTB.4 #define D PORTC.5 #define W PORTD.4 #define Q PORTD.5 #define A5 PORTC.0 #define A6 PORTC.1 #define A9 PORTC.2 #define A8 PORTC.3 #define A7 PORTC.4 #define A4 PORTB.5 #define A3 PORTB.0 #define A2 PORTB.1 #define A1 PORTB.2 #define A0 PORTB.3 #define A11 PORTD.6 #define A10 PORTD.7 #define ACmp(Value) if(Value != 0){\ Value = 1;\ } //процедура для побитового выставления адреса в каждый из портов адреса #define A(offset) A0 = offset & 0b00000000000000000000000000000001; ACmp(A0); \ A1 = offset & 0b00000000000000000000000000000010; ACmp(A1); \ A2 = offset & 0b00000000000000000000000000000100; ACmp(A2); \ A3 = offset & 0b00000000000000000000000000001000; ACmp(A3); \ A4 = offset & 0b00000000000000000000000000010000; ACmp(A4); \ A5 = offset & 0b00000000000000000000000000100000; ACmp(A5); \ A6 = offset & 0b00000000000000000000000001000000; ACmp(A6); \ A7 = offset & 0b00000000000000000000000010000000; ACmp(A7); \ A8 = offset & 0b00000000000000000000000100000000; ACmp(A8); \ A9 = offset & 0b00000000000000000000001000000000; ACmp(A9); \ A10 = offset & 0b00000000000000000000010000000000; ACmp(A10); \ A11 = offset & 0b00000000000000000000100000000000; ACmp(A11); #define DELAY(maxValue) for(delayVar = 0; delayVar < maxValue; delayVar++); //Макрос для задержек, меньших 1мс #define BLINK(range) for (counter = 0; counter < range * 2; counter++) { \ //Макрос для моргания светодиодом. BLINK(1) - одно моргание(вкл + выкл) delay_ms(500); \ PORTB.5 = PORTB.5 ^ 1; } unsigned delayVar; void writeCycle(const unsigned value, const unsigned diapasonStart, const unsigned diapasonEnd) { //Запись в память с offset = diapasonStart по offset = diapasonEnd значения = Value unsigned dataOffset = diapasonStart; //dataOffset хранит адрес текущей ячейки памяти D = value; E = 0; while (dataOffset <= diapasonEnd) { //записываем, пока смещение не дойдет до нужной ячейки E = 1; // \ // \ W = 1; // \ // \ // - значения на портах E,D,Q,W выставляются в соответствии с временной диаграммой A(dataOffset) // / E = 0; // / // / W = 0; // / dataOffset = dataOffset + 1; //увеличиваем смещение на 1, dataOffset хранит адрес следующей ячейки } } unsigned checkIsCorrect(const unsigned value, unsigned diapasonStart, unsigned diapasonEnd) { //Все ли значения равны заданному value, возвращает количество ошибок //( 0 - нет ошибок, все значения ячеек сошлись) unsigned errorCounterPTR = 0; //переменная для подсчета количества ошибок unsigned dataOffset = diapasonStart; //dataOffset хранит адрес текущей ячейки памяти E = 0; W = 1; while (dataOffset <= diapasonEnd) { //считываем, пока смещение не дойдет до нужной ячейки E = 1; DELAY(100); A(dataOffset) DELAY(100); E = 0; DELAY(1000); if (Q != value) //если значение на порте входа данных не сходится с тем, что проверяем //(Например, если на Q сигнал 0, а мы проверяем на value = 1, то увеличиваем счетчик ошибок на 1) errorCounterPTR = errorCounterPTR + 1; DELAY(100); dataOffset = dataOffset + 1; DELAY(100); } return errorCounterPTR; } void main(void) { unsigned numberOfErrors; //указатель на число для хранения количества ошибок unsigned counter; //счетчик, используемый в BLINK() // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<