Использование параллельных портов в программах на языке ассемблер и 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; просмотров: 773;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.012 сек.