Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Лабораторна робота №13
з курсу „Комп’ютери та
мікропроцесорні системи”
на тему: ”Програмування системного таймера 8253/8254 та робота з годинником реального часу”
Виконав
Тема
Програмування системного таймера 8253/8254 та робота з годинником реального часу.
Мета
Мета роботи – вивчити та засвоїти алгоритми роботи з системним таймером 8253/8254. Набути практичні навички роботи з програмування системного таймера.
Теоретичні відомості
Завдання
На індивідуальне завдання я отримав таке завдання: написати програму, яка за допомогою системного таймера генерує на динаміку звукові мотиви пісні Земфіра “Прости мене, моя любов”.
За вказаними кодами:
C3(1/8) D3(1/4) E3(1/2) D3(1/4) C4(1/4)
H3(1/4) C3(1/8) D3(1/4) E3(1/2) D3(1/4)
C4(1/4) H3(1/4) C3(1/8) D3(1/4) E3(1/2)
D3(1/4) C4(1/4) H3(1/4) E3(1/4) F3(1/8)
D3(1/4) F3(1/8) D3(1/8) C3(1/4) F3(1/8)
C3(1/8) H2(1/4) F3(1/8) H2(1/8) C3(1/8)
Текст ASM програми:
.MODEL Small
.STACK 64
.DATA
DO equ 4554
DO_ equ 4307
RE equ 4058
RE_ equ 3836
MI equ 3615
FA equ 3418
FA_ equ 3224
SOL equ 3043
SOL_ equ 2875
LIA equ 2711
LIA_ equ 2560
SII equ 2415 ;
DOO equ 2281
DOO_ equ 2153
REE equ 2032
REE_ equ 1918
MII equ 1810
FAA equ 1709
FAA_ equ 1612
SOLL equ 1522
SOLL_ equ 1438
LIAA equ 1356
LIAA_ equ 1280
SIII equ 1208
OCT equ 4
QRT equ 8
HLF equ 16
FLL equ 12
FMM equ 16 ;16
P_0 equ 00h
A_0 equ 152Fh
B_0 equ 1400h
H_0 equ 12DEh
C_0 equ 11C0h
CIS_0 equ 10D0h
D_0 equ 0FDFh
DIS_0 equ 0EFAh
E_0 equ 0E23h
F_0 equ 0D58h
FIS_0 equ 0C98h
G_0 equ 0BE3h
GIS_0 equ 0B39h
A_2 equ 0A97h
B_2 equ 0A37h
H_2 equ 096Fh
C_2 equ 08EFh
CIS_2 equ 0868h
D_2 equ 07EFh
DIS_2 equ 077Dh
E_2 equ 0711h
F_2 equ 06CAh
FIS_2 equ 064Ch
G_2 equ 05F1h
GIS_2 equ 059Ch
A_3 equ 054Bh
B_3 equ 04FFh
H_3 equ 04B7h
C_3 equ 0474h
CIS_3 equ 0432h
D_3 equ 03F7h
DIS_3 equ 03BEh
E_3 equ 0389h
F_3 equ 0357h
FIS_3 equ 0326h
G_3 equ 02F8h
GIS_3 equ 02CEh
CX0_1 equ 3d0900h
CX0_2 equ 1E8480h
CX0_4 equ 0F4240h
CX0_8 equ 07A120h
CX0_16 equ 03D090h
;--------------------------- Zemfira --------------------------
freq1 dw C_3,D_3,E_3,D_3,CIS_3,H_3,C_3,D_3,E_3,D_3
dw CIS_3,H_3,C_3,D_3,E_3,D_3,CIS_3,H_3,E_3,F_3
dw D_3,F_3,D_3,C_3,F_3,C_3,H_2,F_3,H_2,C_3
dur1 db HLF,QRT,OCT,QRT,QRT,QRT,HLF,QRT,OCT,QRT
db QRT,QRT,HLF,QRT,OCT,QRT,QRT,QRT,QRT,HLF
db QRT,HLF,HLF,QRT,HLF,HLF,QRT,HLF,HLF,HLF
melody1 db 01,02,03,04,05,06,07,08,09,10
db 11,12,13,14,15,16,17,18,19,20
db 21,22,23,24,25,26,27,28,29,30,0ffh
mes_1 DB " ", 0Dh, 0Ah
DB " ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДї", 0Dh, 0Ah
DB " і To chouse program і", 0Dh, 0Ah
DB " і gast push button: і", 0Dh, 0Ah
DB " і і", 0Dh, 0Ah
DB " і 1 : to play M 1 і", 0Dh, 0Ah
DB " і і", 0Dh, 0Ah
DB " і 0 : to exit і", 0Dh, 0Ah
DB " і і", 0Dh, 0Ah
DB " АДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ", 0Dh, 0Ah
DB "$", 0Dh, 0Ah
.CODE
.386
AMain Proc Far
mov AX, @data
mov DS, AX
mov ES, AX
A1: CALL A10Clean
mov DX,0519h
CALL B10Cursor
lea DX, mes_1
CALL F10Mes
mov DX,0E15h ;DH- RD. DL- CT
CALL B10Cursor
CALL E10ChIn
cmp AL, 31h
jne A0
CALL CMusic1
jmp A1
A0: cmp AL, 30h
jne A1
A11: mov AX, 4C00h
int 21h
AMain Endp
CMusic1 proc near
mov al,0B6h
out 43h,al
in al,61h
or al,3
out 61h,al
mov cx,2
mov cx,12
mov si,0
CPlay1:
lea bx,melody1
mov al,[bx][si]
cmp al,0ffh
je CStop1
cbw
mov bx,offset freq1
dec ax
shl ax,1
mov di,ax
mov dx,[bx][di]
mov al,dl
out 42h,al
mov al,dh
out 42h,al
mov ah,0
int 1ah
mov bx,offset dur1
mov cl,[bx][si]
mov ch,0
mov bx,dx
add bx,cx
CCont1:
int 1ah
cmp dx,bx
jne CCont1
inc si
jmp CPlay1
CStop1:
in al,61h ;Ї®«гзЁ¬ § 票Ґ Ї®ав 61h ў AL
and al,0FCh ;ўлЄ«озЁвм ¤Ё ¬ЁЄ
out 61h,al ;ў Ї®ав 61h
ret
CMusic1 endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
A10Clean Proc Near
pusha
mov AX, 0600h
mov BH, 07
mov CX, 00h
mov DX, 184Fh
int 10h
popa
ret
A10Clean Endp
;---------------------------
B10Cursor Proc Near
pusha
mov AH, 02h
mov BH, 00h
int 10h
popa
ret
B10Cursor Endp
;---------------------------
E10ChIn Proc Near
mov AH, 01h
int 21h
cmp AL, 00h
jne E20
int 21h
E20:
ret
E10ChIn Endp
;---------------------------
F10Mes Proc Near
mov AH, 09h ;DX - Text
int 21h
ret
F10mes Endp
;------------------------------------------------------------------------------------------
End AMain
Результати виконання програми
Після запуску програми і висвітлення меню, в якому пропонується вибрати мелодію, можна, натискаючи відповідну клавішу програти мелодії.
Якщо натиснути кілька разів якусь клавішу, що вибирає мелодію, то вона занесеться в буфер клавіатури і виконається відразу після закінчення дії попередньої. Для того щоб завершити виконання програми треба в меню натиснути на клавішу „0”.
Висновки
На даній лабораторній роботі я навчився виконувати програмування системного таймера, та виводити за допомогою нього звукові сигнали. Виконавши цю лабораторну роботу я переконався що виводити складні мелодії за допомогою динаміка небажано, тому що він не може передати повноту сприйняття звуку.