ї.
У R0 поміщаємо адреса внутрішнього регістра даних LCD. Потім на лінії RS встановлюємо високий потенціал, а на лінії RW - низький, що відповідає режиму індикації LCD. І, потім, використовуючи команду запису під зовнішнє ОЗУ, передаємо дані з акумулятора у внутрішній регістр даних LCD. При цьому автоматично генерується імпульс на виході WR мікроконтролера, що за вищевказаною схемою з'єднання відповідає подачі стробовий імпульсу E на LCD-індикатор. Т.к. LCD-дисплеї порівняно повільні, після передачі даних, перейдемо на мітку очікування зайнятості LCD.
Symbol: R0, # DATRSRW @ R0, ABusy
3. Мітка очікування «зайнятості» LCD дисплея.
У R1 поміщаємо адреса busy-регістра LCD. Потім на лінії RW встановлюємо високий потенціал, а на лінії RS - низький, що відповідає флаговая режиму зайнятості LCD. І, потім, використовуючи команду читання із зовнішнього ОЗУ, передаємо дані з busy-регістра LCD в акумулятор. При цьому автоматично генерується імпульс на виході RD мікроконтролера, що за вищевказаною схемою з'єднання відповідає подачі стробовий імпульсу E на LCD-індикатор. LCD позначає свою зайнятість, наявністю старшого біта в busy-регістрі, тому підпрограма зациклена командою jb так, що вихід з неї можливий тільки, коли зникне старший біт в busy-регістрі в акумуляторі, що відповідає закінченню виконання операції LCD-дисплеєм.
Busy: R0, # BUSRSRWA, @ R0ACC.7, Busy
ret
6. Підпрограма, що реалізує затримку.
Затримку реалізуємо, грунтуючись на тому властивості МК, що виконання ним операцій займає певний час.
У таймер завантажуємо числа, відповідні заданій затримці. І чекаємо, поки таймер відрахує заданий час.
twosecdelay: TH0, # high (- 2000) TL0, # low (- 2000) TR0TF0, $ TR0 TF0 ??p>
ret
end
. Лістинг програми
A51 MACRO ASSEMBLER KURS 05/15/2014 19:45:29 PAGE 1ASSEMBLER A51 V8.02bMODULE PLACED IN kurs.OBJINVOKED BY: C: Keil C51 BIN A51.EXE kurs.a51 SET (SMALL) DEBUG EPOBJ LINE SOURCE
1 org 00h
802E 2 jmp init
B 3 org 1Bh
B 805B 4 jmp check
+0000 6 CMD equ 00000000b
+0001 7 DAT equ 00000001b
+0002 8 BUS equ 00000010b
D 7C00 9 mov R4, # 00h
0090 10 RS bit P1.0
+0091 11 RW bit P1.1
12 org 30h
13 init:
758951 14 mov tmod, # 01010001b
D2AF 15 setb EA
D2AB 16 setb ET1
7440 18 mov A, # 040h
3 197 19 call LSDsetup
B 740F 20 mov A, # 0Fh
D 3197 21 call LSDsetup
F +7406 22 mov A, # 06h
3 197 23 call LSDsetup
25 start:
D2A0 26 setb P2.0
C28D 28 clr TF0 ??p>
C28F 29 clr TF1
758C00 30 mov TH0, # 0
C 758A00 31 mov TL0, # 0
F 758D00 32 mov TH1, # 0
758B00 33 mov TL1, # 0
900000 34 mov DPTR, # 0000h
2092FD 35 jb P1.2, $
B C28C 37 clr tr0
D C28E 38 clr tr1
F C28D 39 clr tf0
C28F 40 clr tf1
C290 42 clr RS
C291 43 clr RW
758DFF 44 mov TH1, # 0FFh
A 758B9B 45 mov TL1, # 9bh
D D28E 52 setb TR1
F D28C 53 setb TR0
20D502 54 gr: jb F0, gotovo1
80FB 55 jmp gr
57 gotovo1:
215D 58 jmp gotovoMACRO ASSEMBLER KURS 05/15/2014 19:45:29 PAGE 2
60 check:
C28C 61 clr TR0
A C28E 62 clr TR1
C 858A82 64 mov dpl, TL0
F 858C83 65 mov dph, TH0
67 sravn7700:
790A 68 mov R1, # low (778)
7803 69 mov R0, # high (778)
C3 70 clr C
E582 71 mov A, DPL
99 72 subb A, R1
A 4002 73 jc perenos7...