Не могу понять в чем ошибка кода ( вывод кода цифры на 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
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
