📄 ps2kb_uart.lst
字号:
0182 C06B RJMP 0x01EE
(0125)
(0126) case 0x12 : // 左 SHIFT
(0127) Shift = 1;
0183 E081 LDI R24,1
0184 93800064 STS Shift,R24
(0128) break;
0186 C067 RJMP 0x01EE
(0129)
(0130) case 0x59 : // 右 SHIFT
(0131) Shift = 1;
0187 E081 LDI R24,1
0188 93800064 STS Shift,R24
(0132) break;
018A C063 RJMP 0x01EE
(0133)
(0134) default:
(0135) if(!Shift) //如果SHIFT没按下
018B 90200064 LDS R2,Shift
018D 2022 TST R2
018E F521 BNE 0x01B3
(0136) {
(0137) for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
018F 2766 CLR R22
0190 C001 RJMP 0x0192
0191 9563 INC R22
0192 E082 LDI R24,2
0193 9F86 MUL R24,R22
0194 01F0 MOVW R30,R0
0195 E584 LDI R24,0x54
0196 E090 LDI R25,0
0197 0FE8 ADD R30,R24
0198 1FF9 ADC R31,R25
0199 91E4 LPM R30,0(Z)
019A 17E4 CP R30,R20
019B F011 BEQ 0x019E
019C 336B CPI R22,0x3B
019D F398 BCS 0x0191
(0138) if (UnShifted[TempCyc][0] == ScanCode)
019E E082 LDI R24,2
019F 9F86 MUL R24,R22
01A0 01F0 MOVW R30,R0
01A1 E584 LDI R24,0x54
01A2 E090 LDI R25,0
01A3 0FE8 ADD R30,R24
01A4 1FF9 ADC R31,R25
01A5 91E4 LPM R30,0(Z)
01A6 17E4 CP R30,R20
01A7 F009 BEQ 0x01A9
01A8 C045 RJMP 0x01EE
(0139) uart_transmit(UnShifted[TempCyc][1]);
01A9 E082 LDI R24,2
01AA 9F86 MUL R24,R22
01AB 01F0 MOVW R30,R0
01AC E585 LDI R24,0x55
01AD E090 LDI R25,0
01AE 0FE8 ADD R30,R24
01AF 1FF9 ADC R31,R25
01B0 9104 LPM R16,0(Z)
01B1 DF5B RCALL _uart_transmit
(0140) }
01B2 C03B RJMP 0x01EE
(0141) else //按下SHIFT
(0142) {
(0143) for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
01B3 2766 CLR R22
01B4 C001 RJMP 0x01B6
01B5 9563 INC R22
01B6 E082 LDI R24,2
01B7 9F86 MUL R24,R22
01B8 01F0 MOVW R30,R0
01B9 EC8A LDI R24,0xCA
01BA E090 LDI R25,0
01BB 0FE8 ADD R30,R24
01BC 1FF9 ADC R31,R25
01BD 91E4 LPM R30,0(Z)
01BE 17E4 CP R30,R20
01BF F011 BEQ 0x01C2
01C0 336B CPI R22,0x3B
01C1 F398 BCS 0x01B5
(0144) if (Shifted[TempCyc][0] == ScanCode)
01C2 E082 LDI R24,2
01C3 9F86 MUL R24,R22
01C4 01F0 MOVW R30,R0
01C5 EC8A LDI R24,0xCA
01C6 E090 LDI R25,0
01C7 0FE8 ADD R30,R24
01C8 1FF9 ADC R31,R25
01C9 91E4 LPM R30,0(Z)
01CA 17E4 CP R30,R20
01CB F511 BNE 0x01EE
(0145) uart_transmit(Shifted[TempCyc][1]);
01CC E082 LDI R24,2
01CD 9F86 MUL R24,R22
01CE 01F0 MOVW R30,R0
01CF EC8B LDI R24,0xCB
01D0 E090 LDI R25,0
01D1 0FE8 ADD R30,R24
01D2 1FF9 ADC R31,R25
01D3 9104 LPM R16,0(Z)
01D4 DF38 RCALL _uart_transmit
(0146) }
(0147)
(0148) break;
(0149) }
(0150) }
01D5 C018 RJMP 0x01EE
(0151) else
(0152) {
(0153) Key_UP = 0;
01D6 2422 CLR R2
01D7 92200063 STS Key_UP,R2
(0154) switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
01D9 2755 CLR R21
01DA 3142 CPI R20,0x12
01DB E0E0 LDI R30,0
01DC 075E CPC R21,R30
01DD F049 BEQ 0x01E7
01DE 3142 CPI R20,0x12
01DF E0E0 LDI R30,0
01E0 075E CPC R21,R30
01E1 F064 BLT 0x01EE
01E2 3549 CPI R20,0x59
01E3 E0E0 LDI R30,0
01E4 075E CPC R21,R30
01E5 F029 BEQ 0x01EB
01E6 C007 RJMP 0x01EE
(0155) {
(0156) case 0x12 : // 左 SHIFT
(0157) Shift = 0;
01E7 2422 CLR R2
01E8 92200064 STS Shift,R2
(0158) break;
01EA C003 RJMP 0x01EE
(0159)
(0160) case 0x59 : // 右 SHIFT
(0161) Shift = 0;
01EB 2422 CLR R2
01EC 92200064 STS Shift,R2
(0162) break;
(0163) }
(0164) }
(0165) BF = 0; //标识字符处理完了
01EE 2422 CLR R2
01EF 92200065 STS BF,R2
01F1 940E022D CALL pop_gset2
01F3 9508 RET
(0166) }
(0167)
(0168)
(0169) void main(void)
(0170) {
(0171) unsigned int i;
(0172) CLI(); //disable all interrupts
_main:
i --> R20
01F4 94F8 BCLR 7
(0173) port_init();
01F5 DF09 RCALL _port_init
(0174) UART_init();
01F6 DF0D RCALL _UART_init
(0175) MCUCR = 0x08;
01F7 E088 LDI R24,0x8
01F8 BF85 OUT 0x35,R24
(0176) GICR = 0x80;
01F9 E880 LDI R24,0x80
01FA BF8B OUT 0x3B,R24
(0177) SEI();
01FB 9478 BSET 7
(0178) for(i=0;i<60000;i++)//延时
01FC 2744 CLR R20
01FD 2755 CLR R21
01FE C002 RJMP 0x0201
01FF 5F4F SUBI R20,0xFF
0200 4F5F SBCI R21,0xFF
0201 3640 CPI R20,0x60
0202 EEEA LDI R30,0xEA
0203 075E CPC R21,R30
0204 F3D0 BCS 0x01FF
(0179) ;
(0180) uart_transmit('\n');
0205 E00A LDI R16,0xA
0206 DF06 RCALL _uart_transmit
(0181) uart_trans_str(" Welcome You!");
0207 EC09 LDI R16,0xC9
0208 E010 LDI R17,0
0209 DF07 RCALL _uart_trans_str
(0182) uart_transmit('\n');
020A E00A LDI R16,0xA
020B DF01 RCALL _uart_transmit
(0183) uart_trans_str(" You are the best!");
020C EB03 LDI R16,0xB3
020D E010 LDI R17,0
020E DF02 RCALL _uart_trans_str
(0184) uart_transmit('\n');
020F E00A LDI R16,0xA
0210 DEFC RCALL _uart_transmit
(0185) uart_trans_str(" EndyLu AVR 2.0");
0211 EA01 LDI R16,0xA1
0212 E010 LDI R17,0
0213 DEFD RCALL _uart_trans_str
(0186) uart_transmit('\n');
0214 E00A LDI R16,0xA
0215 DEF7 RCALL _uart_transmit
(0187) uart_trans_str(" PS2 Keyboard test program 1.0");
0216 E802 LDI R16,0x82
0217 E010 LDI R17,0
0218 DEF8 RCALL _uart_trans_str
(0188) uart_transmit('\n');
0219 E00A LDI R16,0xA
021A DEF2 RCALL _uart_transmit
(0189) uart_trans_str("Please input with keyboard:");
021B E606 LDI R16,0x66
021C E010 LDI R17,0
021D DEF3 RCALL _uart_trans_str
021E C00C RJMP 0x022B
(0190) while(1)
(0191) {
(0192)
(0193) if(flag ==1)
021F 91800062 LDS R24,flag
0221 3081 CPI R24,1
0222 F441 BNE 0x022B
(0194) {
(0195) //uart_transmit(keycode); //发送未解码信息,了解原理时可用
(0196) Decode(keycode); //键盘解码
0223 91000060 LDS R16,keycode
0225 DF3C RCALL _Decode
(0197)
(0198) keycode = 0;
0226 2422 CLR R2
0227 92200060 STS keycode,R2
(0199)
(0200) flag = 0;
FILE: <library>
0229 92200062 STS flag,R2
022B CFF3 RJMP 0x021F
022C 9508 RET
pop_gset2:
022D E0E2 LDI R30,2
022E 940C023C JMP pop
push_gset5:
0230 92FA ST R15,-Y
0231 92EA ST R14,-Y
push_gset4:
0232 92DA ST R13,-Y
0233 92CA ST R12,-Y
push_gset3:
0234 92BA ST R11,-Y
0235 92AA ST R10,-Y
push_gset2:
0236 937A ST R23,-Y
0237 936A ST R22,-Y
push_gset1:
0238 935A ST R21,-Y
0239 934A ST R20,-Y
023A 9508 RET
pop_gset1:
023B E0E1 LDI R30,1
pop:
023C 9149 LD R20,Y+
023D 9159 LD R21,Y+
023E FDE0 SBRC R30,0
023F 9508 RET
0240 9169 LD R22,Y+
0241 9179 LD R23,Y+
0242 FDE1 SBRC R30,1
0243 9508 RET
0244 90A9 LD R10,Y+
0245 90B9 LD R11,Y+
0246 FDE2 SBRC R30,2
0247 9508 RET
0248 90C9 LD R12,Y+
0249 90D9 LD R13,Y+
024A FDE3 SBRC R30,3
024B 9508 RET
024C 90E9 LD R14,Y+
024D 90F9 LD R15,Y+
024E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -