Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
290 Микроконтроллеры AVR от азов программирования... Применение ссылочной переменной сразу решает все проблемы. Каждую мелодию мы помещаем в отдельный одномерный массив типа unsigned char. Затем мы создаем ссылочную переменную с именем not а (см. строку 45 нашей программы). Ну а дальше все просто. Для воспроизведения первой мелодии поме щаем в переменную nota указатель на начало первого массива. Затем при помощи выражения *nota читаем по порядку все элементы массива и воспроизводим ноты, соответствующие прочитанным значениям. После чтения каждого очередного элемента увеличиваем содержимое перемен ной nota на единицу. Если нужно воспроизвести вторую мелодию, то записываем в переменную nota указатель на начало второго массива. Воспроизводим эту мелодию таким же способом, как и первую. Подобным же образом можно воспроизводить мелодии из любого массива. Теперь рассмотрим подробнее программу с самого начала. Описание программы (листинг 5.18) Для формирования задержки мы будем использовать функцию из библиотеки delay.h. Поэтому в строках 1,2 программы, кроме файла опи саний, мы присоединяем и эту библиотеку. Затем начинаются описания всех массивов. В строке 3 описывается массив, содержащий величины всех музыкальных длительностей. Так как для формирования длительности мы будем использовать функцию delay_ms, величина длительностей задана в миллисекундах. Как видно из текста программы, в данном случае мы используем массив типа unsigned int. Переменные этого типа имеют длину два байта, все 16 битов которых используются для хранения информации. Именно такой тип наиболее подходит для хранения наших коэффи циентов. Управляющее слово f leash перед описанием массива гаран тирует, что эти данные будут размещены в программной памяти микро контроллера. В строках 4, 5, 6 описывается массив коэффициентов деления для всех нот. В этом месте программы мы впервые используем перенос строки. Перенос строки применяется в том случае, когда текст команды не помещается в одной строке. Язык СИ разрешает свободно переносить текст на следующую строку. При этом не требуется никаких специальных директив и указателей. Перенос допускается в том месте команды, где между двумя сосед ними элементами выражения можно поставить пробел. Тип массива, как и в предыдущем случае, — usingnerd int. Содержимое массива tabkd полностью соответствует содержимому таблицы с тем же названием из ассемблерного варианта программы.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==