⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.asm

📁 一个键盘模拟器的源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        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 + -