Witam!
Temat: Zaprojektować nadajnik alfabetu Morse'a w asemblerze ST7.
Proszę o pomoc.
Temat: Zaprojektować nadajnik alfabetu Morse'a w asemblerze ST7.
Proszę o pomoc.
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tam
st7/
TITLE "starter.asm"
MOTOROLA
#INCLUDE "st72334.inc"
#INCLUDE "LCD.inc"
#INCLUDE "I2C.inc"
#INCLUDE "KEYS.inc"
#INCLUDE "TIME.inc"
;***************************************************************************
; Początek programu
;***************************************************************************
WORDS
segment 'rom' ; program
.main ; poczatek programu po resecie
rim ; odblokowanie przerwań, rozkaz wymagany
; przy stosowaniu debugera InDart
;=======Inicjacja: konfiguracja ukladów peryferyjnych, ukladow zewnetrznych i przerwan======;
call KEYS_INIT
;============Tutaj rozpoczyna sie program glowny============;
.read ;petla do odczytu klawiszy klawiatury przez porównanie
;wcisnietego klawisza z jego kodem ASCII i skok warunkowy
;do procedury wykonujacej funkcje prezentacji konkretnego ;znaku w kodzie Morse'a
ld A, #$00
ld PDDR, A ;wygaszenie diod (port PD)
call KEYS_READ ;inicjacja odczytu znaków z klawiatury
cp Y,#$30 ;testowanie nacisniecia klawisza 0
jreq zero_local
cp Y,#$31 ;testowanie nacisniecia klawisza 1
jreq jeden_local
cp Y,#$32 ;testowanie nacisniecia klawisza 2
jreq dwa_local
cp Y,#$33 ;testowanie nacisniecia klawisza 3
jreq trzy_local
cp Y,#$34 ;testowanie nacisniecia klawisza 4
jreq cztery_local
cp Y,#$35 ;testowanie nacisniecia klawisza 5
jreq piec_local
cp Y,#$36 ;testowanie nacisniecia klawisza 6
jreq szesc_local
cp Y,#$37 ;testowanie nacisniecia klawisza 7
jreq siedem_local
cp Y,#$38 ;testowanie nacisniecia klawisza 8
jreq osiem_local
cp Y,#$39 ;testowanie nacisniecia klawisza 9
jreq dziewiec_local
cp Y,#$2A ;testowanie nacisniecia klawisza *
jreq gw_local
cp Y,#$23 ;testowanie nacisniecia klawisza #
jreq hasz_local
jp read ;skok do poczatku procedury read
;========Miejsce skoków warunkowych wykonanych w procedurze 'read'========;
.zero_local
jp zero
.jeden_local
jp jeden
.dwa_local
jp dwa
.trzy_local
jp trzy
.cztery_local
jp cztery
.piec_local
jp piec
.szesc_local
jp szesc
.siedem_local
jp siedem
.osiem_local
jp osiem
.dziewiec_local
jp dziewiec
.gw_local
jp gw
.hasz_local
jp hasz
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '0'==========;
.zero
call LCD_INIT ;inicjacja wyswietlacza LCD
ld X, #$30 ;wpisanie do rejestru X, kodu ASCII klawisza '0'
call LCD_WRITE ;wyswietlenie '0' na LCD
call diody_init ;konfiguracja portów
call pauz1 ;pauza przed rozpoczeciem nadawania kodu Morse'a
;-------------------
call kres ;;
call pauz ;
call kres ;
call pauz ;
call kres ;kod Morse'a danej cyfry
call pauz ;
call kres ;
call pauz ;
call kres ;;
;-------------------
jp read ;powrót do procedury 'read'
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '1'==========;
.jeden
call LCD_INIT
ld X, #$31
call LCD_WRITE
call diody_init
call pauz1
call krop
call pauz
call kres
call pauz
call kres
call pauz
call kres
call pauz
call kres
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '2'==========;
.dwa
call LCD_INIT
ld X, #$32
call LCD_WRITE
call diody_init
call pauz1
call krop
call pauz
call krop
call pauz
call kres
call pauz
call kres
call pauz
call kres
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '3'==========;
.trzy
call LCD_INIT
ld X, #$33
call LCD_WRITE
call diody_init
call pauz1
call krop
call pauz
call krop
call pauz
call krop
call pauz
call kres
call pauz
call kres
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '4'==========;
.cztery
call LCD_INIT
ld X, #$34
call LCD_WRITE
call diody_init
call pauz1
call krop
call pauz
call krop
call pauz
call krop
call pauz
call krop
call pauz
call kres
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '5'==========;
.piec
call LCD_INIT
ld X, #$35
call LCD_WRITE
call diody_init
call pauz1
call krop
call pauz
call krop
call pauz
call krop
call pauz
call krop
call pauz
call krop
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '6'==========;
.szesc
call LCD_INIT
ld X, #$36
call LCD_WRITE
call diody_init
call pauz1
call kres
call pauz
call krop
call pauz
call krop
call pauz
call krop
call pauz
call krop
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '7'==========;
.siedem
call LCD_INIT
ld X, #$37
call LCD_WRITE
call diody_init
call pauz1
call kres
call pauz
call kres
call pauz
call krop
call pauz
call krop
call pauz
call krop
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '8'==========;
.osiem
call LCD_INIT
ld X, #$38
call LCD_WRITE
call diody_init
call pauz1
call kres
call pauz
call kres
call pauz
call kres
call pauz
call krop
call pauz
call krop
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '9'==========;
.dziewiec
call LCD_INIT
ld X, #$39
call LCD_WRITE
call diody_init
call pauz1
call kres
call pauz
call kres
call pauz
call kres
call pauz
call kres
call pauz
call krop
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '*'==========;
.gw
call LCD_INIT
ld X, #$2A
call LCD_WRITE
call diody_init
call pauz1
jp read
;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '#'==========;
.hasz
call LCD_INIT
ld X, #$23
call LCD_WRITE
call diody_init
call pauz1
jp read
;==============Procedura realizujaca sygnalizacje kropki===============;
.krop
ld A, #$01 ;aktywacja diody
ld PDDR, A ;na porcie PD
ld A, #$02 ;aktywacja buzzera
ld PFDR, A ;na porcie PF
;-----------------------
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
;-----------------------
ld A, #$00 ;deaktywacja buzzera
ld PFDR, A ;na porcie PF
ret
;==============Procedura realizujaca sygnalizacje kreski===============;
.kres
ld A, #$01 ;aktywacja diody
ld PDDR, A ;na porcie PD
ld A, #$02 ;aktywacja buzzera
ld PFDR, A ;na porcie PF
;-----------------------
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
;-----------------------
ld A, #$00 ;deaktywacja buzzera
ld PFDR, A ;na porcie PF
ret
;==============Procedura realizujaca przerwe miedzy znakami===============;
.pauz
ld A, #$00 ;deaktywacja diody
ld PDDR, A ;na porcie PD
ld A, #$00 ;deaktywacja buzzera
ld PFDR, A ;na porcie PF
;-----------------------
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
call TIME_5MS
;-----------------------
ret
;=========Procedura realizujaca pauze przed rozpoczeciem sygnalizacji ==========;
.pauz1
ld A, #$00
ld PDDR,A
call TIME_500MS
;==============Konfiguracja portów===============;
.diody_init
ld A, #$02
ld PFDDR, A
ld PFOR, A
ld A, #$01
ld PDDDR, A
ld PDOR, A
ld A, #$80
ld PCDDR, A
ld PCOR, A
ld PCDR, A
ret
; dobry zwyczaj nakazuje umieszczanie po petli glownej - nieskonczonej petli
jp * ; * ozn. "skok do samego siebie" = aktualnego licznika rozkazów
;***************************************************************************
int_catch iret ; "pusty" podprogram obsługi przerwania
segment 'vectit' ; tablica wektorów przerwań
DC.W int_catch ; FFE0-FFE1h location
DC.W int_catch ; FFE2-FFE3h location
DC.W int_catch ; FFE4-FFE5h location
DC.W int_catch ; FFE6-FFE7h location
DC.W int_catch ; FFE8-FFE9h location
DC.W int_catch ; FFEA-FFEBh location
DC.W int_catch ; FFEC-FFEDh location
DC.W int_catch ; FFEE-FFEFh location
DC.W int_catch ; FFF0-FFF1h location
DC.W int_catch ; FFF2-FFF3h location
DC.W int_catch ; FFF4-FFF5h location
DC.W int_catch ; FFF6-FFF7h location
DC.W int_catch ; FFF8-FFF9h location
DC.W int_catch ; FFFA-FFFBh location
DC.W int_catch ; FFFC-FFFDh location
DC.W main ; FFFE-FFFFh location = poczatek programu
END