Страница 1 из 1

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

Добавлено: Вс окт 11, 2009 15:14:03
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

Добавлено: Вс окт 11, 2009 15:17:44
asd
это код

Добавлено: Вс окт 11, 2009 19:28:28
Meteor
Схему приведите заодно, а то мало ли как и что подключено...