Текст програми:
Delay equ 0220h | Delay – адреса затримки 1 сек. |
Button equ 0fff2h | button відповідає адресі перемикачів |
ldiodequ 0fff1h | ldood відповідає адресі світодіодів |
cseg | директива повідомляє про початок сегмента коду |
callDelay | затримки 2із для можливості установки |
callDelay | потрібного значення на перемикачах |
movdptr,#button | завантаження в dptr адреси перемикачів |
movxa,@dptr | збереження стану перемикачів в А |
xrl a,#11001001 | інвертування зазначених бітів А |
movdptr,#ldiod | завантаження в dptr адреси світодіодів |
movx @dptr,a | відображення на лінійці світодіодів кінцевого значення |
16. Проінвертувати 1, 2, 4, 6, 7 біти порту В, і видати отримане слово на порт А стенда УУМС-2Текст програми:
Текст програми:
port equ0fffch | ;port адреса порту А |
port equ 0fffdh | ;port адреса порту В |
regcon equ0ffffh | ;regcon адреса регістра керування |
cseg | ;директива початку сегмента коду |
mov a,#10010000b | ;порт А – вивід, У и С – уведення |
movdptr,#regcon | ;запис в regcon керуючої інформації |
movx @dptr,a | ;настроювання ППИ |
movdptr,#port | ;завантаження адреси порту В (прийом) |
movxa,@dptr | ;зчитуємо значення з порту В |
xrla,#01101011b | ;інвертуємо зазначені біти |
mov dptr,#port | ;завдання адреси порту А |
movx @dptr,a | ;виводимо на порт А значення з;проінвертованими бітами |
17. Програма видає вміст акумулятора в послідовному коді через зазначену лінію порту, залишаючи без зміни інші біти порту. Передача виробляється з молодшого біта.
cseg | ;сегмент коду | |
org 2000h | ;початкова адреса програми | |
MOV R2, #8 | ;лічильник біт => R2 | |
MET: | RRC A | ;зрушення Асс через прапор З |
MOV P1.0, C | ;передача біта в Порт Р1 | |
NOP | ;виклик затримки | |
DJNZ R2, MET | ;зменшення лічильника й повтор |
18. Програма організує послідовну передачу даних акумулятора на зазначений вивід порту в манчестерському коді. Біт передається двома інтервалами: перший - інверсія, другий - пряме значення біта.
Текст програми:
cseg | ;сегмент коду | |
org 2000h | ;початкова адреса програми | |
mov R0,#8 | ;лічильник | |
loop: | rrc a | ;зсув А вправо через прапор переносу |
cpl c | ;інвертування біта | |
mov P2.0,c | ;передача інверсного значення біта | |
cpl c | ;відновлення прямого значення біта | |
call 0230h | ;затримка для вирівнювання тривалості інтервалів | |
mov P2.0,c | ;передача прямого значення біта | |
djnz R0,loop | ;цикл |
ІНДИВІДУАЛЬНІ ПРОЦЕДУРИ
1. Процедура відображення уведеної з перемикачів інформації на семисегментном індикаторі в шестнадцатеричном коді.
Уведення й відображення значень перемикачів здійснюється за допомогою регістра DPTR по адресах відповідно 0FFF2h й 0FFF1h.
Візуалізацію здійснює процедура visual, що послідовно виділяє те молодшу, те старшу частину слова для конвертування 4 біт двійкової системи вирахування в код семисегментного індикатора, відповідно до таблиці символів get_num.
Відповідно до алгоритму роботи програми варто написати код програми.
Текст програми:
cseg | ||
org 2000h | ||
jmp main | ||
main: | ||
loop: | mov DPTR,#0FFF2h | ;прийняття значень перемикачів |
movx A,@DPTR | ||
mov DPTR,#0FFF7h | ;завдання нач. адресі СС індикатора для процедури візуалізації | |
call visual | ;виклик процедури візуалізації | |
call 0203h | ;затримка для фіксації значення | |
sjmp loop | ;цикл сканування перемикачів | |
visual: | mov R0,A | ;в R0 зберігається тимчасове значення аккум. |
anl A,#0Fh | ;виділення мол. 4 біт | |
call get_num | ;конвертування в СС-код | |
movx @DPTR,A | ;вивід | |
inc DPTR | ;наступна цифра | |
mov A,R0 | ;перезапис значення | |
swap A | ; виділення ст. 4 біт | |
anl A#0Fh | ||
call get_num | ;конвертування в СС-код | |
movx @DPTR,A | ;вивід | |
ret | ||
get_num:inc A | ;функція одержання семисегметного коду | |
movx A,@A+PC | ;таблиця кодів | |
db 00111111b | ;0 | |
db 00000111b | ;1 | |
db 01011011b | ;2 | |
db 01001111b | ;3 | |
db 01100110b | ;4 | |
db 01101101b | ;5 | |
db 01111101b | ;6 | |
db 00000111b | ;7 | |
db 01111111b | ;8 | |
db 01101111b | ;9 | |
db 01110111b | ;A | |
db 01111101b | ;B | |
db 00111001b | ;C | |
db 01011110b | ;D | |
db 01111001b | ;E | |
db 01110001b | ;F | |
ret |
2. Функція уведення числа й паралельного його відображення з можливістю підтвердження уведення.
Уведення й відображення значень перемикачів здійснюється за допомогою регістра DPTR по адресах відповідно 0FFF2h й 0FFF1h.
Для фіксації значень у кожному з доступних регістрів використається зовнішнє переривання INT0(перехід з 1 в 0), в оброблювачі переривання якого й записаний код збереження значення.
Алгоритм роботи програми:
Текст програми:
cseg | ||
org 2000h | ||
jmp main | ||
org 2003h | ;початок переривання по INT0 | |
mov DPTR,#0fff2h | ;опитування перемикачів | |
movx A,@DPTR | ||
mov DPTR, #0fff1h | ;вивід значень перемикачів | |
movx @DPTR,A | ||
call 0230h | ;затримка 50млС | |
mov IE,#0 | ;для закінчення програми | |
reti | ||
main: | mov IE, #10000001b | ;дозволу переривання |
loop: | mov DPTR,#0fff2h | ;опитування перемикачів |
movx A,@DPTR | ||
mov DPTR, #0fff1h | ;вивід значень перемикачів | |
movx @DPTR,A | ||
sjmp loop | ;нескінченний цикл сканування до переривання |
3. Просуммировать два уведених значення й суму записати в DPTR.
Уведення й відображення значень перемикачів здійснюється за допомогою регістра DPTR по адресах відповідно 0FFF2h й 0FFF1h.
Текст програми:
cseg | ||
org 2000h | ||
jmp main | ||
org 2003h | ||
clr EX0 | ||
jmp INT_0 | ||
main: | mov IE, #10000001b | ;дозволу переривання |
mov R7,#0 | ;лічильник операндов | |
setb IT1 | ||
loop: | mov DPTR,#0fff2h | ;опитування перемикачів |
movx A,@DPTR | ||
mov DPTR, #0fff1h | ;вивід значень перемикачів | |
movx @DPTR,A | ||
sjmp loop | ;нескінченний цикл сканування до переривання | |
INT_0: | clr IT1 | ;змінити фронт спрацьовування переривання |
mov DPTR,#0fff2h | ;опитування перемикачів | |
movx A,@DPTR | ||
mov DPTR, #0fff1h | ;вивід значень перемикачів | |
movx @DPTR,A | ||
mov R6,A | ;запам'ятовування поточних значень перемикачів | |
mov A,R7 | ;для перевірки на кількість уведених операндов | |
jz nul | ;уведено два операнда? | |
mov A,R6 | ;да | |
mov R1,A | ;додавання операндов | |
add A,R0 | ||
mov R0,A | ;для виводу за допомогою процедури SSI_W | |
call 0940 | ;вивід | |
mov DPL,A | ;запис значення в DPTR | |
jmp exit | ;кінець програми | |
nul: | mov A,R6 | ;немає |
mov R0,A | ;збереження першого операнда | |
inc R7 | ;наступний буде вводитися другий операнд | |
setb EX0 | ;дозволу переривання | |
jmp ex | ;вихід із процедури уведення | |
exit: | mov R7,#0 | ;для закінчення програми |
ex: | reti |
4. Секундомір. Програма використає апаратні засоби відліку тимчасових інтервалів - таймер 0 (200Bh). Час виводиться на ССИ за допомогою стандартної процедури 0940 (для цього потрібне значення потрібно помістити в регістр R0). Програма виконується в зацикленому стані.
Алгоритм роботи програми:
Текст програми:
cseg | ||
org 2000h | ||
jmp main | ;перехід до виконання головної програми | |
org 200Bh | ||
jmp timer | ;перехід до виконання програми обробки переривання | |
main: | mov TMOD,#01h | ;включаємо 16 – розрядний таймер |
mov IE,#10000010b | ;дозволяємо переривання від таймера | |
mov TL0,#LOW(555) | ;завантаження значення для відліку – 50мС | |
mov TH0,#HIGH(555) | ||
mov R0,#1 | ;початку з 1 секунди | |
call 0940h | ;візуалізація секунд | |
setb TR0 | ;старт таймера | |
loop: | sjmp loop | ;нескінченний цикл |
timer: | clr TR0 | ;зупинка таймера |
inc R7 | ;20*50мС=1С | |
cjne R7,#20,out | ;пройшла 1С? | |
mov R7,#0 | ;так – обнуління лічильника циклів по 50мС | |
inc R0 | ;пройшла 1С – инкремент показника секунд | |
cjne R0,#60,out1 | ;пройшла 1 хвилина? | |
mov R0,#1 | ;так - секунди = 1 | |
out1: | call 0940h | ;показати секунди |
out: | mov TL0,#LOW(555) | ;завантаження значення для відліку – 50мС |
mov TH0,#HIGH(555) | ||
setb TR0 | ;старт таймера | |
reti | ;кінець підпрограми обробки переривання |
5. Стан перемикача INT0. Завдяки цій програмі можна обробляти переривання від INT0 без використання переходів на програма-оброблювач переривань і сканувати стан цього виводу порту P3 як скануються перемикачі. Принцип програми складається зі сканування всього порту й виділення із цього значення потрібного біта(другого). У судячи із цього біта визначається сигнал на INT0. Програма циклічно сканує порт і відповідно до зазначеного біта видає значення на лінійку светодиодов. Два значення - усі запалені - INT0=1; Половина запалена - INT0=0