📄 ps2test.lst
字号:
01AC 9546 LSR R20
(0121) if ((PIN_KB&(1<<DATAPIN))!=0)
01AD 9B82 SBIS 0x10,2
01AE C001 RJMP 0x01B0
(0122) code|=0x80;
01AF 6840 ORI R20,0x80
(0123) while((PIN_KB&(1<<CLOCK))==0);
01B0 9B83 SBIS 0x10,3
01B1 CFFE RJMP 0x01B0
01B2 9563 INC R22
01B3 3068 CPI R22,0x8
01B4 F3A8 BCS 0x01AA
(0124) }
(0125) while(PIN_KB&(1<<CLOCK));
01B5 9983 SBIC 0x10,3
01B6 CFFE RJMP 0x01B5
(0126) while((PIN_KB&(1<<CLOCK))==0);
01B7 9B83 SBIS 0x10,3
01B8 CFFE RJMP 0x01B7
(0127) while(PIN_KB&(1<<CLOCK));
01B9 9983 SBIC 0x10,3
01BA CFFE RJMP 0x01B9
(0128) if ((PIN_KB&(1<<DATAPIN))!=0)
01BB 9B82 SBIS 0x10,2
01BC C008 RJMP 0x01C5
(0129) {
(0130) origialcode=code;
01BD 93400060 STS origialcode,R20
(0131) code=decode(code);
01BF 2F04 MOV R16,R20
01C0 D013 RCALL _decode
01C1 2F40 MOV R20,R16
(0132) if(code!=0)
01C2 2300 TST R16
01C3 F009 BEQ 0x01C5
(0133) put_c(code);
01C4 DF9A RCALL _put_c
(0134) }
(0135) }
01C5 940E02A0 CALL pop_gset2
01C7 940E02D9 CALL pop_lset
01C9 9518 RETI
(0136) }
(0137)
(0138) /*-------------------------------------------------------------------
(0139) function: initialize uart
(0140) --------------------------------------------------------------------*/
(0141) void init_USART(void)//USART 初始化
(0142) {
(0143)
(0144) //USART 9600 8, n,1 PC上位机软件(超级终端等)也要设成同样的设置才能通讯
(0145) UCSRC = (1<<URSEL) | 0x06;
_init_USART:
01CA E886 LDI R24,0x86
01CB BD80 OUT 0x20,R24
(0146) //异步,8位数据,无奇偶校验,一个停止位,无倍速
(0147) /*
(0148) UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
(0149) 写访问
(0150) 当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
(0151) 若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
(0152)
(0153) 读访问
(0154) 对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
(0155)
(0156)
(0157) 没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
(0158) */
(0159)
(0160) //U2X=0时的公式计算
(0161) UBRRL= (F_CPU/BAUDRATE/16-1)%256;
01CC E383 LDI R24,0x33
01CD B989 OUT 0x09,R24
(0162) UBRRH= (F_CPU/BAUDRATE/16-1)/256;
01CE 2422 CLR R2
01CF BC20 OUT 0x20,R2
(0163) //U2X=1时的公式计算
(0164) //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
(0165) //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
(0166) //也可根据数据手册的[波特率设置的例子]查得
(0167) //UBRRL = 0x2F; //set baud rate lo
(0168) //UBRRH = 0x00; //set baud rate hi
(0169) UCSRA = 0x00; //无倍速
01D0 B82B OUT 0x0B,R2
(0170) UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
01D1 E988 LDI R24,0x98
01D2 B98A OUT 0x0A,R24
01D3 9508 RET
_decode:
i --> R20
sc --> R16
01D4 940E02A9 CALL push_gset2
(0171) //使能接收中断,使能接收,使能发送
(0172) }
(0173)
(0174) /*--------------------------------------------------------------------------
(0175) function: decode the ps2 code to ASCII
(0176) para: sr----ps2 code
(0177) return ASCII code
(0178) --------------------------------------------------------------------------*/
(0179) unsigned char decode(unsigned char sc)
(0180) {
(0181) static unsigned char shift=0,up=0,shiftup=0;
(0182) unsigned char i;
(0183) if (sc==0xf0)
01D6 3F00 CPI R16,0xF0
01D7 F429 BNE 0x01DD
(0184) {
(0185) up=1;
01D8 E081 LDI R24,1
01D9 93800062 STS up,R24
(0186) return 0;
01DB 2700 CLR R16
01DC C086 RJMP 0x0263
(0187) }
(0188) if (up==1)
01DD 91800062 LDS R24,up
01DF 3081 CPI R24,1
01E0 F4E9 BNE 0x01FE
(0189) {
(0190) up=0;
01E1 2422 CLR R2
01E2 92200062 STS up,R2
(0191) if ((sc==0x12)|(sc==0x59)) shift=0;
01E4 3102 CPI R16,0x12
01E5 F419 BNE 0x01E9
01E6 E061 LDI R22,1
01E7 E070 LDI R23,0
01E8 C002 RJMP 0x01EB
01E9 2766 CLR R22
01EA 2777 CLR R23
01EB 3509 CPI R16,0x59
01EC F419 BNE 0x01F0
01ED E041 LDI R20,1
01EE E050 LDI R21,0
01EF C002 RJMP 0x01F2
01F0 2744 CLR R20
01F1 2755 CLR R21
01F2 011B MOVW R2,R22
01F3 2A24 OR R2,R20
01F4 2A35 OR R3,R21
01F5 2022 TST R2
01F6 F411 BNE 0x01F9
01F7 2033 TST R3
01F8 F019 BEQ 0x01FC
01F9 2422 CLR R2
01FA 92200061 STS shift,R2
(0192) return 0;
01FC 2700 CLR R16
01FD C065 RJMP 0x0263
(0193) }
(0194) switch (sc)
01FE 2F40 MOV R20,R16
01FF 2755 CLR R21
0200 3142 CPI R20,0x12
0201 E0E0 LDI R30,0
0202 075E CPC R21,R30
0203 F049 BEQ 0x020D
0204 3142 CPI R20,0x12
0205 E0E0 LDI R30,0
0206 075E CPC R21,R30
0207 F07C BLT 0x0217
0208 3549 CPI R20,0x59
0209 E0E0 LDI R30,0
020A 075E CPC R21,R30
020B F031 BEQ 0x0212
020C C00A RJMP 0x0217
(0195) {
(0196) case 0x12:{
(0197) shift=1;
020D E081 LDI R24,1
020E 93800061 STS shift,R24
(0198) shiftup=1;
0210 93800063 STS shiftup,R24
(0199) }
(0200) case 0x59:{
(0201) shift=1;
0212 E081 LDI R24,1
0213 93800061 STS shift,R24
(0202) shiftup=1;
0215 93800063 STS shiftup,R24
(0203) }
(0204) default:{
(0205) if (shift==0)
0217 90200061 LDS R2,shift
0219 2022 TST R2
021A F521 BNE 0x023F
(0206) {
(0207) for(i = 0;unshifted[i][0]!=sc && unshifted[i][0]; i++);
021B 2744 CLR R20
021C C001 RJMP 0x021E
021D 9543 INC R20
021E E082 LDI R24,2
021F 9F84 MUL R24,R20
0220 01F0 MOVW R30,R0
0221 E584 LDI R24,0x54
0222 E090 LDI R25,0
0223 0FE8 ADD R30,R24
0224 1FF9 ADC R31,R25
0225 9024 LPM R2,0(Z)
0226 2433 CLR R3
0227 1620 CP R2,R16
0228 F011 BEQ 0x022B
0229 2022 TST R2
022A F791 BNE 0x021D
(0208) if (unshifted[i][0] == sc)
022B E082 LDI R24,2
022C 9F84 MUL R24,R20
022D 01F0 MOVW R30,R0
022E E584 LDI R24,0x54
022F E090 LDI R25,0
0230 0FE8 ADD R30,R24
0231 1FF9 ADC R31,R25
0232 91E4 LPM R30,0(Z)
0233 17E0 CP R30,R16
0234 F009 BEQ 0x0236
0235 C02C RJMP 0x0262
(0209) return unshifted[i][1];
0236 E082 LDI R24,2
0237 9F84 MUL R24,R20
0238 01F0 MOVW R30,R0
0239 E585 LDI R24,0x55
023A E090 LDI R25,0
023B 0FE8 ADD R30,R24
023C 1FF9 ADC R31,R25
023D 9104 LPM R16,0(Z)
023E C024 RJMP 0x0263
(0210) }
(0211) else
(0212) {
(0213) for(i = 0;shifted[i][0]!=sc && shifted[i][0]; i++);
023F 2744 CLR R20
0240 C001 RJMP 0x0242
0241 9543 INC R20
0242 E082 LDI R24,2
0243 9F84 MUL R24,R20
0244 01F0 MOVW R30,R0
0245 ED8C LDI R24,0xDC
0246 E090 LDI R25,0
0247 0FE8 ADD R30,R24
0248 1FF9 ADC R31,R25
0249 9024 LPM R2,0(Z)
024A 2433 CLR R3
024B 1620 CP R2,R16
024C F011 BEQ 0x024F
024D 2022 TST R2
024E F791 BNE 0x0241
(0214) if (shifted[i][0] == sc)
024F E082 LDI R24,2
0250 9F84 MUL R24,R20
0251 01F0 MOVW R30,R0
0252 ED8C LDI R24,0xDC
0253 E090 LDI R25,0
0254 0FE8 ADD R30,R24
0255 1FF9 ADC R31,R25
0256 91E4 LPM R30,0(Z)
0257 17E0 CP R30,R16
0258 F449 BNE 0x0262
(0215) {
(0216) return shifted[i][1];
0259 E082 LDI R24,2
025A 9F84 MUL R24,R20
025B 01F0 MOVW R30,R0
025C ED8D LDI R24,0xDD
025D E090 LDI R25,0
025E 0FE8 ADD R30,R24
025F 1FF9 ADC R31,R25
0260 9104 LPM R16,0(Z)
0261 C001 RJMP 0x0263
(0217) }
(0218) }
(0219) }
(0220) return 0;
FILE: <library>
0262 2700 CLR R16
0263 940E02A0 CALL pop_gset2
0265 9508 RET
mod16s:
0266 9468 BSET 6
0267 92DA ST R13,-Y
0268 2ED1 MOV R13,R17
0269 C004 RJMP 0x026E
div16s:
026A 94E8 BCLR 6
026B 92DA ST R13,-Y
026C 2ED1 MOV R13,R17
026D 26D3 EOR R13,R19
026E FF17 SBRS R17,7
026F C004 RJMP 0x0274
0270 9510 COM R17
0271 9500 COM R16
0272 5F0F SUBI R16,0xFF
0273 4F1F SBCI R17,0xFF
0274 FF37 SBRS R19,7
0275 C004 RJMP 0x027A
0276 9530 COM R19
0277 9520 COM R18
0278 5F2F SUBI R18,0xFF
0279 4F3F SBCI R19,0xFF
027A 940E0287 CALL xdiv16u
027C FED7 SBRS R13,7
027D C004 RJMP 0x0282
027E 9510 COM R17
027F 9500 COM R16
0280 5F0F SUBI R16,0xFF
0281 4F1F SBCI R17,0xFF
0282 90D9 LD R13,Y+
0283 9508 RET
mod16u:
0284 9468 BSET 6
0285 C001 RJMP xdiv16u
div16u:
0286 94E8 BCLR 6
xdiv16u:
0287 92EA ST R14,-Y
0288 92FA ST R15,-Y
0289 938A ST R24,-Y
028A 24EE CLR R14
028B 24FF CLR R15
028C E180 LDI R24,0x10
028D 0F00 LSL R16
028E 1F11 ROL R17
028F 1CEE ROL R14
0290 1CFF ROL R15
0291 16E2 CP R14,R18
0292 06F3 CPC R15,R19
0293 F018 BCS 0x0297
0294 1AE2 SUB R14,R18
0295 0AF3 SBC R15,R19
0296 9503 INC R16
0297 958A DEC R24
0298 F7A1 BNE 0x028D
0299 F416 BRTC 0x029C
029A 2D0E MOV R16,R14
029B 2D1F MOV R17,R15
029C 9189 LD R24,Y+
029D 90F9 LD R15,Y+
029E 90E9 LD R14,Y+
029F 9508 RET
pop_gset2:
02A0 E0E2 LDI R30,2
02A1 940C02AF JMP pop
push_gset5:
02A3 92FA ST R15,-Y
02A4 92EA ST R14,-Y
push_gset4:
02A5 92DA ST R13,-Y
02A6 92CA ST R12,-Y
push_gset3:
02A7 92BA ST R11,-Y
02A8 92AA ST R10,-Y
push_gset2:
02A9 937A ST R23,-Y
02AA 936A ST R22,-Y
push_gset1:
02AB 935A ST R21,-Y
02AC 934A ST R20,-Y
02AD 9508 RET
pop_gset1:
02AE E0E1 LDI R30,1
pop:
02AF 9149 LD R20,Y+
02B0 9159 LD R21,Y+
02B1 FDE0 SBRC R30,0
02B2 9508 RET
02B3 9169 LD R22,Y+
02B4 9179 LD R23,Y+
02B5 FDE1 SBRC R30,1
02B6 9508 RET
02B7 90A9 LD R10,Y+
02B8 90B9 LD R11,Y+
02B9 FDE2 SBRC R30,2
02BA 9508 RET
02BB 90C9 LD R12,Y+
02BC 90D9 LD R13,Y+
02BD FDE3 SBRC R30,3
02BE 9508 RET
02BF 90E9 LD R14,Y+
02C0 90F9 LD R15,Y+
02C1 9508 RET
push_lset:
02C2 93FA ST R31,-Y
02C3 93EA ST R30,-Y
02C4 93BA ST R27,-Y
02C5 93AA ST R26,-Y
02C6 939A ST R25,-Y
02C7 938A ST R24,-Y
02C8 933A ST R19,-Y
02C9 932A ST R18,-Y
02CA 931A ST R17,-Y
02CB 930A ST R16,-Y
02CC 929A ST R9,-Y
02CD 928A ST R8,-Y
02CE 927A ST R7,-Y
02CF 926A ST R6,-Y
02D0 925A ST R5,-Y
02D1 924A ST R4,-Y
02D2 923A ST R3,-Y
02D3 922A ST R2,-Y
02D4 921A ST R1,-Y
02D5 920A ST R0,-Y
02D6 B60F IN R0,0x3F
02D7 920A ST R0,-Y
02D8 9508 RET
pop_lset:
02D9 9009 LD R0,Y+
02DA BE0F OUT 0x3F,R0
02DB 9009 LD R0,Y+
02DC 9019 LD R1,Y+
02DD 9029 LD R2,Y+
02DE 9039 LD R3,Y+
02DF 9049 LD R4,Y+
02E0 9059 LD R5,Y+
02E1 9069 LD R6,Y+
02E2 9079 LD R7,Y+
02E3 9089 LD R8,Y+
02E4 9099 LD R9,Y+
02E5 9109 LD R16,Y+
02E6 9119 LD R17,Y+
02E7 9129 LD R18,Y+
02E8 9139 LD R19,Y+
02E9 9189 LD R24,Y+
02EA 9199 LD R25,Y+
02EB 91A9 LD R26,Y+
02EC 91B9 LD R27,Y+
02ED 91E9 LD R30,Y+
02EE 91F9 LD R31,Y+
02EF 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -