.asm клавиатура

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
asd
Встал на лапы
Аватара пользователя
Сообщения: 95
Зарегистрирован: Сб янв 20, 2007 22:03:21
Откуда: от верблюда

Сообщение asd »

Не могу понять в чем ошибка кода ( вывод кода цифры на 7 сигм индикатор при нажатии на клавиатуру 3x4)
123
456
789
*0# - это моя клавиатура

нажимаю 1 кнопку на семи сигм индикатор выводит значение соответстуешее 4 кнопке
нажимаю 4 выводит 7 кнопку
7 - *
* - 1

а надо чтобы соответствовали
1 - 1
4 - 4
7 - 7
* - * ну как положено

.include "d:\avr\avrasm\appnotes\2313def.inc"

.def Temp =R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19

.dseg
Line: .byte 5
Key: .byte 1
Pass: .byte 5

;**********************************************

.cseg
.org 0

ldi Temp,RamEnd ;set stack
out SPL,Temp

ldi Temp,0b00001111
out ddrD,Temp

ldi Temp,0b11111111
out ddrB,Temp

;**********************************************

IndicCycle:
rcall Scan
rcall KeyRead
rcall Keyboard

rjmp IndicCycle

;***********************************************

Scan:
ldi Temp,0b11111110
out PortD,Temp
in Temp,PinD
sts Line,Temp

ldi Temp,0b11111101
out PortD,Temp
in Temp,PinD
sts Line+1,Temp

ldi Temp,0b11111011
out PortD,Temp
in Temp,PinD
sts Line+2,Temp

ldi Temp,0b11110111
out PortD,Temp
in Temp,PinD
sts Line+3,Temp



ret

;***********************************************

KeyRead:
lds Temp,Line
rcall KeyTest
ldi Temp,0
cpi Temp1,255
brne SetKey

lds Temp,Line+1
rcall KeyTest
ldi Temp,3
cpi Temp1,255
brne SetKey

lds Temp,Line+2
rcall KeyTest
ldi Temp,6
cpi Temp1,255
brne SetKey

lds Temp,Line+3
rcall KeyTest
ldi Temp,9
cpi Temp1,255
brne SetKey



ldi Temp,0

;*******************************************

SetKey: add Temp,Temp1

lds Temp1,Key

andi Temp1,0b00001111
cp Temp,Temp1
brne EndKeyRead

ori Temp,0b10000000

EndKeyRead:
sts Key,Temp

ret

;********************************************

KeyTest:andi Temp,0b01110000 ;обрезаем по маске
ldi Temp1,0b01110000
eor Temp,Temp1 ;инвертируем биты по маске
breq NoButtons ;если все нули (нет нажатых)
;переходим по метке

ldi Temp1,0 ;инициализируем счетчик

cpi Temp,0b00010000 ;проверяем 0-ю кнопку
breq EndKeyTest ;нажато - выход
inc Temp1 ;иначе - инкремент счетчика

cpi Temp,0b00100000 ;проверка 2 кнопки
breq EndKeyTest
inc Temp1

cpi Temp,0b01000000 ;проверка 3 кнопки
breq EndKeyTest

NoButtons:
ldi Temp1,255 ;если ничего не нажато -
;возвращаем 255

EndKeyTest: ret

;************************************************

Keyboard:
;запускает выполнение операции, закрепленной за кнопкой


lds Temp,Key ;загружаем переменную Key
mov Temp1,Temp ;проверяем на наличие флажка
andi Temp1,0b10000000 ;"повтор" или -1
brne EndKeyboard ;если повтор или -1 - выходим


out PortB,Temp

EndKeyboard: ret
Реклама
asd
Встал на лапы
Аватара пользователя
Сообщения: 95
Зарегистрирован: Сб янв 20, 2007 22:03:21
Откуда: от верблюда

Сообщение asd »

это код
Вложения
code.asm
(3.05 КБ) 210 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Схему приведите заодно, а то мало ли как и что подключено...
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»