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

📄 ps2_kb.lis

📁 驱动开发板上的PS2接口
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 025E                   .dbline -1
 025E                   .dbline 229
 025E           ; /*******************************************
 025E           ; 函数名称: Decode
 025E           ; 功    能: 
 025E           ; 参    数: scancode--需要翻译的扫描码
 025E           ; 返回值  : 无
 025E           ; /********************************************/
 025E           ; void Decode(uchar scancode)
 025E           ; {
 025E                   .dbline 232
 025E           ;  static uchar up=0,shift=0;   //up为通、断码标志,shift为shift键按下标志
 025E           ;  uchar i;
 025E           ;  if (!up)                //已接收的11位数据是通码(up为0)
 025E 20900100          lds R2,L60
 0262 2220              tst R2
 0264 09F0              breq X3
 0266 70C0              xjmp L62
 0268           X3:
 0268                   .dbline 233
 0268           ;  {
 0268                   .dbline 234
 0268           ;   switch (scancode)//开始翻译扫描码
 0268 402F              mov R20,R16
 026A 5527              clr R21
 026C 4935              cpi R20,89
 026E E0E0              ldi R30,0
 0270 5E07              cpc R21,R30
 0272 B9F0              breq L69
 0274 89E5              ldi R24,89
 0276 90E0              ldi R25,0
 0278 8417              cp R24,R20
 027A 9507              cpc R25,R21
 027C 2CF0              brlt L89
 027E           L88:
 027E 4231              cpi R20,18
 0280 E0E0              ldi R30,0
 0282 5E07              cpc R21,R30
 0284 51F0              breq L68
 0286 11C0              xjmp L64
 0288           L89:
 0288 403F              cpi R20,240
 028A E0E0              ldi R30,0
 028C 5E07              cpc R21,R30
 028E 09F0              breq L67
 0290 0CC0              xjmp L64
 0292           X1:
 0292                   .dbline 235
 0292           ;   {
 0292           L67:
 0292                   .dbline 237
 0292           ;    case 0xF0:    //键盘释放标志(随后的一个字节是断码)
 0292           ;               up=1;      //设置up为断码标志
 0292 81E0              ldi R24,1
 0294 80930100          sts L60,R24
 0298                   .dbline 238
 0298           ;               break;
 0298 70C0              xjmp L63
 029A           L68:
 029A                   .dbline 240
 029A           ;    case 0x12:    //左shift键按下
 029A           ;               shift=1;   //设置shift为按下标志
 029A 81E0              ldi R24,1
 029C 80930200          sts L61,R24
 02A0                   .dbline 241
 02A0           ;               break;
 02A0 6CC0              xjmp L63
 02A2           L69:
 02A2                   .dbline 243
 02A2           ;    case 0x59:    //右shift键按下
 02A2           ;               shift=1;   //设置shift为按下标志
 02A2 81E0              ldi R24,1
 02A4 80930200          sts L61,R24
 02A8                   .dbline 244
 02A8           ;               break;   
 02A8 68C0              xjmp L63
 02AA           L64:
 02AA                   .dbline 246
 02AA           ;    default:        
 02AA           ;               if(!shift)                        //如果shift键没有按下
 02AA 20900200          lds R2,L61
 02AE 2220              tst R2
 02B0 31F5              brne L70
 02B2                   .dbline 247
 02B2           ;               {                                         //查找unshifted表,表中左列是扫描码,右列是对应的ASCII码
 02B2                   .dbline 248
 02B2 4427              clr R20
 02B4 01C0              xjmp L75
 02B6           L72:
 02B6                   .dbline 248
 02B6           L73:
 02B6                   .dbline 248
 02B6 4395              inc R20
 02B8           L75:
 02B8                   .dbline 248
 02B8           ;                  for(i=0;unshifted[i][0]!=scancode&&unshifted[i][0];i++);
 02B8 82E0              ldi R24,2
 02BA 849F              mul R24,R20
 02BC F001              movw R30,R0
 02BE 80E0              ldi R24,<_unshifted
 02C0 90E0              ldi R25,>_unshifted
 02C2 E80F              add R30,R24
 02C4 F91F              adc R31,R25
 02C6 2490              lpm R2,Z
 02C8 3324              clr R3
 02CA 2016              cp R2,R16
 02CC 11F0              breq L76
 02CE 2220              tst R2
 02D0 91F7              brne L72
 02D2           L76:
 02D2                   .dbline 249
 02D2           ;                  if(unshifted[i][0]==scancode) 
 02D2 82E0              ldi R24,2
 02D4 849F              mul R24,R20
 02D6 F001              movw R30,R0
 02D8 80E0              ldi R24,<_unshifted
 02DA 90E0              ldi R25,>_unshifted
 02DC E80F              add R30,R24
 02DE F91F              adc R31,R25
 02E0 E491              lpm R30,Z
 02E2 E017              cp R30,R16
 02E4 09F0              breq X4
 02E6 49C0              xjmp L63
 02E8           X4:
 02E8                   .dbline 250
 02E8           ;                  {
 02E8                   .dbline 251
 02E8           ;                       ascii=unshifted[i][1];
 02E8 82E0              ldi R24,2
 02EA 849F              mul R24,R20
 02EC F001              movw R30,R0
 02EE 80E0              ldi R24,<_unshifted+1
 02F0 90E0              ldi R25,>_unshifted+1
 02F2 E80F              add R30,R24
 02F4 F91F              adc R31,R25
 02F6 E491              lpm R30,Z
 02F8 E0930000          sts _ascii,R30
 02FC                   .dbline 252
 02FC           ;                  }
 02FC                   .dbline 253
 02FC           ;               } 
 02FC 3EC0              xjmp L63
 02FE           L70:
 02FE                   .dbline 255
 02FE           ;               else                              //如果shift键按下
 02FE           ;               {                                         //查找shifted表
 02FE                   .dbline 256
 02FE 4427              clr R20
 0300 01C0              xjmp L83
 0302           L80:
 0302                   .dbline 256
 0302           L81:
 0302                   .dbline 256
 0302 4395              inc R20
 0304           L83:
 0304                   .dbline 256
 0304           ;                  for(i=0;shifted[i][0]!=scancode&&shifted[i][0];i++);
 0304 82E0              ldi R24,2
 0306 849F              mul R24,R20
 0308 F001              movw R30,R0
 030A 80E0              ldi R24,<_shifted
 030C 90E0              ldi R25,>_shifted
 030E E80F              add R30,R24
 0310 F91F              adc R31,R25
 0312 2490              lpm R2,Z
 0314 3324              clr R3
 0316 2016              cp R2,R16
 0318 11F0              breq L84
 031A 2220              tst R2
 031C 91F7              brne L80
 031E           L84:
 031E                   .dbline 257
 031E           ;                  if(shifted[i][0]==scancode) 
 031E 82E0              ldi R24,2
 0320 849F              mul R24,R20
 0322 F001              movw R30,R0
 0324 80E0              ldi R24,<_shifted
 0326 90E0              ldi R25,>_shifted
 0328 E80F              add R30,R24
 032A F91F              adc R31,R25
 032C E491              lpm R30,Z
 032E E017              cp R30,R16
 0330 21F5              brne L63
 0332                   .dbline 258
 0332           ;                  {
 0332                   .dbline 259
 0332           ;                       ascii=shifted[i][1];
 0332 82E0              ldi R24,2
 0334 849F              mul R24,R20
 0336 F001              movw R30,R0
 0338 80E0              ldi R24,<_shifted+1
 033A 90E0              ldi R25,>_shifted+1
 033C E80F              add R30,R24
 033E F91F              adc R31,R25
 0340 E491              lpm R30,Z
 0342 E0930000          sts _ascii,R30
 0346                   .dbline 260
 0346           ;                  }
 0346                   .dbline 261
 0346           ;               }   
 0346                   .dbline 262
 0346           ;               break;
 0346                   .dbline 264
 0346           ;   }
 0346           ;  } 
 0346 19C0              xjmp L63
 0348           L62:
 0348                   .dbline 266
 0348           ;  else                                         //已接收的11位数据是断码(up为1)
 0348           ;  {
 0348                   .dbline 267
 0348           ;   up = 0;                     //将断码标志复位
 0348 2224              clr R2
 034A 20920100          sts L60,R2
 034E                   .dbline 268
 034E           ;   switch (scancode)           //检测shift键释放
 034E 402F              mov R20,R16
 0350 5527              clr R21
 0352 4231              cpi R20,18
 0354 E0E0              ldi R30,0
 0356 5E07              cpc R21,R30
 0358 49F0              breq L93
 035A 4231              cpi R20,18
 035C E0E0              ldi R30,0
 035E 5E07              cpc R21,R30
 0360 64F0              brlt L91
 0362           L95:
 0362 4935              cpi R20,89
 0364 E0E0              ldi R30,0
 0366 5E07              cpc R21,R30
 0368 29F0              breq L94
 036A 07C0              xjmp L91
 036C           X2:
 036C                   .dbline 269
 036C           ;   {
 036C           L93:
 036C                   .dbline 271
 036C           ;    case 0x12 :                        //左shift键
 036C           ;               shift = 0;
 036C 2224              clr R2
 036E 20920200          sts L61,R2
 0372                   .dbline 272
 0372           ;               break;
 0372 03C0              xjmp L91
 0374           L94:
 0374                   .dbline 274
 0374           ;    case 0x59 :                        //右shift键
 0374           ;               shift = 0;
 0374 2224              clr R2
 0376 20920200          sts L61,R2
 037A                   .dbline 275
 037A           ;               break;
 037A                   .dbline 277
 037A           ;    default:
 037A           ;               break;
 037A           L91:
 037A                   .dbline 279
 037A           L63:
 037A                   .dbline -2
 037A                   .dbline 280
 037A           ;   }
 037A           ;  }
 037A           ; }
 037A           L59:
 037A 0E940000          xcall pop_gset1
 037E                   .dbline 0 ; func end
 037E 0895              ret
 0380                   .dbsym r i 20 c
 0380                   .dbsym r scancode 16 c
 0380                   .dbend
 0380                   .dbfunc e main _main fV
                        .even
 0380           _main::
 0380                   .dbline -1
 0380                   .dbline 288
 0380           ; /*******************************************
 0380           ; 函数名称: main
 0380           ; 功    能: 实现PS2键盘的驱动,在1602液晶上显示键盘上的ASCII码
 0380           ; 参    数: 无
 0380           ; 返回值  : 无
 0380           ; /********************************************/
 0380           ; void main(void)
 0380           ; {
 0380                   .dbline 289
 0380           ;  Board_init( );                               //初始化开发板
 0380 6DDE              xcall _Board_init
 0382                   .dbline 290
 0382           ;  LCD1602_initial( );          //初始化1602
 0382 FEDE              xcall _LCD1602_initial
 0384                   .dbline 291
 0384           ;  Init_kb();                                   //初始化PS2键盘接口
 0384 14DF              xcall _Init_kb
 0386 03C0              xjmp L98
 0388           L97:
 0388                   .dbline 293
 0388                   .dbline 294
 0388 00910000          lds R16,_ascii
 038C 21DF              xcall _Disp_ascii
 038E                   .dbline 295
 038E           L98:
 038E                   .dbline 292
 038E FCCF              xjmp L97
 0390           X5:
 0390                   .dbline -2
 0390                   .dbline 296
 0390           ;  while(1)
 0390           ;  {
 0390           ;   Disp_ascii(ascii);    //显示翻译后的ASCII码
 0390           ;  }
 0390           ; }
 0390           L96:
 0390                   .dbline 0 ; func end
 0390 0895              ret
 0392                   .dbend
                        .area bss(ram, con, rel)
 0001                   .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
 0001           _bitcount::
 0001                   .blkb 1
 0002                   .dbsym e bitcount _bitcount c
 0002           _edge::
 0002                   .blkb 1
 0003                   .dbsym e edge _edge c
                        .area data(ram, con, rel)
 0003                   .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
 0003           L48:
 0003                   .blkb 11
                        .area idata
 0003 4B45595F41534349493A00    .byte 'K,'E,'Y,95,'A,'S,'C,'I,'I,58,0
                        .area data(ram, con, rel)
 000E                   .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C

⌨️ 快捷键说明

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