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

📄 keyboard.lis

📁 104键PS2接口标准键盘程序(C语言),通过测试可以!程序简单易懂。基于ICCAVR编译器
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 0236 01DF              xcall _put_kbbuff
 0238                   .dbline 142
 0238           ;                     }
 0238                   .dbline 143
 0238           ;                 }
 0238                   .dbline 144
 0238 36C0              xjmp L26
 023A           L38:
 023A                   .dbline 144
 023A           ;             } else{                            // Scan code mode
 023A                   .dbline 145
 023A           ;                 print_hexbyte(sc);            // Print scan code
 023A 042F              mov R16,R20
 023C 4ADF              xcall _print_hexbyte
 023E                   .dbline 146
 023E           ;                 put_kbbuff(' ');
 023E 00E2              ldi R16,32
 0240 FCDE              xcall _put_kbbuff
 0242                   .dbline 148
 0242           ; 
 0242           ;             }
 0242                   .dbline 149
 0242           ;             break;
 0242                   .dbline 151
 0242 31C0              xjmp L26
 0244           L25:
 0244                   .dbline 151
 0244           ;         }
 0244           ;     } else {
 0244                   .dbline 152
 0244           ;         is_up = 0;                            // Two 0xF0 in a row not allowed
 0244 2224              clr R2
 0246 20920000          sts L22,R2
 024A                   .dbline 153
 024A           ;         switch (sc)
 024A 5527              clr R21
 024C 4231              cpi R20,18
 024E E0E0              ldi R30,0
 0250 5E07              cpc R21,R30
 0252 99F0              breq L65
 0254 82E1              ldi R24,18
 0256 90E0              ldi R25,0
 0258 8417              cp R24,R20
 025A 9507              cpc R25,R21
 025C 4CF0              brlt L74
 025E           L73:
 025E 4530              cpi R20,5
 0260 E0E0              ldi R30,0
 0262 5E07              cpc R21,R30
 0264 91F0              breq L67
 0266 4630              cpi R20,6
 0268 E0E0              ldi R30,0
 026A 5E07              cpc R21,R30
 026C E1F0              breq L63
 026E 1BC0              xjmp L62
 0270           L74:
 0270 4935              cpi R20,89
 0272 E0E0              ldi R30,0
 0274 5E07              cpc R21,R30
 0276 29F0              breq L66
 0278 16C0              xjmp L62
 027A           X1:
 027A                   .dbline 154
 027A           ;         {
 027A           L65:
 027A                   .dbline 156
 027A           ;           case 0x12 :                        // Left SHIFT
 027A           ;             shift = 0;
 027A 2224              clr R2
 027C 20920100          sts L23,R2
 0280                   .dbline 157
 0280           ;             break;
 0280 12C0              xjmp L63
 0282           L66:
 0282                   .dbline 160
 0282           ;             
 0282           ;           case 0x59 :                        // Right SHIFT
 0282           ;             shift = 0;
 0282 2224              clr R2
 0284 20920100          sts L23,R2
 0288                   .dbline 161
 0288           ;             break;
 0288 0EC0              xjmp L63
 028A           L67:
 028A                   .dbline 164
 028A           ; 
 028A           ;           case 0x05 :                        // F1
 028A           ;             if(mode == 1)
 028A 80910200          lds R24,L24
 028E 8130              cpi R24,1
 0290 19F4              brne L68
 0292                   .dbline 165
 0292           ;                 mode = 2;
 0292 82E0              ldi R24,2
 0294 80930200          sts L24,R24
 0298           L68:
 0298                   .dbline 166
 0298           ;             if(mode == 3)
 0298 80910200          lds R24,L24
 029C 8330              cpi R24,3
 029E 19F4              brne L63
 02A0                   .dbline 167
 02A0           ;                 mode = 0;
 02A0 2224              clr R2
 02A2 20920200          sts L24,R2
 02A6                   .dbline 168
 02A6           ;             break;
 02A6                   .dbline 171
 02A6           ;           case 0x06 :                        // F2
 02A6           ;            // clr();
 02A6           ;             break;  
 02A6           L62:
 02A6           L63:
 02A6                   .dbline 174
 02A6           L26:
 02A6                   .dbline -2
 02A6           L21:
 02A6 0E940000          xcall pop_gset2
 02AA                   .dbline 0 ; func end
 02AA 0895              ret
 02AC                   .dbsym r i 22 c
 02AC                   .dbsym r sc 20 c
 02AC                   .dbend
                        .area vector(rom, abs)
                        .org 4
 0004 0C945601          jmp _int0_isr
                        .area text(rom, con, rel)
 02AC                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
                        .area bss(ram, con, rel)
 0000                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
 0000           L76:
 0000                   .blkb 1
                        .area text(rom, con, rel)
 02AC                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
 02AC                   .dbfunc e int0_isr _int0_isr fV
 02AC                   .dbsym s data L76 c
                        .even
 02AC           _int0_isr::
 02AC 0E940000          xcall push_lset
 02B0                   .dbline -1
 02B0                   .dbline 180
 02B0           ;             
 02B0           ;         } 
 02B0           ;     }    
 02B0           ; } 
 02B0           ; 
 02B0           ; 
 02B0           ; #pragma interrupt_handler int0_isr:iv_INT0
 02B0           ; void int0_isr(void)
 02B0           ; {
 02B0                   .dbline 184
 02B0           ;  //external interupt on INT0
 02B0           ;  static unsigned char data;                // Holds the received scan code
 02B0           ; 
 02B0           ;         if(bitcount < 11 && bitcount > 2)    // Bit 3 to 10 is data. Parity bit,
 02B0 80914600          lds R24,_bitcount
 02B4 8B30              cpi R24,11
 02B6 80F4              brsh L77
 02B8 82E0              ldi R24,2
 02BA 20904600          lds R2,_bitcount
 02BE 8215              cp R24,R2
 02C0 58F4              brsh L77
 02C2                   .dbline 185
 02C2           ;         {                                    // start and stop bits are ignored.
 02C2                   .dbline 186
 02C2           ;             data = (data >> 1);
 02C2 20900000          lds R2,L76
 02C6 2694              lsr R2
 02C8 20920000          sts L76,R2
 02CC                   .dbline 187
 02CC           ;             if(PIND & 8)            //first receive lsb
 02CC 839B              sbis 0x10,3
 02CE 04C0              rjmp L79
 02D0                   .dbline 188
 02D0           ;                 data = data | 0x80;            // Store a '1'
 02D0 822D              mov R24,R2
 02D2 8068              ori R24,128
 02D4 80930000          sts L76,R24
 02D8           L79:
 02D8                   .dbline 189
 02D8           ;         }
 02D8           L77:
 02D8                   .dbline 191
 02D8 80914600          lds R24,_bitcount
 02DC 8150              subi R24,1
 02DE 282E              mov R2,R24
 02E0 20924600          sts _bitcount,R2
 02E4 8823              tst R24
 02E6 31F4              brne L81
 02E8                   .dbline 192
 02E8                   .dbline 193
 02E8 00910000          lds R16,L76
 02EC 0FDF              xcall _decode
 02EE                   .dbline 194
 02EE 8BE0              ldi R24,11
 02F0 80934600          sts _bitcount,R24
 02F4                   .dbline 195
 02F4           L81:
 02F4                   .dbline -2
 02F4           L75:
 02F4 0E940000          xcall pop_lset
 02F8                   .dbline 0 ; func end
 02F8 1895              reti
 02FA                   .dbend
 02FA                   .dbfunc e delay_ms _delay_ms fV
 02FA           ;              i -> R20,R21
 02FA           ;             ms -> R16
                        .even
 02FA           _delay_ms::
 02FA 0E940000          xcall push_gset1
 02FE                   .dbline -1
 02FE                   .dbline 201
 02FE           ; 
 02FE           ;         if(--bitcount == 0)                    // All bits received
 02FE           ;         {
 02FE           ;             decode(data);
 02FE           ;             bitcount = 11;
 02FE           ;         }
 02FE           ; }
 02FE           ; 
 02FE           ; 
 02FE           ; 
 02FE           ; void delay_ms(unsigned char ms)
 02FE           ; {
 02FE 09C0              xjmp L85
 0300           L84:
 0300                   .dbline 204
 0300 43E3              ldi R20,11059
 0302 5BE2              ldi R21,43
 0304 02C0              xjmp L90
 0306           L87:
 0306                   .dbline 204
 0306           L88:
 0306                   .dbline 204
 0306 4150              subi R20,1
 0308 5040              sbci R21,0
 030A           L90:
 030A                   .dbline 204
 030A 4427              clr R20
 030C 5527              clr R21
 030E 2224              clr R2
 0310 D1F7              brne L87
 0312           L85:
 0312                   .dbline 203
 0312           ;       unsigned int i;
 0312           ;         while(ms--)
 0312 202E              mov R2,R16
 0314 3324              clr R3
 0316 0150              subi R16,1
 0318 2220              tst R2
 031A 91F7              brne L84
 031C                   .dbline -2
 031C           L83:
 031C 0E940000          xcall pop_gset1
 0320                   .dbline 0 ; func end
 0320 0895              ret
 0322                   .dbsym r i 20 i
 0322                   .dbsym r ms 16 c
 0322                   .dbend
 0322                   .dbfunc e init_devices _init_devices fV
                        .even
 0322           _init_devices::
 0322                   .dbline -1
 0322                   .dbline 209
 0322           ;         for(i=11059;i=0;i--);
 0322           ; }
 0322           ; 
 0322           ; //call this routine to initialize all peripherals
 0322           ; void init_devices(void)
 0322           ; {
 0322                   .dbline 211
 0322           ;  //stop errant interrupts until set up
 0322           ;  CLI(); //disable all interrupts
 0322 F894              cli
 0324                   .dbline 212
 0324           ;  port_init();
 0324 6DDE              xcall _port_init
 0326                   .dbline 213
 0326           ; InitKeyBoard();
 0326 76DE              xcall _InitKeyBoard
 0328                   .dbline 215
 0328           ; 
 0328           ;  MCUCR = 0x02;
 0328 82E0              ldi R24,2
 032A 85BF              out 0x35,R24
 032C                   .dbline 216
 032C           ;  GICR  = 0x40;
 032C 80E4              ldi R24,64
 032E 8BBF              out 0x3b,R24
 0330                   .dbline 217
 0330           ;  TIMSK = 0x00; //timer interrupt sources
 0330 2224              clr R2
 0332 29BE              out 0x39,R2
 0334                   .dbline 218
 0334           ;  SEI(); //re-enable interrupts
 0334 7894              sei
 0336                   .dbline -2
 0336           L91:
 0336                   .dbline 0 ; func end
 0336 0895              ret
 0338                   .dbend
 0338                   .dbfunc e main _main fV
 0338           ;            key -> R20
                        .even
 0338           _main::
 0338                   .dbline -1
 0338                   .dbline 228
 0338           ;  //all peripherals are now initialized
 0338           ; }
 0338           ; 
 0338           ; //#include <delay.h>   
 0338           ; 
 0338           ; //#include <lcd.h>
 0338           ; 
 0338           ; 
 0338           ; void main(void)
 0338           ; {
 0338 04C0              xjmp L94
 033A           L93:
 033A                   .dbline 234
 033A                   .dbline 235
 033A A6DE              xcall _getchar_kb
 033C 402F              mov R20,R16
 033E                   .dbline 237
 033E 05E0              ldi R16,5
 0340 DCDF              xcall _delay_ms
 0342                   .dbline 239
 0342           L94:
 0342                   .dbline 233
 0342 FBCF              xjmp L93
 0344           X7:
 0344                   .dbline -2
 0344           L92:
 0344                   .dbline 0 ; func end
 0344 0895              ret
 0346                   .dbsym r key 20 c
 0346                   .dbend
                        .area bss(ram, con, rel)
 0001                   .dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
 0001           _buffcnt::
 0001                   .blkb 1
 0002                   .dbsym e buffcnt _buffcnt c
 0002           _outpt::
 0002                   .blkb 2
 0004                   .dbsym e outpt _outpt pc
 0004           _inpt::
 0004                   .blkb 2
 0006                   .dbsym e inpt _inpt pc
 0006           _kb_buffer::
 0006                   .blkb 64
 0046                   .dbsym e kb_buffer _kb_buffer A[64:64]c
 0046           _bitcount::
 0046                   .blkb 1
 0047                   .dbsym e bitcount _bitcount c
 0047           _edge::
 0047                   .blkb 1
 0048                   .dbsym e edge _edge c

⌨️ 快捷键说明

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