Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 15.11.2007, 15:59   #1
GunsElf
Junior Member
 
Регистрация: 15.11.2007
Сообщений: 4
Вес репутации: 100/0
GunsElf will become famous soon enoughGunsElf will become famous soon enough
Exclamation Профи по PIC16F84 - отзовитесь.

Коллеги, нужна ваша помощь, а ситуация такая:
есть код программы для опроса клавиатуры, состоящей из 12 кнопок в виде матрицы 3х4. Программа написана под PIC 16C54. Задача: написать програаму под PIC16F84A.

;************************************************* *************
; Программа TASTATUR.asm. Управление матричной клавиатурой 3x4,
; индикация с помощью четырех светодиодов через выводы порта A.
; PIC 16C54, f = 2 МГц
;************************************************* *************

; Определения:

; Регистры
PC equ 2 ; Программный счетчик
STAT equ 3 ; Регистр состояния
ANZEIGE equ 5 ; Регистр порта A
PORTB equ 6
TASTE equ 8
TASTE1 equ 9
ZEILE equ 0A
ZAEHL1 equ 0B ; Для учета дребезга контактов
ZAEHL2 equ 0C

; Разряды в регистрах
spalte1 equ 4
spalte2 equ 5
spalte3 equ 6
carry equ 0
zero equ 2

; Регистры назначения в регистровых операциях
w equ 0
f equ 1

org 0 ; Начало программы при PC = 0
beginn goto init
;************************************************* *************
; Подпрограмма "Пауза"
;************************************************* *************
pause movlw 1A ; Загружаем в ZAEHL2 26d
movwf ZAEHL2
clrf ZAEHL1 ; Обнуляем ZAEHL1
wdh1 decfsz ZAEHL1,f ; Длительность цикла счета
; 3 командных цикла = 6 мкс
goto wdh1 ; Длительность паузы
; 26 x 256 x 6 мкс = 40 мс
decfsz ZAEHL2,f
goto wdh1
retlw 0
;************************************************* *************
; Подпрограмма "Чтение", разъясняется в блок-схеме алгоритма
;************************************************* *************
lesen clrf TASTE
movlw 0FF
movwf PORTB ; Порт B = 1111 1111b
movlw 4
movwf ZEILE ; Счетчик строк = 4
bcf STAT,carry ; Сбрасываем флаг C
lies rlf PORTB,f ; Флаг C - в RB0
btfss PORTB,spalte1 ; Пропускаем следующую
; команду, если RB0 = 1
goto fertig ; Иначе выходим из "lesen"
incf TASTE,f ; Увеличиваем TASTE
btfss PORTB,spalte2 ; Пропускаем следующую
; команду, если RB1 = 1
goto fertig
incf TASTE,f ; Цикл "lies" выполняется
btfss PORTB,spalte3 ; максимум 4 раза, если не
; нажата никакая кнопка
goto fertig
incf TASTE,f
decfsz ZEILE,f ; Уменьшаем счетчик строк и
; в случае 0 - переход
goto lies
fertig retlw 0
;************************************************* *************
; Подпрограмма "Таблица". Идедтификация TASTE по обозначению
; кнопки. К счетчику команд прибавляется (w) и указанное при
; выходе значение опять записывается в W
;************************************************* *************
tab addwf PC,f
retlw 1 ; Кнопка 1
retlw 2 ; Кнопка 2
retlw 3 ; Кнопка 3
retlw 4 ; Кнопка 4
retlw 5 ; Кнопка 5
retlw 6 ; Кнопка 6
retlw 7 ; Кнопка 7
retlw 8 ; Кнопка 8
retlw 9 ; Кнопка 9
retlw 0E ; Кнопка * (E выбрано умышленно)
retlw 0 ; Кнопка 0
retlw 0F ; Taste # (F выбрано умышленно)
;************************************************* *************
; Начало главной программы
;************************************************* *************
init movlw 0F0 ; Определение порта B:
; RB0 - RB3 - выходы
tris PORTB ; RB4 - RB7 - входы
clrw
tris ANZEIGE ; Порт A определен как выход
clrf ANZEIGE ; Индикация = 0
clrf TASTE1

tast call lesen
bcf STAT,zero ; Сбрасываем флаг Z в STATUS
movlw 0C ; Загружаем в w значение 0Ch
subwf TASTE,w ; Сравниваем TASTE с 0Ch путем
; вычитания
btfss STAT,zero ; Если флаг Z установлен, то
; TASTE=0Ch, кнопка не нажата
goto wart ; Если TASTE < 0Ch, выжидаем
; паузу с учетом дребезга
goto tast ; Иначе повторяем чтение
wart call pause ; Пауза около 40 мс, чтобы
; сгладить дребезг контактов
movf TASTE,w ; (TASTE) – в W
movwf TASTE1 ; (TASTE) = TASTE1
wdh call lesen
bcf STAT,zero ; TASTE = TASTE1?
movf TASTE,w
subwf TASTE1,w
btfss STAT,zero ; Флаг Z установлен,
; если TASTE = TASTE1
goto tast ; Если нет, повторяем чтение
anz movf TASTE1,w ; Иначе задействуем значение
call tab ; Преобразуем номер кнопки
movwf ANZEIGE ; и отображаем посредством
; вывода через порт A
goto tast

org 1FF
goto beginn
end

А это мой переделанный под PIC16F84A код. Знаю что что-то неправильно, но не знаю что. Жду советы.

list p=16F84A ; директива, определяющая тип процессора
#include <p16F84A.inc> ; файл, описывающий специфические
; переменные, соответствующие процессору
; Описание параметров программирования микроконтроллера
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

; описание используемых переменных
PC EQU 0x0C ; Программный счетчик
STAT EQU 0x0D ; Регистр состояния
ANZEIGE EQU 0x0E ; Регистр порта A
TASTE EQU 0x10
TASTE1 EQU 0x11
ZEILE EQU 0x12
ZAEHL1 EQU 0x13 ; Для учета дребезга контактов
ZAEHL2 EQU 0x14
c1 EQU 0x15 ; переменная цикла
c2 EQU 0x16

; Исполняемая программа
ORG 0x000 ; вектор сброса процессора на адрес 0x00
clrf PORTA ; очистили выходные защелки порта А
clrf PORTB ; очистили выходные защелки порта B
bsf STATUS, RP0 ; включили банк 1
movlw b'00000000' ; настроили на вывод
movwf TRISA ; все разряды порта А
movlw b'11110000' ; настроили на вывод разряды <1…3>,
movwf TRISB ; на ввод разряды <4…7> ; порта B
bcf OPTION_REG, 7 ; включ. подтягивающие резисторы канала B
bcf STATUS, RP0 ; включили банк 0

beginn goto init

;************************************************* *************
; Подпрограмма "Пауза" 50 мс
;************************************************* *************
delay
movlw 0x14 ; устанавливаем начальное значение
movwf c1 ; переменной внешнего цикла
m1 movlw 0x14 ; устанавливаем начальное значение
movwf c2 ; переменной вложенного цикла
m2 decfsz c2,f ; декремент переменной цикла (c2=c2-l)
goto m2 ; если c2 не равна нулю, повторить декремент,
decfsz c1,f ; иначе декремент переменной внешнего цикла
goto m1 ; если c1 неравна нулю, повторяем цикл,
; если обе переменных счетчика обнулились,
return ; возврат из подпрограммы


;************************************************* *************
; Подпрограмма "Чтение", разъясняется в блок-схеме алгоритма
;************************************************* *************
lesen clrf TASTE
movlw 0FF
movwf PORTB ; Порт B = 1111 1111b
movlw .4
movwf ZEILE ; Счетчик строк = 4
bcf STATUS,C ; Сбрасываем флаг C
lies rlf PORTB,f ; Флаг C - в RB0
btfss STATUS, 4 ; Пропускаем следующую
; команду, если RB0 = 1
goto fertig ; Иначе выходим из "lesen"
incf TASTE,f ; Увеличиваем TASTE
btfss STATUS,RP0 ; Пропускаем следующую
; команду, если RB1 = 1
goto fertig
incf TASTE,f ; Цикл "lies" выполняется
btfss STATUS,RP1 ; максимум 4 раза, если не
; нажата никакая кнопка
goto fertig
incf TASTE,f
decfsz ZEILE,f ; Уменьшаем счетчик строк и
; в случае 0 - переход
goto lies
fertig retlw 0
;************************************************* *************
; Подпрограмма "Таблица". Идедтификация TASTE по обозначению
; кнопки. К счетчику команд прибавляется (w) и указанное при
; выходе значение опять записывается в W
;************************************************* *************
tab addwf PC,f
retlw 1 ; Кнопка 1
retlw 2 ; Кнопка 2
retlw 3 ; Кнопка 3
retlw 4 ; Кнопка 4
retlw 5 ; Кнопка 5
retlw 6 ; Кнопка 6
retlw 7 ; Кнопка 7
retlw 8 ; Кнопка 8
retlw 9 ; Кнопка 9
retlw 0E ; Кнопка * (E выбрано умышленно)
retlw 0 ; Кнопка 0
retlw 0F ; Taste # (F выбрано умышленно)
;************************************************* *************
; Начало главной программы
;************************************************* *************
init clrf TASTE1

tast call lesen
bcf STATUS,Z ; Сбрасываем флаг Z в STATUS
movlw 0C ; Загружаем в w значение 0Ch
subwf TASTE,w ; Сравниваем TASTE с 0Ch путем
; вычитания
btfss STATUS,Z ; Если флаг Z установлен, то
; TASTE=0Ch, кнопка не нажата
goto wart ; Если TASTE < 0Ch, выжидаем
; паузу с учетом дребезга
goto tast ; Иначе повторяем чтение
wart call delay ; Пауза около 40 мс, чтобы
; сгладить дребезг контактов
movf TASTE,w ; (TASTE) – в W
movwf TASTE1 ; (TASTE) = TASTE1
wdh call lesen
bcf STATUS,Z ; TASTE = TASTE1?
movf TASTE,w
subwf TASTE1,w
btfss STATUS,Z ; Флаг Z установлен,
; если TASTE = TASTE1
goto tast ; Если нет, повторяем чтение
anz movf TASTE1,w ; Иначе задействуем значение
call tab ; Преобразуем номер кнопки
movwf PORTA ; и отображаем посредством
; вывода через порт A
goto tast

org 1FF
goto beginn
end
Миниатюры
Схема.jpg  
GunsElf вне форума   Ответить с цитированием
Старый 15.11.2007, 16:23   #2
DRoVik
Senior Member
 
Регистрация: 26.02.2007
Сообщений: 148
Вес репутации: 103/49
DRoVik will become famous soon enoughDRoVik will become famous soon enough
По умолчанию Re: Профи по PIC16F84 - отзовитесь.

Может я неправ... Но по-моему - ставим какой-нибудь CCS или MikroC и не мучаемся с переделкой ассемблерного кода...
p.s. Хотя может там и переделывать особо ничего не надо, я c 16C54 вообще не работал
DRoVik вне форума   Ответить с цитированием
Старый 15.11.2007, 17:09   #3
KYV
Senior Member
 
Аватар для KYV
 
Регистрация: 26.02.2007
Адрес: Великий Новгород
Возраст: 48
Сообщений: 144
Вес репутации: 143/49
KYV will become famous soon enoughKYV will become famous soon enough
Отправить сообщение для KYV с помощью ICQ
По умолчанию Re: Профи по PIC16F84 - отзовитесь.

Цитата:
Сообщение от GunsElf Посмотреть сообщение
Коллеги, нужна ваша помощь, а ситуация такая:
есть код программы для опроса клавиатуры, состоящей из 12 кнопок в виде матрицы 3х4. Программа написана под PIC 16C54. Задача: написать програаму под PIC16F84A.
end
Немец однако первую прогу написал. А после немца наш переделал и получилось, как всегда...
Понятно, что курсовик горит, но попробуте сами с "0" сделать, может даже удовольствие получите , что хоть что-то сами сделали, может и затянет потом.
Мне например лень разбираться, что в проге не так, может и у неца она нерабочая, но если надо алгоритм подскажу.

Злой препод.
KYV вне форума   Ответить с цитированием
Старый 15.11.2007, 18:26   #4
Andrey
Senior Member
 
Регистрация: 26.02.2007
Сообщений: 144
Вес репутации: 101/49
Andrey will become famous soon enoughAndrey will become famous soon enough
По умолчанию Re: Профи по PIC16F84 - отзовитесь.

у-у-у-хххх большой и тяжелый код ! вернее лишнего много. Но новичёк на то и новичёк чтобы учиться. Если нужна рабочая и отлаженная прога, то могу кинуть. Кстати. Выходы пика желательно развязать диодами чтобы при одновременном нажатии на клавиши, ноги не коротили друг друга.
Andrey вне форума   Ответить с цитированием
Старый 15.11.2007, 18:40   #5
GunsElf
Junior Member
 
Регистрация: 15.11.2007
Сообщений: 4
Вес репутации: 100/0
GunsElf will become famous soon enoughGunsElf will become famous soon enough
По умолчанию Re: Можно на ящик Gunself@mail.ru

Можно на ящик Gunself@mail.ru
Премного буду признателен.
GunsElf вне форума   Ответить с цитированием
Старый 16.11.2007, 13:27   #6
AlexWonder
Member
 
Регистрация: 05.11.2007
Возраст: 40
Сообщений: 52
Вес репутации: 102/46
AlexWonder will become famous soon enoughAlexWonder will become famous soon enough
Отправить сообщение для AlexWonder с помощью ICQ Отправить сообщение для AlexWonder с помощью Skype™
По умолчанию Re: Профи по PIC16F84 - отзовитесь.

Ставим подтягивание порта Б на +5
настраиваем пб0 - пб3 на вход, пб4 - пб7 на выход

выплевываем в портБ значения
1110хххх
смотрим что считалось (по маске хххх1111)
если все 1 то ряд 147* не нажат
далее
1101хххх
смотрим что считалось (по маске хххх1111)
если все 1 то ряд 2580 не нажат
далее
1011хххх
смотрим что считалось (по маске хххх1111)
если все 1 то ряд 369# не нажат
AlexWonder вне форума   Ответить с цитированием
Старый 16.11.2007, 19:52   #7
Синклер
Senior Member
 
Регистрация: 06.03.2007
Адрес: Череповец
Возраст: 50
Сообщений: 484
Вес репутации: 124/52
Синклер will become famous soon enoughСинклер will become famous soon enough
По умолчанию Re: Профи по PIC16F84 - отзовитесь.

Цитата:
Сообщение от Andrey Посмотреть сообщение
Кстати. Выходы пика желательно развязать диодами чтобы при одновременном нажатии на клавиши, ноги не коротили друг друга.
Они и так коротить не будут, если для опроса (лог.0 подавать) юзать TRISn регистр.
Синклер вне форума   Ответить с цитированием
Старый 16.11.2007, 19:56   #8
Синклер
Senior Member
 
Регистрация: 06.03.2007
Адрес: Череповец
Возраст: 50
Сообщений: 484
Вес репутации: 124/52
Синклер will become famous soon enoughСинклер will become famous soon enough
По умолчанию Re: Профи по PIC16F84 - отзовитесь.

Цитата:
Сообщение от AlexWonder Посмотреть сообщение
Ставим подтягивание порта Б на +5
настраиваем пб0 - пб3 на вход, пб4 - пб7 на выход

выплевываем в портБ значения
1110хххх
смотрим что...
...произойдет если нажать разом 2 кнопки на 5 и 4

Люди не ... ну ладно ... тяп-ляп написал, но вы то (профи ёпт) куда вслед за ним
Синклер вне форума   Ответить с цитированием
Старый 17.11.2007, 00:11   #9
urry
Senior Member
 
Аватар для urry
 
Регистрация: 11.10.2007
Возраст: 57
Сообщений: 462
Вес репутации: 228/51
urry has a spectacular aura abouturry has a spectacular aura abouturry has a spectacular aura about
По умолчанию Re: Профи по PIC16F84 - отзовитесь.

Никто не ведется (из профи - имею в виду) -только от дефицита тем смотрят, чем закончится. Неужели Вы считаете, что это трудно написать ?
urry вне форума   Ответить с цитированием
Старый 17.11.2007, 13:07   #10
Синклер
Senior Member
 
Регистрация: 06.03.2007
Адрес: Череповец
Возраст: 50
Сообщений: 484
Вес репутации: 124/52
Синклер will become famous soon enoughСинклер will become famous soon enough
По умолчанию Re: Профи по PIC16F84 - отзовитесь.

Я не считаю, мне советы в теме дюже...

Интересно, а автору тема ещё актуальна ? Мне просто лень искать где у меня такой код для клавы, но если...

Хотя его и самому написать легко, по очереди переводишь (не забывая потом возвращать их обрано) BCF TRISB,n биты сторок на вывод (заранее прописываешь в порт все нули) и смотришь командой BTFSS состояние столбцов.
Синклер вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем/как отлаживать код написаный на Си в WinAVR Yokel Микроконтроллеры других производителей 49 30.09.2014 09:48
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50
gprs тарификация (конкретнее- по sim300) MaxB Общетехнические вопросы 4 21.08.2008 20:16
Помогите с контрольной по PIC16F84 MatroSKIN Продукция MICROCHIP 11 03.12.2007 11:48


Часовой пояс GMT +3, время: 22:38.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot