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

📄 keyboard.lis

📁 104键PS2接口标准键盘程序(C语言),通过测试可以!程序简单易懂。基于ICCAVR编译器
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 00C6                   .dbline 79
 00C6           ;     
 00C6           ;     buffcnt--;                                    // Decrement buffer count
 00C6 80910100          lds R24,_buffcnt
 00CA 8150              subi R24,1
 00CC 80930100          sts _buffcnt,R24
 00D0                   .dbline 81
 00D0           ; 
 00D0           ;     return byte;
 00D0                   .dbline -2
 00D0           L9:
 00D0                   .dbline 0 ; func end
 00D0 0895              ret
 00D2                   .dbsym r byte 16 I
 00D2                   .dbend
 00D2                   .dbfunc e print_hexbyte _print_hexbyte fV
 00D2           ;              l -> R20
 00D2           ;              h -> R22
 00D2           ;              i -> R20
                        .even
 00D2           _print_hexbyte::
 00D2 0E940000          xcall push_gset2
 00D6 402F              mov R20,R16
 00D8                   .dbline -1
 00D8                   .dbline 85
 00D8           ; }
 00D8           ; 
 00D8           ; void print_hexbyte(unsigned char i)   //???
 00D8           ; {
 00D8                   .dbline 88
 00D8           ;     unsigned char h, l;
 00D8           ;     
 00D8           ;     h = i & 0xF0;               // High nibble
 00D8 642F              mov R22,R20
 00DA 607F              andi R22,240
 00DC                   .dbline 89
 00DC           ;     h = h>>4;
 00DC 862F              mov R24,R22
 00DE 8295              swap R24
 00E0 8F70              andi R24,#0x0F
 00E2 682F              mov R22,R24
 00E4                   .dbline 90
 00E4           ;     h = h + '0';
 00E4 605D              subi R22,208    ; addi 48
 00E6                   .dbline 92
 00E6           ;     
 00E6           ;     if (h > '9')
 00E6 89E3              ldi R24,57
 00E8 8617              cp R24,R22
 00EA 08F4              brsh L17
 00EC                   .dbline 93
 00EC           ;         h = h + 7;
 00EC 695F              subi R22,249    ; addi 7
 00EE           L17:
 00EE                   .dbline 95
 00EE           ; 
 00EE           ;     l = (i & 0x0F)+'0';         // Low nibble
 00EE 842F              mov R24,R20
 00F0 8F70              andi R24,15
 00F2 805D              subi R24,208    ; addi 48
 00F4 482F              mov R20,R24
 00F6                   .dbline 96
 00F6           ;     if (l > '9')
 00F6 89E3              ldi R24,57
 00F8 8417              cp R24,R20
 00FA 08F4              brsh L19
 00FC                   .dbline 97
 00FC           ;         l = l + 7;
 00FC 495F              subi R20,249    ; addi 7
 00FE           L19:
 00FE                   .dbline 99
 00FE           ; 
 00FE           ;     put_kbbuff(h);
 00FE 062F              mov R16,R22
 0100 9CDF              xcall _put_kbbuff
 0102                   .dbline 100
 0102           ;     put_kbbuff(l);
 0102 042F              mov R16,R20
 0104 9ADF              xcall _put_kbbuff
 0106                   .dbline -2
 0106           L16:
 0106 0E940000          xcall pop_gset2
 010A                   .dbline 0 ; func end
 010A 0895              ret
 010C                   .dbsym r l 20 c
 010C                   .dbsym r h 22 c
 010C                   .dbsym r i 20 c
 010C                   .dbend
                        .area data(ram, con, rel)
 0000                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
 0000           L22:
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
 0001           L23:
 0001                   .blkb 1
                        .area idata
 0001 00                .byte 0
                        .area data(ram, con, rel)
 0002                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
 0002           L24:
 0002                   .blkb 1
                        .area idata
 0002 00                .byte 0
                        .area data(ram, con, rel)
 0003                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
                        .area text(rom, con, rel)
 010C                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
 010C                   .dbfunc e decode _decode fV
 010C                   .dbsym s mode L24 c
 010C                   .dbsym s shift L23 c
 010C                   .dbsym s is_up L22 c
 010C           ;              i -> R22
 010C           ;             sc -> R20
                        .even
 010C           _decode::
 010C 0E940000          xcall push_gset2
 0110 402F              mov R20,R16
 0112                   .dbline -1
 0112                   .dbline 104
 0112           ; }
 0112           ;  
 0112           ; void decode(unsigned char sc)
 0112           ; {
 0112                   .dbline 108
 0112           ;     static unsigned char is_up=0, shift = 0, mode = 0;
 0112           ;     unsigned char i;
 0112           ;  
 0112           ;     if (!is_up)                // Last data received was the up-key identifier
 0112 20900000          lds R2,L22
 0116 2220              tst R2
 0118 09F0              breq X2
 011A 94C0              xjmp L25
 011C           X2:
 011C                   .dbline 109
 011C           ;     {
 011C                   .dbline 110
 011C           ;         switch (sc)
 011C 642F              mov R22,R20
 011E 7727              clr R23
 0120 6231              cpi R22,18
 0122 E0E0              ldi R30,0
 0124 7E07              cpc R23,R30
 0126 D9F0              breq L31
 0128 82E1              ldi R24,18
 012A 90E0              ldi R25,0
 012C 8617              cp R24,R22
 012E 9707              cpc R25,R23
 0130 2CF0              brlt L60
 0132           L59:
 0132 6530              cpi R22,5
 0134 E0E0              ldi R30,0
 0136 7E07              cpc R23,R30
 0138 D1F0              breq L33
 013A 29C0              xjmp L27
 013C           L60:
 013C 6935              cpi R22,89
 013E E0E0              ldi R30,0
 0140 7E07              cpc R23,R30
 0142 89F0              breq L32
 0144 6935              cpi R22,89
 0146 E0E0              ldi R30,0
 0148 7E07              cpc R23,R30
 014A 0CF1              brlt L27
 014C           L61:
 014C 603F              cpi R22,240
 014E E0E0              ldi R30,0
 0150 7E07              cpc R23,R30
 0152 09F0              breq L30
 0154 1CC0              xjmp L27
 0156           X0:
 0156                   .dbline 111
 0156           ;         {
 0156           L30:
 0156                   .dbline 113
 0156           ;           case 0xF0 :        // The up-key identifier
 0156           ;             is_up = 1;
 0156 81E0              ldi R24,1
 0158 80930000          sts L22,R24
 015C                   .dbline 114
 015C           ;             break;
 015C A4C0              xjmp L26
 015E           L31:
 015E                   .dbline 117
 015E           ; 
 015E           ;           case 0x12 :        // Left SHIFT
 015E           ;             shift = 1;
 015E 81E0              ldi R24,1
 0160 80930100          sts L23,R24
 0164                   .dbline 118
 0164           ;             break;
 0164 A0C0              xjmp L26
 0166           L32:
 0166                   .dbline 121
 0166           ; 
 0166           ;           case 0x59 :        // Right SHIFT
 0166           ;             shift = 1;
 0166 81E0              ldi R24,1
 0168 80930100          sts L23,R24
 016C                   .dbline 122
 016C           ;             break;
 016C 9CC0              xjmp L26
 016E           L33:
 016E                   .dbline 125
 016E           ; 
 016E           ;           case 0x05 :        // F1
 016E           ;             if(mode == 0)   mode = 1;    // Enter scan code mode
 016E 20900200          lds R2,L24
 0172 2220              tst R2
 0174 19F4              brne L34
 0176                   .dbline 125
 0176 81E0              ldi R24,1
 0178 80930200          sts L24,R24
 017C           L34:
 017C                   .dbline 126
 017C           ;             if(mode == 2)   mode = 3;    // Leave scan code mode
 017C 80910200          lds R24,L24
 0180 8230              cpi R24,2
 0182 09F0              breq X3
 0184 90C0              xjmp L26
 0186           X3:
 0186                   .dbline 126
 0186 83E0              ldi R24,3
 0188 80930200          sts L24,R24
 018C                   .dbline 127
 018C           ;             break;
 018C 8CC0              xjmp L26
 018E           L27:
 018E                   .dbline 130
 018E           ; 
 018E           ;           default:
 018E           ;             if(mode == 0 || mode == 3)        // If ASCII mode
 018E 20900200          lds R2,L24
 0192 2220              tst R2
 0194 21F0              breq L40
 0196 822D              mov R24,R2
 0198 8330              cpi R24,3
 019A 09F0              breq X4
 019C 4EC0              xjmp L38
 019E           X4:
 019E           L40:
 019E                   .dbline 131
 019E           ;             {
 019E                   .dbline 132
 019E           ;                 if(!shift)                    // If shift is not pressed,
 019E 20900100          lds R2,L23
 01A2 2220              tst R2
 01A4 29F5              brne L41
 01A6                   .dbline 133
 01A6           ;                 {                            // do a table look-up
 01A6                   .dbline 134
 01A6 6627              clr R22
 01A8 01C0              xjmp L46
 01AA           L43:
 01AA                   .dbline 134
 01AA           L44:
 01AA                   .dbline 134
 01AA 6395              inc R22
 01AC           L46:
 01AC                   .dbline 134
 01AC           ;                     for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);//???
 01AC 82E0              ldi R24,2
 01AE 869F              mul R24,R22
 01B0 F001              movw R30,R0
 01B2 80E0              ldi R24,<_unshifted
 01B4 90E0              ldi R25,>_unshifted
 01B6 E80F              add R30,R24
 01B8 F91F              adc R31,R25
 01BA 2490              lpm R2,Z
 01BC 3324              clr R3
 01BE 2416              cp R2,R20
 01C0 11F0              breq L47
 01C2 2220              tst R2
 01C4 91F7              brne L43
 01C6           L47:
 01C6                   .dbline 135
 01C6           ;                     if (unshifted[i][0] == sc) {
 01C6 82E0              ldi R24,2
 01C8 869F              mul R24,R22
 01CA F001              movw R30,R0
 01CC 80E0              ldi R24,<_unshifted
 01CE 90E0              ldi R25,>_unshifted
 01D0 E80F              add R30,R24
 01D2 F91F              adc R31,R25
 01D4 E491              lpm R30,Z
 01D6 E417              cp R30,R20
 01D8 09F0              breq X5
 01DA 65C0              xjmp L26
 01DC           X5:
 01DC                   .dbline 135
 01DC                   .dbline 136
 01DC           ;                         put_kbbuff(unshifted[i][1]);
 01DC 82E0              ldi R24,2
 01DE 869F              mul R24,R22
 01E0 F001              movw R30,R0
 01E2 80E0              ldi R24,<_unshifted+1
 01E4 90E0              ldi R25,>_unshifted+1
 01E6 E80F              add R30,R24
 01E8 F91F              adc R31,R25
 01EA 0491              lpm R16,Z
 01EC 26DF              xcall _put_kbbuff
 01EE                   .dbline 137
 01EE           ;                     }
 01EE                   .dbline 138
 01EE 5BC0              xjmp L26
 01F0           L41:
 01F0                   .dbline 138
 01F0           ;                 } else {                    // If shift is pressed
 01F0                   .dbline 139
 01F0 6627              clr R22
 01F2 01C0              xjmp L54
 01F4           L51:
 01F4                   .dbline 139
 01F4           L52:
 01F4                   .dbline 139
 01F4 6395              inc R22
 01F6           L54:
 01F6                   .dbline 139
 01F6           ;                     for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
 01F6 82E0              ldi R24,2
 01F8 869F              mul R24,R22
 01FA F001              movw R30,R0
 01FC 80E0              ldi R24,<_shifted
 01FE 90E0              ldi R25,>_shifted
 0200 E80F              add R30,R24
 0202 F91F              adc R31,R25
 0204 2490              lpm R2,Z
 0206 3324              clr R3
 0208 2416              cp R2,R20
 020A 11F0              breq L55
 020C 2220              tst R2
 020E 91F7              brne L51
 0210           L55:
 0210                   .dbline 140
 0210           ;                     if (shifted[i][0] == sc) {
 0210 82E0              ldi R24,2
 0212 869F              mul R24,R22
 0214 F001              movw R30,R0
 0216 80E0              ldi R24,<_shifted
 0218 90E0              ldi R25,>_shifted
 021A E80F              add R30,R24
 021C F91F              adc R31,R25
 021E E491              lpm R30,Z
 0220 E417              cp R30,R20
 0222 09F0              breq X6
 0224 40C0              xjmp L26
 0226           X6:
 0226                   .dbline 140
 0226                   .dbline 141
 0226           ;                         put_kbbuff(shifted[i][1]);
 0226 82E0              ldi R24,2
 0228 869F              mul R24,R22
 022A F001              movw R30,R0
 022C 80E0              ldi R24,<_shifted+1
 022E 90E0              ldi R25,>_shifted+1
 0230 E80F              add R30,R24
 0232 F91F              adc R31,R25
 0234 0491              lpm R16,Z

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -