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;
- Введение
- 1. Объект автоматизации
- 1.1 Выбор микроконтроллера
- 2. Принцип действия устройства
- 2.1 Описание структурной схемы
- 2.2 Выбор элементной базы
- 2.3 Описание принципиальной схемы
- 3. Разработка программного обеспечения МПС
- 3.1 Описание алгоритма работы устройства
- 3.1.1 Описание основных частей программы
- 3.1.2 Описание алгоритма работы главной программы
- 3.2 Листинг программы
- Заключение