Опытный
 
Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007
Репутация: нет Всего: 2
|
Всем доброго времени суток! Ребята помогите пожалуйста закончить курсовую работу. Я несколько раз переписывал всё с нуля но ниразу "как надо" не заработало. Суть какая. Есть кнопка на порте P3.3 по её нажатию надо определить было это тире или точка (по интервалу нажатия). А потом посмотреть результат и вывести нужную букву или цифру на экран. Дело в том что оно не выводит... уже 3ий день мучаюсь... много чего переделывал и исправлял. Но результата так и не увидил. Очень прошу вашей помощи! Код снабжен множеством комментариев. Так что думаю разобратся будет не сложно... ну практически Используемый ассемблер - Ассемблер для микропроцессоров семейства MCS - 51 Код | org 0 jmp osn
org bh jmp per
osn: mov TMOD,#00000101b;программируем таймер setb ea;ставим общее прерывание setb et0;ставим прерывание по таймеру 0 mov dptr,#a000h;зануляем индикатор (правый) mov a,#00000000b movx @dptr,a mov dptr,#b000h;зануляем индикатор (левый) mov a,#00000000b movx @dptr,a
st: mov r5,#0;зануляем регистр подщёта времени простоя mov r6,#0;зануляем регистр подщёта времени нажатия mov r7,#0;зануляем регистр подщёта кол-во символов mov 31h,#0;зануляем ячейку конфигурации mov 32h,#0;зануляем ячейку индикации clr tr0;останавливаем таймер clr tf0;убераем флажок переполнения таймера mov th0,#FFh;записываем в старшый байт таймера mov tl0,#FFh;в младшый (в общей сумме 1 переполнение таймера = 0.1с) jb p3.3,$;ждём пока кнопка будет отпущена jnb p3.3,$;ждём пока нажмут на кнопку inc r7;увеличиваем регистр символов (1-5) setb tr0;запускаем таймер jnb 31.1,$;ждём пока этот бит не будет установлен(этот бит устанавливается после индикации числа) jmp st;прыгаем на начало ; _______ ПРЕРЫВАНИЕ ТАЙМЕРА_______ ; _______ ТОЧКА = 0, ТИРЕ = 1______
per: clr tr0;останавливаем таймер clr tf0;чистим флажок jb p3.3,yes;смотрим нажата ли кнопка jmp no
yes: mov r5,#0;если кнопка нажата то clr 31.4h;чистим бит (отвечает за прохождение 1с простоя) clr 31.5h;чистим (отвечает за прохождение 3с простоя) inc r6;увеличиваем регистр cjne r7,#5,vidp;проверяем (в нашем случае в азбуке морзе максимум 5 символов, точек или тире. Поетому если мы достигли предела чтобы не сделать ошибку мы просто выводим на экран) jmp ind
vidp: jb 31.6h,vidp_y;этот бит отвечает за то или была отпущена кнопка jmp vidp_n
vidp_y: inc r7;если была то мы щитаем что это уже другой символ и увеличиваем clr 31.6h;затем затераем бит чтобы пордяд несколько раз не увеличить
vidp_n: cjne r6,#10,vidp_n_;смотрим или не прошла 1с setb 31.2h;если прошла то ставим метку
vidp_n_:jb 31.2h,bil5_y;проверяем метку на 1с call tochka;если ещё не прошла то щитаем что это была точка jmp pere;перегружаем таймер
bil5_y: cjne r6,#30,bil10;смотрим может уже прошло 3с? setb 31.3h;если да то ставим метку
bil10: jb 31.3h,tyre;проверяем. Если прошло 3с то щитаем что это уже было тире call tochka;иначе точка =) jmp pere;перегружаемся
no: mov r6,#0;если кнопка не нажата то зануляем все биты (конфигурацию) состояния нажатой кнопки inc r5;увеличиваем щётчик не нажатой кнопки clr 31.2h clr 31.3h clr 31.7h cjne r5,#10,no5;смотрим или прошла 1с setb 31.4h;если да то ставим метку
no5: cjne r5,#30,no10;может быть уже прошло 3с? setb 31.5h;если да то ставим метку
no10: jb 31.5h,ind;проверяем метку, если прошло 3с простоя то выводим результат jb 31.4h,n_vidp;если нет то щитаем что это была просто пауза между символами jmp pere;если ещё даже 1с не прошло то просто перегружаемся
n_vidp: setb 31.6h;ставим бит мол кнопка была отпущена и это пауза между символами jmp pere;перегружаемся
pere: clr tr0;останавливаем таймер clr tf0;очищаем флажок mov th0,#FFh;записываем макс. значения mov tl0,#FFh setb tr0;запускаем таймер reti;выходим из прерывания
tochka: jnb 31.7h,t;если мы ещё не ставили точек то ставим (защита от многократных точек) ret;возвращаемся t: cjne r7,#1,t1;проверяем кол во символов и в зависимости в ячейку 32 пишем разные числа clr 32.0h;если это первый символ то зануляем 1ый бит inc r7;пишем что мол это был символ setb 31.7h;пишем что уже записали символ (он скинется при простое кнопки) ret;возвращаемся ;тут по аналогии t1: cjne r7,#2,t2 clr 32.1h inc r7 setb 31.7h ret
t2: cjne r7,#3,t3 clr 32.2h inc r7 setb 31.7h ret
t3: cjne r7,#4,t4 clr 32.3h inc r7 setb 31.7h ret
t4: cjne r7,#5,ind clr 32.4h inc r7 setb 31.7h ret
tyre: cjne r7,#1,yes1_;если же было тире то делаем так же по аналогии =) только ставим вместо 0, 1 setb 32.0h inc r7 jmp yes_f yes1_: cjne r7,#2,yes2_ setb 32.1h inc r7 jmp yes_f yes2_: cjne r7,#3,yes3_ setb 32.2h inc r7 jmp yes_f yes3_: cjne r7,#4,yes4_ setb 32.3h inc r7 jmp yes_f yes4_: cjne r7,#5,yes_f setb 32.4h inc r7 yes_f: jb p3.3,$;ждём пока пользователь отпустит кнопку jmp pere;затем перегружаемся
ind: mov dptr,#b000h;используем левый индикатор mov a,32h;считываем число из 32 ячейки (куда мы писали точки и тире) cjne a,#00011110b,ind1;и просто сверяем его с возможными вариантами если совпало - выводим результат mov a,#00000001b movx @dptr,a jmp final ind1: cjne a,#00011100b,ind2 mov a,#00000010b movx @dptr,a jmp final ind2: cjne a,#00011000b,ind3 mov a,#00000100b movx @dptr,a jmp final ind3: cjne a,#00010000b,ind4 mov a,#00001000b movx @dptr,a jmp final ind4: cjne a,#00000000b,ind5 mov a,#00010000b movx @dptr,a jmp final ind5: cjne a,#00000010b,ind6 mov a,#00001010b movx @dptr,a jmp final ind6: cjne a,#00000001b,ind7 mov a,#00001011b movx @dptr,a jmp final ind7: cjne a,#00000101b,ind8 mov a,#00001100b movx @dptr,a jmp final ind8: cjne a,#00000001b,ind9 mov a,#00001101b movx @dptr,a jmp final ind9: cjne a,#00000000b,ind10 mov a,#00001110b movx @dptr,a jmp final ind10: cjne a,#00000100b,error mov a,#00001111b movx @dptr,a jmp final error: mov a,#00001111b movx @dptr,a
final: clr tr0;останавливаем таймер clr tf0;чистим флажок clr 31h;удаляем всю конфигурацию setb 31.1h;ставим флажок что можно ити дальше reti;возвращаемся с прерывания
|
Заранее за всё очень-очень благодарен!!!
|