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;

Делись добром ;)