📄 ps2_kb.lst
字号:
01E5 9BC8 SBIS P19,0
01E6 C004 RJMP 0x01EB
(0204) {
(0205) data|=0x80; //存储一个'1'
01E7 2D82 MOV R24,R2
01E8 6880 ORI R24,0x80
01E9 9380006E STS R24,0x6E
(0206) }
(0207) }
(0208) MCUCR=3; //设置INT0为上升沿触发中断
01EB E083 LDI R24,3
01EC BF85 OUT P35,R24
(0209) edge=1; //设置上升沿中断标志
01ED E081 LDI R24,1
01EE 93800070 STS R24,_edge
(0210) }
01F0 C013 RJMP 0x0204
(0211) else //如果是上升沿触发中断
(0212) {
(0213) MCUCR=2; //设置INT0为下降沿触发中断
01F1 E082 LDI R24,2
01F2 BF85 OUT P35,R24
(0214) edge=0; //设置下降沿中断标志
01F3 2422 CLR R2
01F4 92200070 STS R2,_edge
(0215) if(--bitcount==0) //如果11位全部接收完毕
01F6 9180006F LDS R24,_bitcount
01F8 5081 SUBI R24,1
01F9 2E28 MOV R2,R24
01FA 9220006F STS R2,_bitcount
01FC 2388 TST R24
01FD F431 BNE 0x0204
(0216) {
(0217) Decode(data); //将扫描码翻译成ASCII码
01FE 9100006E LDS R16,0x6E
0200 D006 RCALL _Decode
(0218) bitcount = 11; //重新设为11位数据
0201 E08B LDI R24,0xB
0202 9380006F STS R24,_bitcount
(0219) }
(0220) }
(0221) }
0204 940E02CA CALL pop_lset
0206 9518 RETI
_Decode:
i --> R20
scancode --> R16
0207 940E02E1 CALL push_gset1
(0222) /*******************************************
(0223) 函数名称: Decode
(0224) 功 能:
(0225) 参 数: scancode--需要翻译的扫描码
(0226) 返回值 : 无
(0227) /********************************************/
(0228) void Decode(uchar scancode)
(0229) {
(0230) static uchar up=0,shift=0; //up为通、断码标志,shift为shift键按下标志
(0231) uchar i;
(0232) if (!up) //已接收的11位数据是通码(up为0)
0209 90200061 LDS R2,0x61
020B 2022 TST R2
020C F009 BEQ 0x020E
020D C070 RJMP 0x027E
(0233) {
(0234) switch (scancode)//开始翻译扫描码
020E 2F40 MOV R20,R16
020F 2755 CLR R21
0210 3549 CPI R20,0x59
0211 E0E0 LDI R30,0
0212 075E CPC R21,R30
0213 F0B9 BEQ 0x022B
0214 E589 LDI R24,0x59
0215 E090 LDI R25,0
0216 1784 CP R24,R20
0217 0795 CPC R25,R21
0218 F02C BLT 0x021E
0219 3142 CPI R20,0x12
021A E0E0 LDI R30,0
021B 075E CPC R21,R30
021C F051 BEQ 0x0227
021D C011 RJMP 0x022F
021E 3F40 CPI R20,0xF0
021F E0E0 LDI R30,0
0220 075E CPC R21,R30
0221 F009 BEQ 0x0223
0222 C00C RJMP 0x022F
(0235) {
(0236) case 0xF0: //键盘释放标志(随后的一个字节是断码)
(0237) up=1; //设置up为断码标志
0223 E081 LDI R24,1
0224 93800061 STS R24,0x61
(0238) break;
0226 C070 RJMP 0x0297
(0239) case 0x12: //左shift键按下
(0240) shift=1; //设置shift为按下标志
0227 E081 LDI R24,1
0228 93800062 STS R24,0x62
(0241) break;
022A C06C RJMP 0x0297
(0242) case 0x59: //右shift键按下
(0243) shift=1; //设置shift为按下标志
022B E081 LDI R24,1
022C 93800062 STS R24,0x62
(0244) break;
022E C068 RJMP 0x0297
(0245) default:
(0246) if(!shift) //如果shift键没有按下
022F 90200062 LDS R2,0x62
0231 2022 TST R2
0232 F531 BNE 0x0259
(0247) { //查找unshifted表,表中左列是扫描码,右列是对应的ASCII码
(0248) for(i=0;unshifted[i][0]!=scancode&&unshifted[i][0];i++);
0233 2744 CLR R20
0234 C001 RJMP 0x0236
0235 9543 INC R20
0236 E082 LDI R24,2
0237 9F84 MUL R24,R20
0238 01F0 MOVW R30,R0
0239 E680 LDI R24,0x60
023A E090 LDI R25,0
023B 0FE8 ADD R30,R24
023C 1FF9 ADC R31,R25
023D 9024 LD R2,R2
023E 2433 CLR R3
023F 1620 CP R2,R16
0240 F011 BEQ 0x0243
0241 2022 TST R2
0242 F791 BNE 0x0235
(0249) if(unshifted[i][0]==scancode)
0243 E082 LDI R24,2
0244 9F84 MUL R24,R20
0245 01F0 MOVW R30,R0
0246 E680 LDI R24,0x60
0247 E090 LDI R25,0
0248 0FE8 ADD R30,R24
0249 1FF9 ADC R31,R25
024A 91E4 LD R30,R30
024B 17E0 CP R30,R16
024C F009 BEQ 0x024E
024D C049 RJMP 0x0297
(0250) {
(0251) ascii=unshifted[i][1];
024E E082 LDI R24,2
024F 9F84 MUL R24,R20
0250 01F0 MOVW R30,R0
0251 E681 LDI R24,0x61
0252 E090 LDI R25,0
0253 0FE8 ADD R30,R24
0254 1FF9 ADC R31,R25
0255 91E4 LD R30,R30
0256 93E00060 STS R30,0x60
(0252) }
(0253) }
0258 C03E RJMP 0x0297
(0254) else //如果shift键按下
(0255) { //查找shifted表
(0256) for(i=0;shifted[i][0]!=scancode&&shifted[i][0];i++);
0259 2744 CLR R20
025A C001 RJMP 0x025C
025B 9543 INC R20
025C E082 LDI R24,2
025D 9F84 MUL R24,R20
025E 01F0 MOVW R30,R0
025F EE82 LDI R24,0xE2
0260 E090 LDI R25,0
0261 0FE8 ADD R30,R24
0262 1FF9 ADC R31,R25
0263 9024 LD R2,R2
0264 2433 CLR R3
0265 1620 CP R2,R16
0266 F011 BEQ 0x0269
0267 2022 TST R2
0268 F791 BNE 0x025B
(0257) if(shifted[i][0]==scancode)
0269 E082 LDI R24,2
026A 9F84 MUL R24,R20
026B 01F0 MOVW R30,R0
026C EE82 LDI R24,0xE2
026D E090 LDI R25,0
026E 0FE8 ADD R30,R24
026F 1FF9 ADC R31,R25
0270 91E4 LD R30,R30
0271 17E0 CP R30,R16
0272 F521 BNE 0x0297
(0258) {
(0259) ascii=shifted[i][1];
0273 E082 LDI R24,2
0274 9F84 MUL R24,R20
0275 01F0 MOVW R30,R0
0276 EE83 LDI R24,0xE3
0277 E090 LDI R25,0
0278 0FE8 ADD R30,R24
0279 1FF9 ADC R31,R25
027A 91E4 LD R30,R30
027B 93E00060 STS R30,0x60
(0260) }
(0261) }
(0262) break;
(0263) }
(0264) }
027D C019 RJMP 0x0297
(0265) else //已接收的11位数据是断码(up为1)
(0266) {
(0267) up = 0; //将断码标志复位
027E 2422 CLR R2
027F 92200061 STS R2,0x61
(0268) switch (scancode) //检测shift键释放
0281 2F40 MOV R20,R16
0282 2755 CLR R21
0283 3142 CPI R20,0x12
0284 E0E0 LDI R30,0
0285 075E CPC R21,R30
0286 F049 BEQ 0x0290
0287 3142 CPI R20,0x12
0288 E0E0 LDI R30,0
0289 075E CPC R21,R30
028A F064 BLT 0x0297
028B 3549 CPI R20,0x59
028C E0E0 LDI R30,0
028D 075E CPC R21,R30
028E F029 BEQ 0x0294
028F C007 RJMP 0x0297
(0269) {
(0270) case 0x12 : //左shift键
(0271) shift = 0;
0290 2422 CLR R2
0291 92200062 STS R2,0x62
(0272) break;
0293 C003 RJMP 0x0297
(0273) case 0x59 : //右shift键
(0274) shift = 0;
0294 2422 CLR R2
0295 92200062 STS R2,0x62
(0275) break;
(0276) default:
(0277) break;
(0278) }
(0279) }
(0280) }
0297 940E02E4 CALL pop_gset1
0299 9508 RET
(0281) /*******************************************
(0282) 函数名称: main
(0283) 功 能: 实现PS2键盘的驱动,在1602液晶上显示键盘上的ASCII码
(0284) 参 数: 无
(0285) 返回值 : 无
(0286) /********************************************/
(0287) void main(void)
(0288) {
(0289) Board_init( ); //初始化开发板
_main:
029A DE6D RCALL _Board_init
(0290) LCD1602_initial( ); //初始化1602
029B DEFE RCALL _LCD1602_initial
(0291) Init_kb(); //初始化PS2键盘接口
029C DF14 RCALL _Init_kb
029D C003 RJMP 0x02A1
(0292) while(1)
(0293) {
(0294) Disp_ascii(ascii); //显示翻译后的ASCII码
029E 91000060 LDS R16,0x60
02A0 DF21 RCALL _Disp_ascii
02A1 CFFC RJMP 0x029E
(0295) }
(0296) }
FILE: <library>
02A2 9508 RET
empy16s:
02A3 920A ST R0,-Y
02A4 921A ST R1,-Y
02A5 938A ST R24,-Y
02A6 939A ST R25,-Y
02A7 9F02 MUL R16,R18
02A8 01C0 MOVW R24,R0
02A9 9F12 MUL R17,R18
02AA 0D90 ADD R25,R0
02AB 9F03 MUL R16,R19
02AC 0D90 ADD R25,R0
02AD 018C MOVW R16,R24
02AE 9199 LD R25,Y+
02AF 9189 LD R24,Y+
02B0 9019 LD R1,Y+
02B1 9009 LD R0,Y+
02B2 9508 RET
push_lset:
02B3 93FA ST R31,-Y
02B4 93EA ST R30,-Y
02B5 93BA ST R27,-Y
02B6 93AA ST R26,-Y
02B7 939A ST R25,-Y
02B8 938A ST R24,-Y
02B9 933A ST R19,-Y
02BA 932A ST R18,-Y
02BB 931A ST R17,-Y
02BC 930A ST R16,-Y
02BD 929A ST R9,-Y
02BE 928A ST R8,-Y
02BF 927A ST R7,-Y
02C0 926A ST R6,-Y
02C1 925A ST R5,-Y
02C2 924A ST R4,-Y
02C3 923A ST R3,-Y
02C4 922A ST R2,-Y
02C5 921A ST R1,-Y
02C6 920A ST R0,-Y
02C7 B60F IN R0,P3F
02C8 920A ST R0,-Y
02C9 9508 RET
pop_lset:
02CA 9009 LD R0,Y+
02CB BE0F OUT P3F,R0
02CC 9009 LD R0,Y+
02CD 9019 LD R1,Y+
02CE 9029 LD R2,Y+
02CF 9039 LD R3,Y+
02D0 9049 LD R4,Y+
02D1 9059 LD R5,Y+
02D2 9069 LD R6,Y+
02D3 9079 LD R7,Y+
02D4 9089 LD R8,Y+
02D5 9099 LD R9,Y+
02D6 9109 LD R16,Y+
02D7 9119 LD R17,Y+
02D8 9129 LD R18,Y+
02D9 9139 LD R19,Y+
02DA 9189 LD R24,Y+
02DB 9199 LD R25,Y+
02DC 91A9 LD R26,Y+
02DD 91B9 LD R27,Y+
02DE 91E9 LD R30,Y+
02DF 91F9 LD R31,Y+
02E0 9508 RET
push_gset1:
02E1 935A ST R21,-Y
02E2 934A ST R20,-Y
02E3 9508 RET
pop_gset1:
02E4 E0E1 LDI R30,1
pop:
02E5 9149 LD R20,Y+
02E6 9159 LD R21,Y+
02E7 FDE0 SBRC R30,0
02E8 9508 RET
02E9 9169 LD R22,Y+
02EA 9179 LD R23,Y+
02EB FDE1 SBRC R30,1
02EC 9508 RET
02ED 90A9 LD R10,Y+
02EE 90B9 LD R11,Y+
02EF FDE2 SBRC R30,2
02F0 9508 RET
02F1 90C9 LD R12,Y+
02F2 90D9 LD R13,Y+
02F3 FDE3 SBRC R30,3
02F4 9508 RET
02F5 90E9 LD R14,Y+
02F6 90F9 LD R15,Y+
02F7 9508 RET
push_gset2:
02F8 937A ST R23,-Y
02F9 936A ST R22,-Y
02FA 940C02E1 JMP push_gset1
pop_gset2:
02FC E0E2 LDI R30,2
02FD 940C02E5 JMP pop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -