Использование параллельных портов в программах на языке ассемблер и C
Процессорная система «DE2-70 Media Computer» представляет удобную платформу для получения первого опыта отладки программ, написанных на ассемблере или на языке С. Простые примеры таких программ приведены в листингах 3 и 4. Обе программы выполняют одинаковые действия, иллюстрируя использование параллельных портов в программах на языках ассемблер и С.
Программа, приведенная в листинге 3, отображает значение, задаваемое переключателями SW17-0, на красных светодиодах, а состояние кнопок на зеленых светодиодах. Она также отображает циклически сдвигаемое в регистре процессора значение на 7-сегментных индикаторах HEX7-HEX4 и HEX3-HEX0. Этот двоичный набор сдвигается вправо путем выполнения команды циклического сдвига. В программе используется цикл задержки, чтобы замедлить сдвиг для удобства визуального наблюдения. Отображаемый набор на 7-сегментных индикаторах может быть изменен с помощью переключателей SW17-0, посредством нажатия любой из кнопок KEY3, KEY2, KEY1. Следует напомнить, что кнопка KEY0 используется для сброса процессора. Файлы с исходными кодами программ, показанных в листингах 3 и 4, входят в состав приложения AMP. Они могут быть найдены в разделе «Sample programs» под именем «Getting Started».
Листинг 3. Пример программы на ассемблере, использующей параллельные порты
/*****************************************************************************
* Эта программа демонстрирует использование параллельных портов в процессорной
* системе "DE2-70 Media Computer"
*
* Она выполняет следующее:
* 1. Выводит состояние SW переключателей на красные светодиоды LEDR
* 2. Выводит состояние кнопок KEY на зеленые светодиоды LEDG
* 3. Выводит сдвигаемый набор на HEX индикаторы
* 4. Если нажаты кнопки KEY[3..1], для задания набора используются SW переключатели
*****************************************************************************
.text /* далее следует исполнимый код */
.global _start /* объявляем метку _start глобальной */
_start:
/* инициализируем базовые адреса параллельных портов */
movia r15, 0x10000040 /* базовый адрес SW переключателей */
movia r16, 0x10000000 /* базовый адрес красных светодиодов LEDR */
movia r17, 0x10000050 /* базовый адрес кнопок KEY */
movia r18, 0x10000010 /* базовый адрес зеленых светодиодов LEDG */
movia r20, 0x10000020 /* базовый адрес индикаторов HEX3_HEX0 */
movia r21, 0x10000030 /* базовый адрес индикаторов HEX7_HEX4 */
movia r19, HEX_bits
ldw r6, 0(r19) /* загружаем в r6 набор для отображения на HEX индикаторах */
DO_DISPLAY:
ldwio r4, 0(r15) /* загружаем в r4 состояние SW переключателей */
stwio r4, 0(r16) /* выводим на красные светодиоды LEDR */
ldwio r5, 0(r17) /* загружаем в r5 состояние кнопок KEY */
stwio r5, 0(r18) /* выводим на зеленые светодиоды LEDG */
beq r5, r0, NO_BUTTON
mov r6, r4 /* копируем состояние SW переключателей в r6 */
WAIT:
ldwio r5, 0(r17) /* загружаем в r5 состояние кнопок KEY */
bne r5, r0, WAIT /* ждем отпускания кнопок */
NO_BUTTON:
stwio r6, 0(r20) /* выводим на HEX3 ... HEX0 */
stwio r6, 0(r21) /* выводим на HEX7 ... HEX4 */
roli r6, r6, 1 /* сдвигаем выводимый набор */
movia r7, 100000 /* реализуем задержку в r7 */
DELAY:
subi r7, r7, 1
bne r7, r0, DELAY
br DO_DISPLAY
/**********************************************************************
.data /* сегмент данных */
HEX_bits:
.word 0x0000000F /* набор для вывода на HEX */
Листинг 4. Пример программы на С, использующей параллельные порты
/*****************************************************************************
* Эта программа демонстрирует использование параллельных портов в процессорной системе
* "DE2-70 Media Computer"
*
* Она выполняет следующее:
* 1. Выводит состояние SW переключателей на красные светодиоды LEDR
* 2. Выводит состояние кнопок KEY на зеленые светодиоды LEDG
* 3. Выводит сдвигаемый набор на HEX индикаторы
* 4. Если нажаты кнопки KEY[3..1], для задания набора используются SW переключатели
*****************************************************************************
int main(void)
{
/* Объявляем указатели на регистры портов вв/выв(это означает, что команды ldwio и stwio будут использоваться вместо команд ldw и stw)
*/
volatile int * red_LED_ptr = (int *) 0x10000000; //адрес красных светодиодов LEDR
volatile int * green_LED_ptr = (int *) 0x10000010; //адрес зеленых светодиодов LEDG
volatile int * HEX3_HEX0_ptr = (int *) 0x10000020; //адрес HEX3_HEX0
volatile int * HEX7_HEX4_ptr = (int *) 0x10000030; //адрес HEX7_HEX4
volatile int * SW_switch_ptr = (int *) 0x10000040; //адрес переключателей SW
volatile int * KEY_ptr = (int *) 0x10000050; // адрес кнопок KEY
int HEX_bits = 0x0000000F; // набор для вывода на HEX индикаторы
int SW_value, KEY_value, delay_count;
while(1)
{
SW_value = *(SW_switch_ptr); // читаем состояние SW переключателей
*(red_LED_ptr) = SW_value; // выводим на красные светодиоды LEDR
KEY_value = *(KEY_ptr); // читаем состояние кнопок KEY
*(green_LED_ptr) = KEY_value; // выводим на зеленые светодиоды LEDR
if (KEY_value != 0) // проверяем была ли нажата кнопка {
HEX_bits = SW_value; //устанавливаем набор используя SW values
while (*KEY_ptr); // ожидаем отпускания кнопки
}
*(HEX3_HEX0_ptr) = HEX_bits; // выводим набор на HEX3 ... HEX0
*(HEX7_HEX4_ptr) = HEX_bits; // выводим набор на HEX7 ... HEX4
/* циклически сдвигаем набор, выводимый на HEX индикаторы */
if (HEX_bits & 0x80000000)
HEX_bits = (HEX_bits << 1) | 1;
else
HEX_bits = HEX_bits << 1;
for (delay_count = 500000; delay_count != 0; --delay_count); // цикл задержки
}
}y 1i16E2ehR2JvHwZvEp9DI+1gTlzunZwr9SC96Yg/tKbHlxbrQzV6Dd+ZqjK3PHRjpra02by9n/eL rda3N9PzE4iEU/oPwy8+o0PJTLswko3CaVhxTsNiyYPYzVZzFnZ/giwLeYlf/gAAAP//AwBQSwEC LQAUAAYACAAAACEAtoM4kv4AAADhAQAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNd LnhtbFBLAQItABQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAAAAAAAAAAAAAAC8BAABfcmVscy8u cmVsc1BLAQItABQABgAIAAAAIQAcI3ipKwIAACAEAAAOAAAAAAAAAAAAAAAAAC4CAABkcnMvZTJv RG9jLnhtbFBLAQItABQABgAIAAAAIQDNAx9w2wAAAAYBAAAPAAAAAAAAAAAAAAAAAIUEAABkcnMv ZG93bnJldi54bWxQSwUGAAAAAAQABADzAAAAjQUAAAAA " strokecolor="red" strokeweight="2pt">
Дата добавления: 2015-05-30; просмотров: 828;