Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дешифратор азбуки морзе, Стенд EV8031-AVR 
:(
    Опции темы
Kirgston
Дата 18.6.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Всем доброго времени суток! Ребята помогите пожалуйста закончить курсовую работу. Я несколько раз переписывал всё с нуля но ниразу "как надо" не заработало. Суть какая. Есть кнопка на порте P3.3 по её нажатию надо определить было это тире или точка (по интервалу нажатия). А потом посмотреть результат и вывести нужную букву или цифру на экран. Дело в том что оно не выводит... уже 3ий день мучаюсь... много чего переделывал и исправлял. Но результата так и не увидил. Очень прошу вашей помощи! Код снабжен множеством комментариев. Так что думаю разобратся будет не сложно... ну практически  smile  smile 
Используемый ассемблер - Ассемблер для микропроцессоров семейства 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;возвращаемся с прерывания



Заранее за всё очень-очень благодарен!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1076 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.