; PROGRAM BUDE VYUZIVAT PRERUSENIA int0 A int1 a od seriovej linky ; na zaklade prerusenia bude zvysovat a znizovat index v reg. B v tabulke ; "tabulka" v ktorej su nastavene konstatnty ktore sa budu vysielat ; na port P1 ; nim sa da riadit napriklad zobrazovanie sedem segmentoveho cisla ; zaroven so zmenou indexu sa tento odosle do druheho pocitaca ; v ktorom sa pouzije na nastavenie indexu v susednom pocitaci |
|||
$mod2051 | |||
org 00H | |||
ljmp program | |||
org 0003H | |||
push A ljmp zvysuj |
; odpamataj A register ; obsluha zvysovania indexu v tabulke |
||
org 000BH | |||
;cpl P3.7 push A ljmp zobraz |
; generuj zvuk na tomto bite ; odpamataj A register ; ZOBRAZENIE DISPLEJA ovlada casovac T0 |
||
org 0013H | |||
push A ljmp znizuj |
; odpamataj A register ; obsluha znizovania indexu v tabulke |
||
org 0023H | |||
push A ljmp serlinka |
; odpamataj A register ; obsluzenie prerusenia seriovej linky |
||
org 100H | |||
monitor: | mov A,#0FH anl A,B mov R4,A mov A,#F0H anl A,B swap A mov R5,A ajmp monitor |
; Znak v registri B menime tlacitkami. ; potom vsak nible separujeme do registrov ; do F4 ide spodny nible ; ; ; ; do F5 ide horny nible |
|
org 200H | ; na zaciatku inicializacia seriovej linky | ||
program: | mov scon, | #01010000b | |
;mod2 inicializacia seriovej linky
mov tmod, #00100010b
;gate=0, C/~T -timer T1 mod 2, T0 mod 2
anl PCON, #7FH
;SCON=0 - zakladna frekvencia
mov TH1, #F3H
;baudrate 2400
mov TH0, #DFH
;casovac pre display max
mov tcon, #01010000b
;start casovaca T1 a T0
; nastavenie prerusovacieho systemu na citanie tlacitiek
mov IE,#10010111b
; povolime prerusenie serial,int1 a ti0 int0
SETB IT0
; dovod prerusenia prechod 1 na 0 na int0
SETB IT1
; prechod 1 na 0 na int1
mov B,#07H
; inicializacia hodnoty indexu v tabulke
mov DPTR,#tabulka
; adresa bazy tabulky
setb P3.5
; zhasni lavy displej
setb P3.4
; zhasni pravy displej
ajmp monitor
; nekonecny cyklus
; sedemsegmentovka riadena inverznymi bitmi
; x g f e d c b a
tabulka: db 0C0H ; R4=0
1 1 0 0 0 0 0 0
a
db 0F9H ; R4=1
1 1 1 1 1 0 0 1
f b
db 0A4H ; R4=2
1 0 1 0 0 1 0 0
g
db 0B0H ; R4=3
1 0 1 1 0 0 0 0 e
c
db 099H ; R4=4
1 0 0 1 1 0 0 1
d
db 092H ; R4=5
1 0 0 1 0 0 1 0
db 082H ; R4=6
1 0 0 0 0 0 1 0
db 0F8H ; R4=7
1 1 1 1 1 0 0 0
db 080H ; R4=8
1 0 0 0 0 0 0 0
db 090H ; R4=9
1 0 0 1 0 0 0 0
db 088H ; R4=10 A 1 0 0 0 1 0 0 0
db 083H ; R4=11 b 1 0 0 0 0 0 1 1
db 0C6H ; R4=12 C 1 1 0 0 0 1 1 0
db 0A1H ; R4=13 d 1 0 1 0 0 0 0 1
db 086H ; R4=14 E 1 0 0 0 0 1 1 0
db 08EH ; R4=15 F 1 0 0 0 1 1 1 0
db 0B6H ; R4=16
1 0 1 1 0 1 1 0 spec znak
; R5 respektive
zobraz: cpl 01H
; bit bitoveho pola bude prepinacom displeja
jnb 01H,doR5
; priznak 1 TRUE zobraz R5
setb P3.5
; inak zobraz R4 => zhasneme R5
mov A,#10H
; spec znak /// na pozicii 16dek
jnb P3.7,fin1
; pri stlaceni P3.7 zhasni - TEST
mov A,R4
; inak ries zobrazenie R4
fin1: movc A,@A+DPTR
; vyber font
mov P1,A
; odosli font na display
clr P3.4
; rozsviet pravy display
mov TH0, #7FH
;casovac pre display max
pop A
reti
doR5: setb P3.4 ; zhasni R4
mov A,#10H
; spec znak /// na pozicii 16dek
jnb P3.7,fin2
; pri stlaceni P3.7 zhasni -TEST
mov A,R5
; pozicia v tabulke
fin2: movc A,@A+DPTR
; vyber font
mov P1,A
; odosli font na display
clr P3.5
; rozsviet lavy display
mov TH0, #7FH
;casovac pre display max - teraz autoload rezim
pop A
reti
serlinka: jnb TI, doRI
; riesime prijatie dat
clr TI
pop A
; odoslanie dat ignoruj
reti
doRI: mov A, SBUF
; vyzdvihni dosly znak
clr RI
; zrus priznak
mov B, A
; zmen vypisovane znaky
pop A
reti
odosli: mov B,SBUF
; pozor vynimka ! B>>SBUF Hodnotu posli do susedneho pocitaca
jnb TI,$
; cakaj na riadku a testuj priznak odoslania
clr TI
; data boli odoslane - vynulujeme priznak
ret
zvysuj: inc B
; zvys o 1 obsah pocitadla v B registri
call odosli
; odosli stav seriovou linkou
pop A
; obnov register A
reti
; ukonci obsluhu prerusenia
znizuj: dec B
; zvys o 1 obsah pocitadla v B registri
call odosli
; odosli stav seriovou linkou
pop A
; obnov register A
reti
;
; pauza vytvorena vytvorenim R1 * R2 * R3 cyklov tohto podprogramu
pauza: mov r1, #001h
; Nastav 1. parameter
cykl3: mov r2, #0Afh
; Nastav 2. parameter
cykl2: mov r3, #0ffh
; Nastav 3. parameter
cykl1: djnz r3, cykl1
; Zopakuj cykl1 pokial R3<>0
djnz r2, cykl2
; Zopakuj cykl2 pokial R2<>0
djnz r1, cykl3
; Zopakuj cykl3 pokial R1<>0
ret
; Skonci po R1*R2*R3 cykloch
END