Ministerul Educaţiei și Cercetării al Republicii Moldova
Universitatea Tehnică a Moldovei
Departamentul Informatică și Ingineria Sistemelor
PSM
Lucrare de laborator nr.4
Tema : Proiectarea unui sistem cu microcontroler de afişaj dinamic pe indicatoare 7-segmente.
St. gr. Preguza Cristian, CR-201
A verificat- [Link]îcov
2023
Codul Programului:
.include "[Link]"
; Redefinirea registrilor
.def flags = r2
.def temp = r16
.def itmp = r17
.def cnt = r18
.def pos = r19
.cseg ; Segmentul de cod
.org 0x0000
rjmp RESET ; Salt necondiționat
.org INT0addr ; Adresa vectorului de întrerupere External Interrupt0
reti
.org INT1addr ; Adresa vectorului de întrerupere External Interrupt1
reti
.org INT2addr ; Adresa vectorului de întrerupere External Interrupt2
reti
.org OC2addr ; Adresa vectorului de întrerupere Output Compare2
reti
.org OVF2addr ; Adresa vectorului de întrerupere Overflow2
reti
.org ICP1addr ; Adresa vectorului de întrerupere Input Capture1
reti
.org OC1Aaddr ; Adresa vectorului de întrerupere Output Compare1A
reti
.org OC1Baddr ; Adresa vectorului de întrerupere Output Compare1B
reti
.org OVF1addr ; Adresa vectorului de întrerupere Overflow1
reti
.org OC0addr ; Adresa vectorului de întrerupere Output Compare0
rjmp DisplayNext
.org OVF0addr ; Adresa vectorului de întrerupere Overflow0
reti
.org SPIaddr ; Adresa vectorului de întrerupere SPI
reti
.org URXCaddr ; Adresa vectorului de întrerupere USART Receive Complete
reti
.org UDREaddr ; Adresa vectorului de întrerupere USART Data Register Empty
reti
.org UTXCaddr ; Adresa vectorului de întrerupere USART Transmit Complete
reti
.org ADCCaddr ; Adresa vectorului de întrerupere ADC
reti
.org ERDYaddr ; Adresa vectorului de întrerupere EEPROM Ready
reti
.org ACIaddr ; Adresa vectorului de întrerupere Analog Comparator
reti
.org TWIaddr ; Adresa vectorului de întrerupere Two-Wire Interface
reti
.org SPMRaddr ; Adresa vectorului de întrerupere Store Program Memory Ready
reti
;---------------------------------------------------------------
DisplayNext: ; Subrutina de prelucrare a întreruperii
; Comenzi pentru subrutina dată
in flags, SREG
ser itmp
out PORTB, itmp ; Stingem toate indicatoarele
LPM itmp, Z+
out PORTC, itmp ; Afișăm noul cod
out PORTB, pos ; Aprindem indicatorul
clc
rol pos ; Rotim stânga
sbrc pos, 7
rjmp end_display
; Reinitializăm (începem din nou)
movw ZH:ZL, XH:XL
ldi pos, ~(1<<PB0)
dec cnt
brne end_display
ldi cnt, 30
adiw XH:XL, -1 ; Deplasare spre stânga
cpi XL, Low((Message+5)*2)+1
ldi itmp, High((Message+5)*2)
cpc XH, itmp
brne end_display
ldi XL, low((Message)*2) ; Adresa de început a mesajului (în memoria
Flash)
ldi XH, High((Message)*2)
end_display:
out SREG, flags
reti
; Programul principal
;--------------------------------------------------------------
RESET:
ldi temp, Low(RAMEND) ; Inițializăm stiva
out SPL, temp
ldi temp, High(RAMEND)
out SPH, temp
CLR temp ; Resetăm temp
; Setăm ca intrare PORTC
out DDRC, temp ; Setăm ca intrare PORTB
out DDRD, temp ; Setăm ca intrare PORTD
SER temp
out DDRA, temp
out DDRB, temp ; Setăm ca ieșire PORTA
ldi temp, 77
out OCR0, temp
ldi temp, (1<<WGM01) | (1<<CS02) | (0<<CS01) | (0<<CS00) ; CTC, prescaler 64
out TCCR0, temp
ldi temp, (1<<OCIE0) ; Permitem întreruperea Output Compare
out TIMSK, temp
ldi ZL, low((Message)*2) ; Adresa de început a mesajului (în memoria
Flash)
ldi ZH, High((Message)*2)
ldi pos, ~(1<<PB0)
ldi cnt, 30
ldi XL, low((Message)*2) ; Adresa de început a mesajului (în memoria
Flash)
ldi XH, High((Message)*2)
SEI
MAIN: ; Programul principal
rjmp MAIN
Rezultatul programului:
Concluzii:
In urma efectuarii lucrarii de laborator nr.4 am concretizat cunostiintele de lucru
cu afisare dinamica pe un dispaly de 7 segmente impreuna cu ajutorul ATmega32.
In urma rularii programului si observarii corectitudinii a acestuia a fost
implementata si schema in proteus unde a fost observat modul de lucru a
acestuia si corectitudinea de conectarea a displayului si a codului elaborat.