Midi-контроллеры клавиатурного типа
3.2 Листинг программы
ts:do;/*программа управления MIDI клавиатурой*/
$include(reg812.dcl)
declare
not(8) STRUCTURE (n(12) byte,nk(12) byte),
baz byte; /*Базовая октава*/
flag byte, /*флаг отработки АЦП*/
(kl,klp,klo) byte,/*номера клавиш*/
(adc_l,adc_h) byte,/*промежуточные данные с АЦП*/
power byte, /*Сила нажатия*/
st byte; /*значение столбца матрицы*/
adc_in: procedure interrupt 6; /*обработчик прерывания АЦП*/
adccon2=0;
adc_h=ADCDATAH; /*помещаем значения преобразования*/
adc_l=ADCDATAL; /*в переменные adc_l и adc_h*/
power=( adc_h*255+adc_l)*100/4096;/*рассчитываем силу нажатия*/
flag=1; /*устанавливаем флаг признака отработки АЦП*/
end adc_in;
time_int:procedure interrupt 1; /*Обработка прерывания таймера 1*/
st=st+1;if st=8 then do; st=0;kl=0;
if kl=0 then do; klo=klp; klp=0;end; /*клавиша отпущена*/
end;
/*Определение номера нажатой клавиши*/
If st=0 then p2=11111110b; /*пускаем ноль по порту P2*/
If st=1 then p2=11111101b;
If st=2 then p2=11111011b;
If st=3 then p2=11110111b;
If st=4 then p2=11101111b;
If st=5 then p2=11011111b;
If st=6 then p2=10111111b;
If st=7 then p2=01111111b;
if p0.2=0 then kl=st*6+1;
if p0.3=0 then kl=st*6+2;
if p0.4=0 then kl=st*6+3;
if p0.5=0 then kl=st*6+4;
if p0.6=0 then kl=st*6+5;
if p0.7=0 then kl=st*6+6;
if p0.7=0 then kl=st*6+6;
if kl<>klp then do;klo=klp;klp=kl;end;/* нажата другая клавиша */
end time_int;
/***************основная программа ****************/
/*Инициализация*/
stolbec=11111110b;/*назначаем 1 столбец для сканирования*/
P2=stolbec;
P1=11111100b;/*направление ввода для линий клавиатуры*/
Baz=0; power=36;/*базовое смещение октав 0 сила нажат 36*/
flag=0; dpp=2;
ADCCON1=60h; ADCCON2=0;
/*инициализация таймеров и последовательного канала*/
et0=1;
tr0=1;tr1=1;tr2=1;/*включаем все три таймера*/
tf0=0;tf1=0;tf2=0;
Cnt2=0;Cap2=0;/*работа как таймер с перезагрузкой делителя*/
Tclk=1;/*использ Т1 для синхронизации послед порта*/
Th0=0;Th1=0f4h; Tl0=0;Tl1=0f4h;
Rcap2h=0ffh; rcap2l=70h;/*установ. пределитель для перезагрузки Т2*/
tmod=00100001b;/*T0 14 разрядный T1 8 разрядов с перезагрузкой*/
scon=01000000h;/*синхронизировать послед порт по T1*/
do while 1;/*бесконечный цикл сканирования клавиш*/
if (kl=48)and(klp<>kl) then do; /*цикл установки смещения октавы*/
do while kl<>0;end; /*ждём, когда отпустят клавишу 48*/
do while kl=0;end; /*ждём, когда нажмут клавишу*/
if kl<=4 then baz=kl /*если нажата одна из четырех первых клавиш, */
/*устанавливаем смещение октавы*/
else baz=0;
klp=kl;
p0=baz; /*выводим сдвиг октавы на индикатор*/
end;
sconv=1;flag=0; /*запускаем АЦП*/
do while flag=0; /*и ждем пока он отработает*/
end;
if klo>0 then do; /*если есть отпущенная клавиша*/
sbuf=klo/12+baz; call time(50);/*передаем номер октавы отпущ. клавиши*/
sbuf=(klo mod 12) or 80h; call time(50);/*передаем номер отпущен. клавиши*/
klo=0; end; /*с установленным седьмым битом*/
if (kl>0)and(klp<>kl) then do; /*если нажата новая клавиша*/
sbuf=klp/12+baz; call time(50);/*передаем номер октавы*/
sbuf=klp mod 12; call time(50);/*передаем номер ноты*/
sbuf=power; call time(50);/*передаем силу нажатия*/
klp=kl; end;
end ts;