📄 ps2_kb.lis
字号:
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 + -