Додаток 1. Лістинг програми. chas equ 10000 ; час затримки 10 мс. chasx equ 65535-chas org 0000 ; вектор рестарту jmp start org #0Bh ; вектор обробки переривання від таймера jmp timer org #0100h ; адреса початку програми start: mov SP, #10H ; 3-ій банк регістрів використаємо під стек anl PSW, #0EFH ; перемикання на 1-ий банк orl PSW, #08h mov P1, #0FFh ; всі розряди встановлюємо 1 mov P2, #0FFh ; mov P3, #0FFh ; mov R6, #10h ; сигнал вибору діапазону X1: mov R3,#0h mov IP, #00h ; пріоритет переривань mov IE, #00h ; заборона переривань mov TMOD, #01h ; задання режиму роботи лічильника cjne R6, #010h, mit ; вибір транзистора для розряджання конденсатора cjne R6, #020h, mit mov P1, #04h mit: mov P1, #02h mov DPTR, #chasx; ; запис у таймер mov TH0, DPL mov TL0,DPH setb ET0 ; дозвіл переривань від лічильника setb EA ; глобальний дозвіл setb TR0 ; запуск лічильника mov P1, R6 ; початок заряду
X2: cjne R3, #0, X3 ; перевірка ознаки переривання mov A, P1 jz X2 mov TCON,#0h ; зупинка таймера mov R2,TL0 ; заносимо молодший розряд в R2 mov R7,TH0 ; заносимо молодший розряд в R7 call decode ; виклик підпрограми дешифрації jmp X1 X3: mov A, R6 rlc A ; зміна діапазону jc error ; підпрограма помилки mov R6, A jmp X2 error: mov P2, #0h mov P3, #0h z: jmp z Підпрограма конвертування у двійково-десяткову decode: mov A, R7 push Acc mov A, R2 push Acc anl PSW, #0E7H ; перемикання на 0-ий банк регістрів pop Acc mov R0, A pop Acc mov R1, A mov B, #5 Conv: mov R3, #0 mov R2, #0Ah push B call UDIV16 pop B mov A, R2 ; збереження залишку в стеку push Acc djnz B, Conv Wled: pop Acc ; індикація старшого розряду pop Acc anl A, #0Fh; mov P2, A pop Acc rlc A rlc A rlc A rlc A anl A, #0F0h orl P2, A pop Acc anl A, #0Fh; mov P3, A pop Acc ; індикація молодшого розряду rlc A rlc A rlc A rlc A anl A, #0F0h orl P3, A anl PSW, #0EFH ; перемикання на 1-ий банк orl PSW, #08h ret timer: mov R3, #0h reti $include (math.asm) END