Современная электроника №7/2021
ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 59 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 7 2021 ваны линии РС0...РС2 и РС4...РС7, линия РD1 микроконтроллера используется для последовательного вывода инфор- мации на экран терминала. В представленном примере было выполнено чтение фиксированного числа байт информации из размещён- ного на карте памяти текстового фай- ла. Для чтения всегофайла удобно при- менить функцию feof(FIL *fp), которая во время доступа к файлу определяет, был ли достигнут его конец, и в этом случае возвращает ненулевое значе- ние (1). В противном случае функция возвращает ноль (0). Параметр функ- ции fp – это указатель на структуру дан- ныхфайла. Размерфайла в байтах опре- деляют с помощью функции f_size(FIL *fp), реализованной в виде макроса #define f_size(fp) ((fp)->fsize), который определяют вместе с заголовочными файлами в начале кода программы: #include <mega32.h> #include <alcd.h> #include <stdio.h> #include <delay.h> #include <ff.h> Листинг 1 #include <mega32.h> // Подключение заголовочных файлов #include <alcd.h> // в которых содержатся #include <stdio.h> // прототипы функций #include <delay.h> #include <ff.h> #define F_CPU 2000000 // Рабочая частота микроконтроллера #define BAUD 9600L // Скорость обмена данными #define UBRRL_value (F_CPU/(BAUD*16))-1 // Согласно заданной скорости // подсчитываем значение для регистра UBRR void init_USART() { // Функция инициализации USART UBRRL = UBRRL_value; // Младшие 8 бит UBRRL_value UBRRH = UBRRL_value >> 8; // Старшие 8 бит UBRRL_value UCSRB = (1<<TXEN); // Бит разрешения передачи UCSRC = (1<< UCSZ0)|(1<< UCSZ1); } // Устанавливаем формат 8 бит данных void send_UART(char value) { while(!( UCSRA & (1 << UDRE))); // Ожидаем, когда очистится буфер передачи UDR = value; } // Помещаем данные в буфер, начинаем передачу interrupt [TIM1_COMPA] void timer1_compa_isr(void) {disk_timerproc();} // Вызов функции синхронизации void main(void) { FATFS fat; // Выделение рабочей области памяти для логического диска FIL file, file2; // Указатели на структуру данных файлов unsigned char Buff[80]; // Переменная для записи считанных из файла 1.txt данных unsigned char Buff2[80]; // Переменная для записи считанных из файла 2.txt данных unsigned int br, br2, bwr; // Число прочитанных или записанных байтов int i; // Инициализация портов микроконтроллера // Port B DDRB=(1<<DDB7) | (0<<DDB6) | (1<<DDB5) | (1<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port D, Port C DDRD=DDRC=0xff; PORTD=PORTC=0x00; // Инициализация таймера TCCR1A=0x00; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x4E; TIMSK=0x10; lcd_init(20); // Инициализация дисплея #asm("sei") delay_ms(200); init_USART(); // Инициализация USART delay_ms(200); f_mount(0, &fat); // Выделение рабочей области памяти для логического раздела f_open(&file,"0:/1.txt", FA_OPEN_EXISTING | FA_READ); // Открываем файл 1.txt только для чтения f_read(&file, Buff, 80, &br); // Читаем в переменную Buff 80 символов с начала файла f_close(&file); // Закрываем файл 1.txt delay_ms(50); // Пауза длительностью 50 мс f_open(&file2,"0:/2.txt", FA_CREATE_ALWAYS | FA_WRITE ); // Создаем на карте памяти // файл 2.txt для записи f_write(&file2, Buff, 80, &bwr); // Записывем в файл 2.txt данные из файла 1.txt f_close(&file2); // Закрываем файл delay_ms(50); // Пауза длительностью 50 мс f_open(&file2,"0:/2.txt", FA_READ); // Открываем файл 2.txt для чтения f_read(&file2, Buff2, 80, &br2); // Читаем в переменную Buff2 80 символов с начала файла f_close(&file2); // Закрываем файл for (i=0;i<br2;i++) {send_UART(Buff2[i]);} // Вывод считанной информации из созданного // на карте памяти файла на экран терминала lcd_gotoxy(4,2); // Установка курсора в четвертую позицию второй строки дисплея for (i=2;i<15;i++) {lcd_putchar(Buff2[i]);}} // Вывод на экран дисплея 13 символов, считанных из файла 2.txt карты памяти
RkJQdWJsaXNoZXIy MTQ4NjUy