logo
IDE-контроллер для CD-ROM

3.2 Листинг программы

start: do;

$include (reg51. dcl)

declare

Ntr word,/*N read trek*/

kom_egekt (6) word constant (1,0,2,0,0,0),/* open CD*/

kom_Close (6) word constant (1,0,3,0,0,0),

kom_play (6) word constant (47,0,0,-1,255,0),

kom_pause (6) word constant (4Bh,0,0,0,0,0),

kom_stop (6) word constant (4E,0,0,0,0,0),

kom_nextTr (6) word constant (243,0,0,1,0,0),

kom_predTr (6) word constant (245,0,0,1,0,0),

str_sm byte,/*smehen str*/

str_gdite (10) byte constant (0a8h,6fh,0e3h,6fh,0b6h,0e3h,0b8h,0bfh,65h, 20h),

str_plaiTr (11) byte (0b8h,0b4h,61h,65h,0bfh, 20h,0bfh,70h,65h,0bah, 20h),

str_pause (5) byte (0a8h,079h,0c5h,061h, 20h),

str_stop (5) byte (043h,0bfh,06fh,0beh, 20h),

LCD_Ini (*) byte constant (08h,02h,0fh,01h), /*команды инициализации ЖКИ*/

Ind (30) bute,/* содержимое индикатора */

(i, ip,jp,per,s,np,st,ks,k,pl) byte,/* переменные для работы */

(flag,fl_play,fl_key,fl_ind) byte,/*флаги определения режима работы */

(key,keyold byte, /*номер нажатой клавиши */

(sek,min) word; /*секунды, минуты и часы*/

/*пеpеименование pазpядов поpта */

declare rs literally P0.4,/* RS линия связи с LCD*/

rw literally P0.5,/*RW линия связи с LCD*/

e literally `P0.6;

timer_int: procedure interrupt 1; /*---Обработчик прерывания таймера-------------*/

/*проверка нажатия клавиш*/

if (p3.3=0b) and (keyold<>0) then do; fl_key=1; key=1; end; /*play previv*/

if (p3.4=0b) and (keyold<>2) then do; fl_key=2; key=2;

fl_play=not (fl_play); keyold=key; end; /*play/ stop*/

if (p3.5=0b) and (keyold<>3) then do; fl_key=3; key=3; end; /* pause*/

if (p3.6=0b) and (keyold<>4) then do; fl_key=4; key=4; end; /* play next trek*/

per=per+1; /* увеличиваем счетчик переполнений */

if per>=15 then do; /*отсчет секунды*/

per=0; sek=sek+1; /*отсчет секунд*/

if sek>=60 then do; min=min+1; sek=0; /*минут*/

if min=60 then do; min=0; end;

/*флаг необходимости обновления изображения индикатора*/

end; fl_ind=1;

tf0=0; /* sbros flaga perepolneniya */

end timer_int;

str_ind: procedure; /* вывод заданной строки*/

i=0; j=0;

do while str_ gdite (i+str_sm) <>20h;

ind (j) =str_ gdite (I+str_sm);

i=i+1; j=j+1; end; ind (j) =20h; j=j+1;

end str_ind;

time_ind: procedure; /* time play*/

j=42; ind (j) = (ntr/10) +30h; ind (j+1) = (ntr mod 10) +30h;

ind (j+3) = (min/10) +30h; ind (j+4) = (min mod 10) +30h; ind (j+5) =0d0h;

ind (j+6) = (sek/10) +30h; ind (j+7) = (sek mod 10) +30h; j=j+7;

call out_ind;

end time_ind;

out_ind: procedure; /*вывод буфера на жки*/

call time (20); rs,rw=0; P0=1; /*очистка ЖКИ*/

do I=0 to 15;

rs=0; rw=0; e=1b; call time (20);

P0=1; p0.3=1; call time (10); p3.0=0;

rw=0; call time (10);

P0=ror ( (Ind (i) and0f0h),4); rs=1; e=0; p3.0=1; call time (6); p3.0=0;

P0=Ind (i) and 0fh; rs=1; e=1; p3.0=1; call time (20); p3.0=0;

end;

Do I=1 to 25; p3.0=0; rw=0; call time (10); /*переход на вторую строку

P0=2h; rs=1; e=0; p3.0=1; call time (10); p3.0=0;

P0=0h; rs=1; e=0; p3.0=1; call time (20); p3.0=0;

end;

do I=15 to 29;

rs=0; rw=0; e=1b; call time (20);

P0=1; p0.3=1; call time (10); p3.0=0;

rw=0; call time (10);

P0=ror ( (Ind (i) and0f0h),4); rs=1; e=0; p3.0=1; call time (6); p3.0=0;

P0=Ind (i) and 0fh; rs=1; e=1; p3.0=1; call time (20); p3.0=0;

end;

Do I=0 to 30; ind (i) =20h; end; /*jочистка буфера индикатора*/

end out_ind;

out_komand: procedure;

do k=0 to 6;

p1.1=1;

do while P1.7=0; end; /* ждем готовности СД к приему след команды*/

P0=kom_egekt (ks+k) mod 0ffh; p1.2=1;

P2=kom_egekt (ks+k) /0ffh; p1.1=0; /*пишем байт команды*/

End; p1.1=1;

end out_command;

init: procedure; /**************пpоцедуpа инициализации******************/

tmod=00010001b; /*пеpвый pежим для 0 и 1 го таймеpа */

it0=1; /*пpеpывание по фpонту сигнала пеpеполнения*/

th0,tl0=0; tr0=1; /*обнул счетчики и pазpешаем pаботу 0 таймеpa*/

er1=0; /*запускаем таймеp 0 и 1*/

et0=1; /*pазpешаем пpеpывания Т0 T1*/

ea=1; /*pазpешаем все пpеpывания*/

P2=00111111b; st=0; /* скан 1 столбца*/

n_key=0; k_old=0; fl_ind=1; fl_p=1;

flH=0; fl_r1=0; fl_r2=0; fl_r3=0; fl_r4=0; flN=0;

/*инициализация ЖКИ*/

do I=0 to 3;

rs=0; rw=1b; e=1b; call time (10);

do while (M and 80h) <>0; end;

e=0; rs=0; rw=0; call time (10);

PO=LCD_Ini (i);

end;

/*устанавливаем значения по умолчанию*/

min=0; sek=0; fl_ind

str_sm=0; call str_ind; out_ind;

p0=0; p2=0; p1.0=1; call time (10); p1=0; /*сброс настроек CD*/

p3=11111100b;

end init;

/*___________ Tело основной программы ______________*/

call init;

do while 1; P1.1=0; /*strob zapisi*/

if (fl_ind=0) and (fl_play>0) then do;

call time; /*Строка Время 12: 19: 33 */

fl_ind=0; end; /*вывод времени каждую секунду*/

if (key=1) and (keyold<>1) then do; /*посылка команды предшествующий трек*/

if Ntr>1 then do; Ntr=Ntr-1; ks=36; call out_komand; end;

keyold=1;

str_sm=10; call str_ind; call time_ind; /*начинаем отсчет времени*/

end;

if (key=4) and (keyold<>4) then do; /*посылка команды nextTrek*/

if Ntr<30 then do; Ntr=Ntr+1; ks=30; call out_komand; end;

keyold=4;

str_sm=10; call str_ind; call time_ind; /*начинаем отсчет времени*/

end;

if (key=2) and (keyold<>2) then do;

if fl_play>0 then do;

Ntr=1; ks=12; call out_komand;

str_sm=10; call str_ind; call time_ind; /*end /*посылка команды play треk*/

Else do; fl_play=0; ks=24; /*посылка команды stop*/

call out_komand; str_sm=10; call str_ind; call time_ind; end;

keyold=2;

end;

if (key=3) and (keyold<>3) then do; /*посылка команды pause*/

ks=18; call out_komand;

keyold=3; fl_play=0;

str_sm=21; call str_ind; call time_ind;

end;

end;

end;

end start;