исуємо в акумулятор старший біт DPTR, і зменшуємо акумулятор на 1 і переходимо на мітку gruppa7700 де зі старшого байта записаного в R0 віднімаємо число, що зберігається в акумуляторі. Якщо прапор переносу встановиться, це означає, що наше число більше 776. Переходимо на мітку sravn8300, де продовжимо порівнювати отримано значення. Якщо ж прапор переносу встановився, це означає, що наше число менше 776, що відповідає групі «шлюб». Переходимо на мітку шлюб.
jc perenos7700neperenos7700: A, DPH
dec A gruppa7700: A, DPHgruppa7700: CA, R0sravn8300
jc brak
За допомогою умовних переходів потрапляє на мітку brak, і збільшує значення регістра R7 на одиницю, а так само виводить код групи в паралельному інверсному коді.
Brak: R7
Для виведення коду груп використовуємо висновки P2.1 і P2.2. Групі «Шлюб» відповідатиме код «11»:
setb P2.1P2.2
Запишемо в акумулятор і згодом в командний регістр LCD команду x01h. Ця команда очищає дисплей. Викликаємо підпрограму, яка передає цю настройку в LCD:
mov A, # 01hLSDSetup.
після чого перейдемо на індикацію: indic
Аналогічним чином порівнюємо число отримане в DPTR, з пороговими значеннями періодів інших груп. Такі ж дії відбуватимуться при переході програми на мітки gruppa3, gruppa2 і gruppa1. Відмінності становлять лише коди груп і регістри, що відповідають за кожну групу:
gruppa3: R6
Для третьої групи буде встановлений код «01»:
setb P2.1P2.2indic
gruppa2: R5
Для групи 2 код «10»:
setb P2.1P2.2indic
gruppa1: R4
Групі 1 буде відповідати код «00»:
clr P2.1P2.2indic
Тепер приступимо до індикації.
indic:
mov A, # 31h
call symbol
Запишемо в акумулятор код символу «:» і викличемо підпрограму індикації:
mov A, # 3Ahsymbol
Запишемо в акумулятор число мікросхем, що відносяться до першої групи, додаємо старшу тетраду і викличемо підпрограму індикації:
mov A, R4A, # 30hsymbol
Виведемо на індикацію пробіл:
mov A, # 00hsymbol
Повторюємо теж саме для групи 2, 3 і групи «Шлюб»:
mov A, # 32hsymbol
mov A, # 3AhsymbolA, R5A, # 30hsymbolA, # 00hsymbolA, # 33hsymbolA, # 3AhsymbolA, R6A, # 30hsymbol
mov A, # 00hsymbol A, # 34hsymbolA, # 3Ahsymbol
mov A, R7A, # 30h symbol
Після закінчення обробки переривання виставляється прапор F0.
setb F0 ??p>
Тепер, оскільки прапор F0 встановлений, перейдемо на мітку gotovo.
gotovo: F0 ??p>
Скидаємо прапори і очищаємо регістри таймера і лічильника
clr TF0TF1TH0, # 0TL0, # 0TH1, # 0TL1, # 0
Скидаємо порт P2.0, викликаємо підпрограму затримки і знову встановлюємо порт P2.0, ніж формуємо негативний стрибає.
clr P2.0twosecdelayP2.0
Очікуємо, поки не буде віджата кнопка. В іншому випадку, контролер не почне виконувати програму спочатку. Коли кнопка віджата, процес зациклюється.
jnb P1.2, $ start
Розглянемо використовувані підпрограми.
. Підпрограма передачі команди в LCD-дисплей.
У R0 поміщаємо адреса внутрішнього командного регістра LCD. Потім на лініях RS і RW встановлюємо низькі потенціали, що відповідає командному режиму LCD. І, потім, використовуючи команду запису під зовнішнє ОЗУ, передаємо команду з акумулятора у внутрішній командний регістр. При цьому автоматично генерується імпульс на виході WR мікроконтролера, що за вищевказаною схемою з'єднання відповідає подачі стробовий імпульсу E на LCD-індикатор. Т.к. LCD-дисплеї порівняно повільні, після подачі команди, перейдемо на мітку очікування зайнятості LCD.
LSDSetup: R0, # CMDRSRW @ R0, ABusy
2. Підпрограма індикації символу на LCD-диспле...