.include "m16def.inc"

.equ col1=0
.equ col2=1
.equ col3=2
.equ col4=3
.equ scan_port=porta
.equ input_port=pina
.equ 	XTAL = 8000000 	
.equ 	baudrate = 4800  
.equ 	bauddivider = XTAL/(16*baudrate)-1

.def scan_out = r16
.def key=r18
.def scan_in=r17
.def count=r20
.def temp=r19
.def temp1= r21
.def temp2=r22
.def null=r23

.dseg
scancode: .byte 1

.cseg

.org 0
              rjmp RESET    ; Reset Handler
              rjmp EXT_INT0 ; IRQ0 Handler
              rjmp EXT_INT1 ; IRQ1 Handler
              rjmp TIMER2_MATCH ; Timer2 MATCH
              rjmp TIMER2_OVF ; Timer2 OVERFLOW
              rjmp TIMER1_CAPTURE ; Timer1 CAPTURE
              rjmp TIMER1_MATCH_A ; Timer1 MATCH A
			  rjmp TIMER1_MATCH_B ; timer1 MATCH B
			  rjmp TIMER1_OVF ;TIMER1 OVERFLOW	
			  rjmp TIMeR0_OVF ;TIMER0 OVERFLOW
			  rjmp SPI_STC	; SERIAL TRANSFER COMPLETE
              rjmp UART_RXC ; UART RX Complete Handler
              rjmp UART_DRE ; UDR Empty Handler
              rjmp UART_TXC ; UART TX Complete Handler
			  rjmp ADC_complete;a-d  conversion
			  rjmp EEPROM_READY
              rjmp ANA_COMP ; Analog Comparator Handler
			  rjmp TWI_INT; 2-WIRE INTERFACE
			  rjmp EXT_INT2;
			  rjmp TIMER0_COMP; TIMER0 COMPARE MATCH
			  rjmp SPM_READY


  EXT_INT0: ; IRQ0 Handler
  EXT_INT1 :; IRQ1 Handler
  ;TIMER2_MATCH :; Timer2 MATCH ;На всякий случай внизу заглушка, нооно по идее отключено
  ;TIMER2_OVF :; Timer2 OVERFLOW
  TIMER1_CAPTURE :; Timer1 CAPTURE
  TIMER1_MATCH_A :; Timer1 MATCH A
  TIMER1_MATCH_B :; timer1 MATCH B
  ;TIMER1_OVF :;TIMER1 OVERFLOW	
  TIMeR0_OVF :;TIMER0 OVERFLOW
  SPI_STC	:; SERIAL TRANSFER COMPLETE
  ;UART_RXC :; UART RX Complete Handler
  UART_DRE :; UDR Empty Handler
  UART_TXC :; UART TX Complete Handler
  ADC_complete:;a-d  conversion
  EEPROM_READY:
  ANA_COMP :; Analog Comparator Handler
  TWI_INT:; 2-WIRE INTERFACE
  EXT_INT2:;
  TIMER0_COMP:; TIMER0 COMPARE MATCH
  SPM_READY: RETI

reset: 
cli
ldi r16, low(ramend)
out spl, r16
ldi r16, high(ramend)
out sph, r16
ldi r16, 0b11110000
out ddra, r16
out ddrd, r16
ldi r16, $ff
out ddrb, r16
;Инициализация UART
LDI 	R16, low(bauddivider)
OUT 	UBRRL,R16
LDI 	R16, high(bauddivider)
OUT 	UBRRH,R16
LDI 	R16,0
OUT 	UCSRA, R16
; прерывание по приему включено, по передаче - выключено, прием-передача разрешены.
LDI 	R16, (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
OUT 	UCSRB, R16	
; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
LDI 	R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
OUT 	UCSRC, R16
;Инициализация таймера 2 (типа асинхронного)   ; Здесь кусок от ValBag
ldi R16, (1<<AS2)      ; асинхронный режим
out ASSR, R16
ldi R16, 0x00
out TCNT2, R16
ldi R16, (1<<TOIE2)      ; флаг разрешения прерывания по переполнению Т2
out TIMSK, R16
ldi R16, ((1<<CS22)|(1<<CS20))   ; 32768/128
out TCCR2, R16
sei ; включаем прерывания
ldi temp2, 1
;========поехали))================================================================
 ;============================ основной цикл =====================================
start:
;rcall keypad     ;закомментил для отладки таймера
;rcall doSomething
rjmp start
;============================Проверка клавиатуры=====================================
keypad:
ldi scan_out, 0b00010000
ldi temp, 0
keypad1:
out scan_port, scan_out
nop
nop
nop
nop
in scan_in, input_port  ;
nop
ldi key, 0 ;если ничего не нажато, сканкод 0
sbrc scan_in, col1
ldi key, 1
sbrc scan_in, col2
ldi key, 5
sbrc scan_in, col3
ldi key, 9
sbrc scan_in, col4
ldi key, 13
ldi temp1, 0		;если первичный сканкод 0, то вторичный сканкод во 2,3,4 столбцах его сдвинет, даже если ниче не нажато. 
cpse key, temp1		;так что - условно-пронудительное обнуление.
add key, temp		;формируем конечный сканкод
out portb, key		;и выводим его на светики (для шпротеуса)
sts scancode, key	;и в оперативку (для суровой реальности)
nop					;итого у нас 17 возможных сканкодов: по одному для каждой кнопки и 0 если ниче не нажато.
nop
ldi temp1, 3
cpse temp, temp1		;Последний столбец?
rjmp keypad2		;если нет - проверка след'щего
ret					;если да - обратно в основной цикл

keypad2:
lsl scan_out		
inc temp
rjmp keypad1
;=======================================================================================================
doSomething:
rcall uart_snt
ret
;=======================================================================================================
delay: 
ldi r31, 0
delay1:
dec r31
brne delay1
ret
;=====================================================================================================
uart_snt:	
ldi temp1, 'a'
;com temp1
;ldi temp2, $ff
;eor temp1, temp2
;neg temp1
SBIS 	UCSRA,UDRE	; Пропуск если нет флага готовности
RJMP	uart_snt 	; ждем готовности - флага UDRE
OUT	UDR, temp1	; шлем байт
RET			; Возврат

Timer2_ovf:
rcall uart_snt
reti

Timer2_match:
	out portb, temp2
	swap temp2
reti

TIMER1_OVF:
out portb, temp2
swap temp2
reti

uart_rxc:
nop
reti

