📄 keyboard.asm
字号:
cpi counter2,KEY_CLEAR ;clear buffer
brne goto_read_card
clr app_state
; rcall delay_200ms ;for release key,2006.9.19move here
; rjmp exit_ps2_listen
rjmp no_item_equ
goto_read_card:
// cpi counter2,11 ;first = read card
// brne goto_send_result
;rcall send_reset_sam
// rcall send_find_card
; sei
; wdr
// ldi app_state, find_card_state ;find_card_state reset_sam_state
;wait_comm_sam:
; wdr
; sbis sam_tfrm_addr,sam_tfrm
; rjmp wait_comm_sam
; ret
// rjmp exit_ps2_listen
goto_send_result:
cpi app_state,card_upload_state
brne no_item_equ
cpi counter2,KEY_NAME ;name send
brne goto_send_sex
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_name
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_sex:
cpi counter2,KEY_SEX
brne goto_send_nation
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_sex
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_nation:
cpi counter2,KEY_FOLK
brne goto_send_birth
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_nation
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_birth:
cpi counter2,KEY_BIRTH
brne goto_send_id
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_birth
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_id:
cpi counter2,KEY_ID
brne goto_send_address
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_id
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_address:
cpi counter2,KEY_ADDRESS
brne goto_send_issue
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_address
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_issue:
cpi counter2,KEY_SIGN
brne goto_send_exper1
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_issue
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_exper1:
cpi counter2,KEY_EXPER1
brne goto_send_exper2
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_exper
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_exper2:
cpi counter2,KEY_EXPER2
brne goto_send_all
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_exper2
rcall turn_on_key
rjmp exit_ps2_listen
goto_send_all:
cpi counter2,KEY_AUTO
brne exit_ps2_listen
mov counter2,counter1 ;add for release
rcall shut_off_key
rcall send_key_image
rcall turn_on_key
exit_ps2_listen:
sei
ret
listen_ps2_error:
sei ;clear buffer
ldi temp1, 2
rcall delay_mS ;for clk sync
clr counter1
ret
;-------------------
/*** ********* add 2006 9 19 for relase key *******/
send_break_key:
;input counter2
;use key_buffer
ldi ZL,key_buffer_low
ldi ZH,key_buffer_high
clc
add ZL, counter2
adc ZH,zero_register
ldi temp1, 10
rcall delay_mS
wdr
ldi temp1,0xf0
mov key_value,temp1
rcall send_key_to_pc
mov temp1, key_delay
rcall delay_mS
wdr
ld temp1, -Z
mov key_value,temp1
rcall send_key_to_pc
mov temp1, key_delay
rcall delay_mS
wdr
ldi temp1,0xf0
mov key_value,temp1
rcall send_key_to_pc
mov temp1, key_delay
rcall delay_mS
wdr
ld temp1, -Z
mov key_value,temp1
rcall send_key_to_pc
ret
/*** ********************* ***/
shut_off_key:
wdr
ldi temp1,3
rcall delay_mS
wdr
; rcall delay_200ms
; rcall delay_200ms
cbi key_sw_addr,key_sw ;disable key_boar
in temp1, DDRB
ori temp1, ps2_out_put
out DDRB, temp1
sbi ps2_dat_addr,ps2_dat
sbi ps2_clk_addr,ps2_clk
cli
rcall send_break_key
ret
turn_on_key:
mov temp1, key_delay
rcall delay_mS
sbi ps2_dat_addr,ps2_dat
sbi ps2_clk_addr,ps2_clk
in temp1,DDRB
andi temp1,ps2_in_put
out DDRB,temp1
sbi key_sw_addr,key_sw ;enable key_boar
ret
release_key:
sbi ps2_dat_addr,ps2_dat
sbi ps2_clk_addr,ps2_clk
in temp1,DDRB
andi temp1,ps2_in_put
out DDRB,temp1
ret
;======================================
download_key_table:
/*
rcall delay_200ms
rcall delay_200ms
rcall delay_200ms
rcall delay_200ms
rcall delay_200ms*/
mov counter2,counter1
rcall shut_off_key
/* ******* add 2006 9 19 for release key (break) ******** *
;REMOVED 2006.9.25 FOR SHUT_OFF_KEY
mov temp1, key_delay
rcall delay_mS
mov key_value,temp1
rcall send_key_to_pc
mov temp1, key_delay
rcall delay_mS
ldi temp1,0x23
mov key_value,temp1
rcall send_key_to_pc
mov temp1, key_delay
rcall delay_mS
ldi temp1,0xf0
mov key_value,temp1
rcall send_key_to_pc
mov temp1, key_delay
rcall delay_mS
ldi temp1,0x14
mov key_value,temp1
rcall send_key_to_pc
mov temp1, key_delay
rcall delay_mS
rcall send_key_ack
rcall delay_200ms
/***** ********************* *****/
ldi temp,0xcc
out UDR,temp
sbis UCSRA,UDRE
rjmp $-2
;start 0xaa
;stop 0x00
;counter1 count
;pc send a 0xff reset key_board after download over delay 200ms
; ldi ZH, key_buffer_high
; ldi ZL, key_buffer_low
ldi ZH, usb_buffer_high
ldi ZL, usb_buffer_low
clr counter1
clr key_value ;check
download_key_start:
wdr
sbic ps2_dat_in_addr,ps2_dat ;if(!data)some value come
rjmp download_key_start
ldi temp,key_board_err
mov cmd_register,temp
rcall rec_ps2_from_pc
out UDR, key_bit_buffer
sbis UCSRA,UDRE
rjmp $-2
cp cmd_register,zero_register ;error
brne download_key_failure
ldi key_bit_count,0xf0
cp key_bit_buffer,key_bit_count ;over
breq download_key_table_over
st Z+, key_bit_buffer
eor key_value,key_bit_buffer
inc counter1
rjmp download_key_start
download_key_table_over:
; cpse cmd_register,zero_register
; rjmp download_key_failure
ldi temp,0xdd
out UDR,temp
sbis UCSRA,UDRE
rjmp $-2
rcall send_key_ack
rcall turn_on_key
ldi eeprom_addrh,0
ldi eeprom_addrl,0
; ldi ZH, key_buffer_high
; ldi ZL, key_buffer_low
ldi ZH, usb_buffer_high
ldi ZL, usb_buffer_low
store_key_table:
ld eeprom_data, Z+
rcall write_eeprom
adiw eeprom_addrl,0x01
dec counter1
brne store_key_table
ret
download_key_failure:
ldi temp,0xee
out UDR,temp
sbis UCSRA,UDRE
rjmp $-2
rcall send_key_nack
rcall turn_on_key
ret
;===========================================================
;function: recieve config data
;input: no
;output: no
;use: key_bit_count,parity,key_bit_buffer
rec_ps2_from_pc:
sbis ps2_clk_in_addr,ps2_clk ;pc_clk -> high ,now, we get clk_line
rjmp $-2
sbic ps2_dat_in_addr,ps2_dat ;pc_data = high, failure
ret
ldi key_bit_count, 8
ldi parity, 0x00
rcall delay_2uS
rec_ps2_loop:
cbi ps2_clk_addr,ps2_clk
rcall delay_2uS
sbi ps2_clk_addr,ps2_clk
rcall delay_2uS
clc
sbic ps2_dat_in_addr,ps2_dat
sec
ror key_bit_buffer
sbrc key_bit_buffer, 7
inc parity
rec_ps2_loop1:
ldi temp1,0x01
sbis ps2_clk_in_addr,ps2_clk
rjmp rec_ps2_error
dec key_bit_count
brne rec_ps2_loop
cbi ps2_clk_addr,ps2_clk
rcall delay_2uS
sbi ps2_clk_addr,ps2_clk
rcall delay_2uS
sbic ps2_dat_in_addr,ps2_dat ;parity bit
inc parity
;sbis ps2_clk_in_addr,ps2_clk ;here,always be low,but a high ask
;rjmp rec_ps2_error
cbi ps2_clk_addr,ps2_clk
rcall delay_2uS
sbi ps2_clk_addr,ps2_clk
rcall delay_2uS
cbi ps2_dat_addr,ps2_dat ;ack
rcall delay_2uS
cbi ps2_clk_addr,ps2_clk
rcall delay_2uS
sbi ps2_dat_addr,ps2_dat
sbrc parity, 0 ;partiy xor rx8 = 1,odd success
clr cmd_register
rec_ps2_error:
sbi ps2_clk_addr,ps2_clk
sbi ps2_dat_addr,ps2_dat
;rcall release_key
ret
;=======================================
write_eeprom:
;input:eeprom_addr
; eeprom_data
wdr
sbic EECR,EEWE
rjmp write_eeprom
out EEARH, eeprom_addrh
out EEARL, eeprom_addrl
out EEDR, eeprom_data
sbi EECR, EEMWE
sbi EECR, EEWE
ret
read_eeprom:
;input:eeprom_addr
;output:eeprom_data
sbic EECR,EEWE
rjmp read_eeprom
out EEARH, eeprom_addrh
out EEARL, eeprom_addrl
sbi EECR, EERE
in eeprom_data,EEDR
ret
/************** app command ******************
send_reset_sam:
ldi ZL,usb_buffer_low
ldi ZH,usb_buffer_high
ldi temp,0xaa
st Z+,temp
st Z+,temp
st Z+,temp
ldi temp,0x96
st Z+,temp
ldi temp,0x69
st Z+,temp
ldi temp,0x00
st Z+,temp
ldi temp,0x04
st Z+,temp
ldi temp,0x61
st Z+,temp
ldi temp,0xff
st Z+,temp
ldi temp,0xfa
st Z+,temp
ldi temp,0x60
st Z+,temp
ldi ZL,usb_buffer_low
ldi ZH,usb_buffer_high
ldi counter1,11
wdr
rcall comm_uart_send
ret
/************** app command ******************/
send_set_sam_buf:
ldi ZL,usb_buffer_low
ldi ZH,usb_buffer_high
ldi temp,0xaa
st Z+,temp
st Z+,temp
st Z+,temp
ldi temp,0x96
st Z+,temp
ldi temp,0x69
st Z+,temp
ldi temp,0x00
st Z+,temp
ldi temp,0x04
st Z+,temp
ldi temp,0x61
st Z+,temp
ldi temp,0xff
st Z+,temp
ldi temp,0xfa
st Z+,temp
ldi temp,0x60
st Z+,temp
ldi ZL,usb_buffer_low
ldi ZH,usb_buffer_high
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -