Перейти к содержанию

Сортировка элементов массива


erbi

Рекомендуемые сообщения

Здравствуйте, эта программа снимает показания АЦП с 0-го входа АЦП. Поностью эта прграмма имет вид.

; //--------------------------------------------------------------//

; // Описание : Lab. Work (ASM Version) //

; // Copyright : MIREA, 1998 - 2000 //

; // Процессор : МК 51 //

; // Версия : 1.0 //

; // Ассемблер : A51 v. 6.02 //

; // Дата : XX.XX.2001 //

; // Комментарии : Файл-заготовка //

; //--------------------------------------------------------------//

; --- Заголовок программы. Не изменяйте его !!! ----

NAME LAB_DEMO

USING 0 ; Использовать банк регистров 0

Jmp Start ; Начало программы

ORG 03h

LJmp Ext0Srv ; Адрес обработчика EXT INT 0

ORG 0BH ; Адрес обработчика TIMER INT 0

LJmp Time0Srv ;

ORG 13H ; Адрес обработчика EXT INT 1

LJmp Ext1Srv ;

ORG 1BH ; Адрес обработчика TIMER INT 1

LJmp Time1Srv ;

ORG 23H ; Адрес обработчика прерывания от

LJmp RiTiSrv ; последовательного порта

; --- Конец заголовка ----

;---------- Здесь вводите код программы ----------

; Программа выполняет следующие действия:

; 1. Начальная инициализация ЖКИ-модуля: устанавливается 8-разрядная

; шина обмена, возможность отображения в две строки, размер символов 5х7,

; без курсора, последовательность вывода символов слева направо.

; 2. Снятие показаний с 0-го входа АЦП

; 3. Вывод в первую строку ЖКИ-модуля снятых показаний АЦП (только старших 8 разрядов)

; ПРИМЕЧАНИЕ 1:

; - запись в регистр команд ЖКИ-модуля производится по адресу 7FC0H

; - чтение из регистра команд ЖКИ-модуля - по адресу 7FC1H

; - запись в регистр данных ЖКИ-модуля - по адресу 7FC2H

; обращение к регистрам ЖКИ-модуля производится через внешнюю память

; посредством 16-разрядного регистра DPTR

; ПРИМЕЧАНИЕ 2:

; - обращение к регистру команд АЦП производится по адресу C5H

; - обращение к регистру данных АЦП - по адресу C6H

; (адреса регистров специальных функций, в том числе АЦП приведены

; в учебном пособии на стр. 34,

; назначение битов команд АЦП приведено в уч. пособии на стр. 43)

ORG 8000H

Start:

; Определение констант

ADR_REGDAT_FOR_WRITE EQU 7FC2H ; адрес регистра данных ЖКИ для записи

ADR_REGCOM_FOR_WRITE EQU 7FC0H ; адрес регистра команд ЖКИ для записи

LCD_INTERFACE EQU 38H ; код команды выбора интерфейса (8 разрядов)

; количества строк (2 строки), размера символов (5х7)

MOVING_SYMBOL_RIGHT EQU 06H ; инкремент счетчика адресов, т.е.

; выбор направления сдвига курсора (слева направо),

; без сдвига экрана

LCD_CLEAR EQU 01H ; очистка экрана

LCD_ON EQU 0CH ; включение экрана

SECOND_LINE EQU 0C0H ; переход на вторую строку

; Инициализация ЖКИ-модуля

MOV DPTR,#ADR_REGCOM_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#LCD_INTERFACE ; код команды выбора интерфейса

MOVX @DPTR,A ; запись кода команды в регистр команд

CALL DELAY16ms ; задержка на время выполнения команды

; (вызов подпрограммы задержки DELAY5ms)

MOV A,#MOVING_SYMBOL_RIGHT ; код команды инкремента счетчика адресов после записи

MOVX @DPTR,A

CALL DELAY16ms

MOV A,#LCD_CLEAR ; очистка экрана

MOVX @DPTR,A

CALL DELAY16ms

MOV A,#LCD_ON ; включение экрана

MOVX @DPTR,A

CALL DELAY16ms

; Заполнения массива во внутренней памяти (6 элементов)

MOV 10H, #3

MOV 11H, #45

MOV 12H, #55

MOV 13H, #60

MOV 14H, #5

MOV 15H, #10

; Вывод элементов массива на ЖКИ

MOV R1, #10H ;Адрес начала массива в памяти

MOV R0, #6 ;Число элементов массива

LOOP_2: MOV A, @R1

INC R1

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

CALL NUM_OUT2

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#' ' ; Пробел

MOVX @DPTR,A ; запись в регистр данных

CALL DELAY16ms

DJNZ R0, LOOP_2

; Снятие показаний с 0-го входа АЦП

ADC_COM_ADR EQU 0C5H ; адрес регистра команд АЦП

ADC_DAT_ADR EQU 0C6H ; адрес регистра данных АЦП

MOV ADC_DAT_ADR,#0H ; обнуление регистра данных АЦП

MOV ADC_COM_ADR,#00101000B ; команда начала аналого-цифрового преобразования

; сигнала с 0-го входа АЦП

IDET_ACP: MOV A,ADC_COM_ADR ; ожидание завершения преобразования

JB ACC.3,IDET_ACP ; Если 3-й бит регистра команд АЦП равен 1,

; следовательно преобразование еще не закончено.

MOV A,ADC_DAT_ADR ; считывание старших 8 разрядов результата

; преобразования в аккумулятор

MOV 9H, A ;Число, снятое с АЦП по адресу 9H

MOV 8H, #0 ;Число элементов, больше чем АЦП

MOV R1, #10H ;Адрес начала массива в памяти

MOV R0, #6 ;Число элементов массива

LOOP_3: MOV A, @R1 ;Загружаем текущий элемент в A

INC R1

DJNZ R0, NEXT_2 ;Цикл до конца массива

JMP NEXT

NEXT_2: CJNE A, 9H, DAL

JMP LOOP_3

DAL: JNC LOOP_3

MOV A, 8H ;Увеличиваем число элементов, снятых с АЦП

INC A

MOV 8H, A

JMP LOOP_3

NEXT: MOV DPTR,#ADR_REGCOM_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#SECOND_LINE ; Переход на вторую строку

MOVX @DPTR,A

CALL DELAY16ms

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A, 8H

CALL NUM_OUT2 ;Кол-во элементов, большее, чем АЦП

;Выводим значение АЦП

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#' ' ; Пробел

MOVX @DPTR,A ; запись в регистр данных

CALL DELAY16ms

MOV A,#'(' ; Скобка

MOVX @DPTR,A ; запись в регистр данных

CALL DELAY16ms

MOV A, 9H ; Выводим показания АЦП

CALL NUM_OUT2

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#')' ; Скобк

MOVX @DPTR,A ; запись в регистр данных

CALL DELAY16ms

JMP LOOP ; Конец программы

; Выделение цифр числа (справа налево) и запись цифр в стек

NUM_OUT2: MOV R3,#0H ; R3-содержит количество десятичных цифр в числе

Get_cifr: MOV B,#0AH ; (B) <- 0AH

DIV AB ; (A) <- (A)/(B), (B) <- остаток от деления

; Остаток от деления числа на 10 является очередной десятичной цифрой числа

PUSH B ; (СТЕК) <- (B) (Запись цифры в стек)

INC R3 ; (R3) <- (R3) + 1

CJNE A,#0H,Get_cifr ; Проверка (A) на равенство 0

; Если (A) = 0, то все цифры числа выделены

; Если (A) != 0, то переход по метке Get_cifr

; Вывод цифр числа (слева направо) на ЖКИ

Num_out: POP 10H ; (ОЗУ[10H]) <- (СТЕК)

MOV A,10H ; (A) <- (ОЗУ[10H])

ADD A,#30H ; (A) <- (A) + 30H

; Преобразование цифр в соответствующие ASCII-коды

; (30H - ASCII-код цифры '0')

MOVX @DPTR,A

CALL DELAY16ms

DJNZ R3,Num_out ; Все ли цифры выведены?

RET

LOOP: SJMP LOOP ; Конец программы

; Подпрограмма задержки на 1 мс

; Тактовая частота микроконтроллера 11059 кГц

; В одном машинном цикле 12 тактов

; Команда DJNZ выполняется за 2 машинных цикла

; Подпрограмма выполяется за T=25*18*2 ~ 11059 тактов, т.е. за 1 мс

DELAY1ms: MOV R1,#25

L1: MOV R2,#18

L2: DJNZ R2,L2

DJNZ R1,L1

RET ; Возврат из подпрограммы

; Подпрограмма задержки на 4 мс

DELAY4ms: CALL DELAY1ms

CALL DELAY1ms

CALL DELAY1ms

CALL DELAY1ms

RET ; Возврат из подпрограммы

; Подпрограмма задержки на 16 мс

DELAY16ms: CALL DELAY4ms

CALL DELAY4ms

CALL DELAY4ms

CALL DELAY4ms

RET ; Возврат из подпрограммы

; Обработчики прерываний.

Ext1Srv: RETI

Time0Srv: RETI

Time1Srv: RETI

RiTiSrv: RETI

Ext0Srv: RETI

Эта программа должна снимать показания АЦП с нулевого входа, и выводить их на экран ЖКИ. Я пыался сделать ее правильно, но запутался с массивом (мне кажется он здесь не нужен), а как сделать эту прграмму структурированной, чтобы каждая часть была ввиде подпрограммы. Вначале, идет Инициализация ЖКИ это я понял сделать ввиде INIT_LCD:, а вот как быть с АЦП, и массивом я не понимаю. А прерывания преподаватель говорит не надо делать, так как он сказал, что они встроенны уже в сам симмулятор.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 80
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Здравствуйте, извините, что опять обращаюсь, я попытался открыть файл, а там на непонятном языке написано. Может мне надо отраывать не в блокноте. Не моглибы еще раз выложиь файл.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Здравствуте, извините что обращаюсь, хотел спросить, для того чтобы выводить на ЖКИ по шине I2C часы реального времени и показания АЦП, нужно ли делать инициализаию шины I2C, просто я проверил программу задачи, и он мне вывил просто пустой экран, преподаватель говорит что у меня нет инициализации шины I2C? извините не могли бы еще раз написать программу Задача: "С клавиатуры ПК подать одну из двух команддля микроконтроллера. Первая команда должна обеспечиватьвывод на ЖКИ показания АЦП, вторрая - вывод на ЖКИ текущее время с предварительно выделенным словом TIME." - просто я сделал эту программу ее откомпилировал ошибок нет, а на экране ЖКИ ничего нет. Скажите, а какие кнопки надо давить чтобы видно было.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Извинияюсь за ошибки в программе.

Вот, исправил немного:adc_time_2.txt

В начале, после включения на ЖКИ не будет ничего.

Программа ждет, пока через УАПП от компа придут данные.

Если в терминальной программе нажать и отпустить клавишу "1" или "2", то ASCII код этой клавиши уйдет в УАПП МК и программа отреагирует на это.

Теперь по поводу I2C. Этот интерфейс реализуется программно безо всяких проблем.

Для удобства, некоторые вещи которые могут быть автоматизированы, внедряются производителями в МК на аппаратном уровне.

Тогда, возможно потребуются некоторые настройки этого интерфейса, что и подразумевал преподаватель (правда после его фразы об инициализации шины I2C мое мнение о нем изменилось не в лучшую сторону, т.к. не представляю, чего там такого инициализировать).

Вполне возможно, что у МК от Philips на этой плате так и сделано, и что-то там надо инициализировать.

Но! Я не нашел конкретно на этот тип МК справочной информации (чтоб воспользоваться всеми преимуществами встроенного I2C интерфейса), и чтоб не попасть пальцем в небо сделал что? Правильно, сделал чисто программную реализацию протокола I2C между мастером (МК) и ведомым (ИМС часов реального времени), путем записи чтения соответствущих бит в порту МК, которые физически подключены к проводам SCL и SDA по принципиальной схеме. Имею, надо сказать, на это полное право.

Какие еще будут вопросы?

Ссылка на комментарий
Поделиться на другие сайты

Спасибо. Что откликнулись. Я тут набрал программу вывода часов реального времени пока без нажатия платы, инициализация I2C он представляет так. Я что то сам не пойму, что он хочет. Но вот что он нам дал в конспекте, я попытался набрать но, откомпилировать этот файл я так и не смог, постоянно выплевываеь ошибку, то ли он что то забыл написать на доске. Потому что стал набирать программу сразу нашел штук пять ошибок. Можете посмотреть, в чем я ошибаюсь. У нас вчера была лабораторная работа, с АЦП как то проскочили, а теперь ему нужно шину I2C, в конспекте очень слоно разобратся. Все что он дал я набрал.

Вот сама программа:

; //--------------------------------------------------------------//

; // Îïèñàíèå : Lab. Work (ASM Version) //

; // Copyright : MIREA, 1998 - 2000 //

; // Ïðîöåññîð : ÌÊ 51 //

; // Âåðñèÿ : 1.0 //

; // Àññåìáëåð : A51 v. 6.02 //

; // Äàòà : XX.XX.2001 //

; // Êîììåíòàðèè : Ôàéë-çàãîòîâêà //

; //--------------------------------------------------------------//

; --- Çàãîëîâîê ïðîãðàììû. Íå èçìåíÿéòå åãî !!! ----

NAME LAB_DEMO

USING 0 ; Èñïîëüçîâàòü áàíê ðåãèñòðîâ 0

Jmp Start ; Íà÷àëî ïðîãðàììû

ORG 03h

LJmp Ext0Srv ; Àäðåñ îáðàáîò÷èêà EXT INT 0

ORG 0BH ; Àäðåñ îáðàáîò÷èêà TIMER INT 0

LJmp Time0Srv ;

ORG 13H ; Àäðåñ îáðàáîò÷èêà EXT INT 1

LJmp Ext1Srv ;

ORG 1BH ; Àäðåñ îáðàáîò÷èêà TIMER INT 1

LJmp Time1Srv ;

ORG 23H ; Àäðåñ îáðàáîò÷èêà ïðåðûâàíèÿ îò

LJmp RiTiSrv ; ïîñëåäîâàòåëüíîãî ïîðòà

; --- Êîíåö çàãîëîâêà ----

;---------- Çäåñü ââîäèòå êîä ïðîãðàììû ----------

ORG 8000H

adr_for_write equ 7FC0H

lcd_interface equ 00111000B

mov_screen_right equ 00000110B

lcd_clr equ 01H

lcd_on equ 0Eh

;dpl EQU 82h

;dph EQU 83h

s1con equ 0d8h

s1dat equ 0dah

s1adr equ 0dbh

s1sta equ 0d9h

sta equ s1con.5

sto equ s1con.4

si equ s1con.3

Start:

call init_LCD

call init_i2c

call read_hoers

call out_hex

call dots

call read_min

call out_hex

call dots

call read_sec

call out_hex

Loop: sjmp Loop

init_LCD: mov DPTR,#adr_for_write

mov a,#lcd_interface

movx @dptr,a

call delay5ms

mov a,#mov_screen_right

movx @dptr,a

call delay5ms

mov a,#lcd_on

movx @dptr,a

call delay5ms

mov a,#lcd_clr

movx @dptr,a

call delay5ms

ret

init_i2c: setb p1.6

setb p1.7

mov s1con, #11001101b

ret

read_hoers: call start_bit

call test_i2c

mov s1dat, #0a2h

clr si

call wait_si

call test_i2c

mov s1dat, #04

clr si

call wait_si

call test_i2c

call start_bit

call test_i2c

mov s1dat, #0a3h

clr si

call wait_si

call test_i2c

clr si

call wait_si

call test_i2c

mov r4, s1dat

mov a, s1dat

ret

start_bit: set sta

clr si

call wait_si

clr sta

ret

wait_si: jnb si, wait_si

ret

test_i2c: push acc

mov a, s1sta

call out_hex

pop acc

ret

read_min: call start_bit

call test_i2c

mov s1dat, #0a2h

clr si

call wait_si

call test_i2c

mov s1dat, #04

clr si

call wait_si

call test_i2c

call start_bit

call test_i2c

mov s1dat, #0a3h

clr si

call wait_si

call test_i2c

clr si

call wait_si

call test_i2c

mov r4, s1dat

mov a, s1dat

ret

read_sec: call start_bit

call test_i2c

mov s1dat, #0a2h

clr si

call wait_si

call test_i2c

mov s1dat, #04

clr si

call wait_si

call test_i2c

call start_bit

call test_i2c

mov s1dat, #0a3h

clr si

call wait_si

call test_i2c

clr si

call wait_si

call test_i2c

mov r4, s1dat

mov a, s1dat

ret

out_hex: mov 7, a

anl a, #0f0h

swap a

add a, #30h

call symb

mov a,7

anl a, #0fh

add a, #30h

call symb

mov a, #'h'

call symb

mov a, #20h

call symb

ret

dots: mov, #':'

call symb

ret

SYMB: PUSH 82h

PUSH 83h

MOV DPTR,#7FC2H

MOVX @DPTR,A

CALL DELAY15MS

POP 83h

POP 82h

RET

delay5ms: call delay1ms

call delay1ms

call delay1ms

call delay1ms

call delay1ms

ret

delay1ms: mov r1,#90

l1: mov r2,#4

l2: djnz r2,l2

djnz r1,l1

ret

delay15ms:call delay5ms

call delay5ms

call delay5ms

ret

; Обработчики прерываний.

Ext1Srv: RETI

Time0Srv: RETI

Time1Srv: RETI

RiTiSrv: RETI

Ext0Srv: RETI

RetIE0: RETI

END

Ошибку выдает в месте где.dots и start_bit

В конспекте он дал, что должно быть в основной программе:

call init_LCD

call init_i2c

call read_hoers

call out_bdc

call dots

Что такое out_bdc я так и не понял. Она выглядит так:

out_bdc: mov 7, a

anl a, #0f0h

swap a

add a, #30h

call symb

mov a,7

anl a, #0fh

add a, #30h

call symb

ret

Он наверно имеет , ввиду что это одно и тоже что и out_hex, но очень сложно понять когда все время подпрограммы называть по разному.

Преподаватель требует чтобы в программе были подпрограммы symb: и echo:

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Ну вот. Нашел справку на МК касаемо I2C.

Что я и постил ранее: там полностью аппаратная реплизация I2C интерфейса.

Вот такой документ есть у вас? http://vss01.narod.ru/files/8sem/8_mpc_posobie.rar

Смотрите со страницы №41 какой там геморрой :) А ведь Филипс сам изобрел этот интерфейс ;)

По поводу проги. Как вам препод написал про I2C так и пишите. Тут я ничем помочь не смогу. Ни времени ни платы этой у меня нет.

Одно могу сказать, по сравнению с моим программным вариантом I2C без наворотов, буржуйский аппаратный вариант с наворотами - это полная задница.

Подпрограмма с названием "out_bdc" выводит двоично-десятичное число на ЖКИ. Байт данных для вывода должен находится в регистре R7.

Подпорграмма "symb" физически отправляет в регистр данных ЖКИ данные из аккумулятора. out_bdc и symb вместе дают результат - десятичное число на ЖКИ.

Что должна делать подпрограмма echo - често, не знаю. Не вижу её в тексте.

По поводу ошибок при компиляции. Поправьте синтаксис в строках:

- "start_bit: SET sta" на "start_bit: setb sta";

- "dots: mov, #':' " на " dots: mov A, #':' "

Должно скомпилироваться после этого.

И давайте еще договримся, чтоб было удобочитаемо, распологайте исходные тексты с использованием тегов

[codeboх], [/codeboх].
Например:
[codeboх]
Ваша программа
[/codeboх]

Результатом будет:
ORG 8000H
adr_for_write equ 7FC0H
lcd_interface equ 00111000B
mov_screen_right equ 00000110B
lcd_clr equ 01H
lcd_on equ 0Eh
;dpl EQU 82h
;dph EQU 83h 
s1con equ 0d8h
s1dat equ 0dah 
s1adr equ 0dbh
s1sta equ 0d9h
sta equ s1con.5 
sto equ s1con.4
si equ s1con.3
Start: 
call init_LCD 
call init_i2c
call read_hoers
call out_hex
call dots
call read_min
call out_hex
call dots 
call read_sec
call out_hex


Loop: sjmp Loop 
init_LCD: mov DPTR,#adr_for_write 
mov a,#lcd_interface 
movx @dptr,a 
call delay5ms 
mov a,#mov_screen_right 
movx @dptr,a 
call delay5ms
mov a,#lcd_on 
movx @dptr,a
call delay5ms
mov a,#lcd_clr 
movx @dptr,a
call delay5ms
ret 

init_i2c: setb p1.6
setb p1.7
mov s1con, #11001101b
ret
read_hoers: call start_bit
call test_i2c
mov s1dat, #0a2h
clr si
call wait_si
call test_i2c
mov s1dat, #04
clr si 
call wait_si
call test_i2c
call start_bit
call test_i2c
mov s1dat, #0a3h
clr si
call wait_si
call test_i2c
clr si
call wait_si 
call test_i2c
mov r4, s1dat
mov a, s1dat
ret
start_bit: set sta
clr si
call wait_si
clr sta
ret
wait_si: jnb si, wait_si
ret
test_i2c: push acc
mov a, s1sta
call out_hex
pop acc
ret
read_min: call start_bit
call test_i2c
mov s1dat, #0a2h
clr si
call wait_si
call test_i2c
mov s1dat, #04
clr si 
call wait_si
call test_i2c
call start_bit
call test_i2c
mov s1dat, #0a3h
clr si
call wait_si
call test_i2c
clr si
call wait_si 
call test_i2c
mov r4, s1dat
mov a, s1dat
ret
read_sec: call start_bit
call test_i2c
mov s1dat, #0a2h
clr si
call wait_si
call test_i2c
mov s1dat, #04
clr si 
call wait_si
call test_i2c
call start_bit
call test_i2c
mov s1dat, #0a3h
clr si
call wait_si
call test_i2c
clr si
call wait_si 
call test_i2c
mov r4, s1dat
mov a, s1dat
ret
out_hex: mov 7, a
anl a, #0f0h
swap a
add a, #30h
call symb
mov a,7
anl a, #0fh
add a, #30h 
call symb
mov a, #'h'
call symb
mov a, #20h
call symb
ret
dots: mov, #':'
call symb
ret
SYMB: PUSH 82h
PUSH 83h
MOV DPTR,#7FC2H
MOVX @DPTR,A
CALL DELAY15MS
POP 83h
POP 82h
RET 


delay5ms: call delay1ms
call delay1ms
call delay1ms
call delay1ms
call delay1ms
ret

delay1ms: mov r1,#90
l1: mov r2,#4
l2: djnz r2,l2
djnz r1,l1
ret

delay15ms:call delay5ms
call delay5ms
call delay5ms
ret

Удачи!

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, извините что опять обращаюсь, не могли бы проверить программу сортировки массива по возрастанию, у меня почему ошибку делать в данных FF в программе, если я меняю на 255 то нормально компелируется, а если FF то нет.

MAX_ITEM EQU 02Eh		; переменная для максимального значения.
IN_ADR EQU 030h		  ; начальный адрес размещения данных во внутренней памяти данных.
NUM_ITEM EQU 007h		; количество элементов массива.	   
org 0000h
jmp Start				; переход к началу программы.
org 0100h				; начало программы. 
Start:  mov SP, 0080h	; установка указателя стека. 
mov R0, #IN_ADR		  ; загрузка начальных данных во внутреннюю память данных. 
mov A, #255 
mov @R0, A
inc R0
mov A, #128 
mov @R0, A
inc R0
mov A, #16
mov @R0, A
inc R0
mov A, #0 
mov @R0, A
inc R0
mov A, #40 
mov @R0, A
inc R0
mov A, #108
mov @R0, A
inc R0
mov A, #127
mov @R0, A
call SORT_UP					; вызов подпрограммы SORT_UP.
SORT_UP: mov R7, #NUM_ITEM	  ; в R7 загружаем количество прходов N-1.   
IN_SORT_UP_3:  dec R7
push aR7						; сохраняем в стеке количество проходов.  
mov R0, #IN_ADR				 ; в R0 организуем указатель на n-й элемент массива. 
mov R1, #IN_ADR
inc R1						  ; в R1 организуем указатель на (n+1)-й элемент массива.
IN_SORT_UP_2: mov 02Eh, @R0	 ; начинаем проход. В переменную MAX_IYEM загружаем содержимое n элемента массива.
mov A, @R1					  ; в аккумулятор загружаем содержимое (n+1) элемента массива.
cjne A, MAX_ITEM, IN_SORT_UP_1  ; если (n+1)<n то необходимо поменять элементы местами (выполнить IN_SWAP_UP), 
IN_SORT_UP_1: jc IN_SWAP_UP	 ; иначе перейтди к IN_SORT_UP_4 
jmp IN_SORT_UP_4				 
IN_SWAP_UP: mov @R0, A		  ; на место n элемента загружается (n+1) элемент,  
mov @R1, MAX_ITEM;			 ; на место (n+1) элемента загружается n элемент.
IN_SORT_UP_4 : inc R0		   ; увеличваем указатель на элемент массива
inc R1						  ; увеличваем указатель на элемент массива 
djnz R7, IN_SORT_UP_2		   ; уменьшаем содержимое R7 и повторяем проход если R7 не достигло нуля.
pop aR7						 ; восстанавливаем из стека данные о выполненом проходе, 
djnz R7, IN_SORT_UP_3		   ; уменьшаем на 1 количество шагов в следующем проходе, и повторяем если не достигнут конец.
ret							 ; возврат из подпрограммы.

Loop:		sjmp  Loop  


; Обработчики прерываний. 	

Ext1Srv:	 RETI

Time0Srv:	RETI

Time1Srv:	RETI

RiTiSrv:	 RETI

Ext0Srv:	 RETI

RetIE0:	  RETI

END

Скажите, вот при коспиляции появляется ошибка при значении FF, можно ли ее изменить как то. Скажите, а как можно посмотреть в этой программе как именно он сортирует массив. Я посмотрел по отладке, вроде идет что то, но как именно проверить правильно ли он отсортировал его или нет. Это нельзя сделать. Это самая первая программа в этой теме.

Заранее благодарен.

Изменено пользователем erbi
Ссылка на комментарий
Поделиться на другие сайты

По поводу FF. Для компилятора важно, чтобы после # первым знаком была цифра.

Поэтому если число десятичное, то всё компилируется ок. А если пишите шестнадцатиричное то сначала ставьте цифру ноль.

Например: mov A,#0FFh

Как посмотреть результаты программы.

Компилируешь, запускаешь.

Открываешь в меню "Вид" "Окно памяти".

Указываешь начальный адрес отображения ОЗУ в появившемся окне (например ноль).

По шагам выполняешь прогу и смотришь в ОЗУ результат.

Ничего сложного тут нет.

Извините. Ошибки все подправил, эмулировал, всё ок!

Весь текст собрал в файл. В окне компиляторе просто сотрите всё, и вставьте текст из файла. Ок?

sort_up_work.TXT

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
  • 5 лет спустя...

Всем доброго времени суток! Срочно нужна помощь в программирование на ассемблере под контроллер МКС-51. Сам я новичок и понимаю очень мало в этом деле.

Вот собственно постановка задачи:

Составить программу сортировки массива. Заданно: Массив состоит из 6х6 однобайтных элементов и размещается в памяти программ контроллера по строкам с адреса 60Н. Преобразовать этот массив таким образом, что бы элементы в каждой строке были размещены по возрастанию. Полученный массив разместить во внутренней памяти данных с адреса 40Н.

Помогите кто может как можно быстрее, буду очень признателен.

По возможности прокомментируйте каждую строку программы. Буду очень признателен! Заранее спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Что-то знакомое задание. Где-то, примерно полгода-год назад, я это уже видел. Может даже не на этом форуме (на коте вроде).

Неужели до сих пор не сделали ? :huh:

Ссылка на комментарий
Поделиться на другие сайты

в начале этой же темы

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Массив состоит из 6х6 однобайтных элементов <...> что бы элементы в каждой строке были размещены по возрастанию
То есть не один массив сортировать а 6 независимых. А про один массив как раз в начале и было

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Алгоритм очень простой, нужно сделать 6 повторений цикла поиска наименьшего с записью результата по новому адресу. Я б помог, но к сожелению не знаю набора команд для 51.

Ссылка на комментарий
Поделиться на другие сайты

На коте есть, но там так и не решили проблему. Есть файл там прикрепленный к сообщению той девушки, которая просила там помощи в теме.

Вот ссылка туда http://www.radiokot.ru/forum/viewtopic.php?f=20&t=43236

Но там не то! там сортирует весь массив, а нужно построчно. Алгоритм и чисто теоретически я тоже понимаю :yes: но мне нужно, что бы помогли программу написать(тоесть написали) :yes: нужно на контрольную работу по зарез :( я написать не смогу :(

Форумчане, помогите, плиз!

Массив состоит из 6х6 однобайтных элементов <...> что бы элементы в каждой строке были размещены по возрастанию
То есть не один массив сортировать а 6 независимых. А про один массив как раз в начале и было

суть не в том 6 независимых или построчно 1. Результат будет же выглядеть так, что 36 символов будут разбиты на группы по 6 и упорядочена каждая группа по возрастанию.

Результат идентичный и так и так должен быть. На словах, в общем и умный :umnik2: , а мнемокод помогите написать, пожалуйста! :yes:

Ссылка на комментарий
Поделиться на другие сайты

36 символов будут разбиты на группы по 6
по какому-то алгоритму или 1-6 в I группу, 7-12 во II, 13-18 в III и так далее?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

36 символов будут разбиты на группы по 6
по какому-то алгоритму или 1-6 в I группу, 7-12 во II, 13-18 в III и так далее?

читайте постановку задачи, там все доступно описано :yes: Да, вы правы, получается эти группы, что вы описали, нужно отсортировать каждую отдельно с меньшего к большему, то есть по возрастанию...

Кто поможет??? :unknw:

Просто массив двухмерный, представьте 6 столбцов и 6 строк. Каждую СТРОКУ упорядочить по возрастанию ну и поместить по адресу, который в задании. Но под МКС-51 задать двухмерный массив явно нельзя, поэтому исходными данными будет являться строка из 36 символов. Как показать, что отсортирован двухмерный массив? - упорядочить каждую строку мнимого двухмерного массива(то есть каждых 6 элементов) по возрастанию, КАЖДУЮ СТРОКУ сортировать отдельно, а не весь массив вкуче.

Ссылка на комментарий
Поделиться на другие сайты

а не весь массив вкуче
А весь массив в куче Вы сможете отсортировать ? :)

вот как раз здесь http://www.radiokot....hp?f=20&t=43236 и есть решение задачи сортировки массива в целом (там в прикоепленном файле в сообщении девушки, котора искала ответ на такую же задачу, как и у меня), но никак ни построчно.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...