.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

          





			














