📄 ps20317.lst
字号:
01BA 01F0 MOVW R30,R0
01BB E584 LDI R24,0x54
01BC E090 LDI R25,0
01BD 0FE8 ADD R30,R24
01BE 1FF9 ADC R31,R25
01BF 91E4 LPM R30,0(Z)
01C0 17E4 CP R30,R20
01C1 F009 BEQ 0x01C3
01C2 C065 RJMP 0x0228
(0136) put_kbbuff(unshifted[i][1]);
01C3 E082 LDI R24,2
01C4 9F86 MUL R24,R22
01C5 01F0 MOVW R30,R0
01C6 E585 LDI R24,0x55
01C7 E090 LDI R25,0
01C8 0FE8 ADD R30,R24
01C9 1FF9 ADC R31,R25
01CA 9104 LPM R16,0(Z)
01CB DF26 RCALL _put_kbbuff
(0137) }
(0138) } else { // If shift is pressed
01CC C05B RJMP 0x0228
(0139) for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
01CD 2766 CLR R22
01CE C001 RJMP 0x01D0
01CF 9563 INC R22
01D0 E082 LDI R24,2
01D1 9F86 MUL R24,R22
01D2 01F0 MOVW R30,R0
01D3 ED8C LDI R24,0xDC
01D4 E090 LDI R25,0
01D5 0FE8 ADD R30,R24
01D6 1FF9 ADC R31,R25
01D7 9024 LPM R2,0(Z)
01D8 2433 CLR R3
01D9 1624 CP R2,R20
01DA F011 BEQ 0x01DD
01DB 2022 TST R2
01DC F791 BNE 0x01CF
(0140) if (shifted[i][0] == sc) {
01DD E082 LDI R24,2
01DE 9F86 MUL R24,R22
01DF 01F0 MOVW R30,R0
01E0 ED8C LDI R24,0xDC
01E1 E090 LDI R25,0
01E2 0FE8 ADD R30,R24
01E3 1FF9 ADC R31,R25
01E4 91E4 LPM R30,0(Z)
01E5 17E4 CP R30,R20
01E6 F009 BEQ 0x01E8
01E7 C040 RJMP 0x0228
(0141) put_kbbuff(shifted[i][1]);
01E8 E082 LDI R24,2
01E9 9F86 MUL R24,R22
01EA 01F0 MOVW R30,R0
01EB ED8D LDI R24,0xDD
01EC E090 LDI R25,0
01ED 0FE8 ADD R30,R24
01EE 1FF9 ADC R31,R25
01EF 9104 LPM R16,0(Z)
01F0 DF01 RCALL _put_kbbuff
(0142) }
(0143) }
(0144) } else{ // Scan code mode
01F1 C036 RJMP 0x0228
(0145) print_hexbyte(sc); // Print scan code
01F2 2F04 MOV R16,R20
01F3 DF4A RCALL _print_hexbyte
(0146) put_kbbuff(' ');
01F4 E200 LDI R16,0x20
01F5 DEFC RCALL _put_kbbuff
(0147)
(0148) }
(0149) break;
(0150) }
(0151) } else {
01F6 C031 RJMP 0x0228
(0152) is_up = 0; // Two 0xF0 in a row not allowed
01F7 2422 CLR R2
01F8 92200060 STS is_up,R2
(0153) switch (sc)
01FA 2755 CLR R21
01FB 3142 CPI R20,0x12
01FC E0E0 LDI R30,0
01FD 075E CPC R21,R30
01FE F099 BEQ 0x0212
01FF E182 LDI R24,0x12
0200 E090 LDI R25,0
0201 1784 CP R24,R20
0202 0795 CPC R25,R21
0203 F04C BLT 0x020D
0204 3045 CPI R20,5
0205 E0E0 LDI R30,0
0206 075E CPC R21,R30
0207 F091 BEQ 0x021A
0208 3046 CPI R20,6
0209 E0E0 LDI R30,0
020A 075E CPC R21,R30
020B F0E1 BEQ 0x0228
020C C01B RJMP 0x0228
020D 3549 CPI R20,0x59
020E E0E0 LDI R30,0
020F 075E CPC R21,R30
0210 F029 BEQ 0x0216
0211 C016 RJMP 0x0228
(0154) {
(0155) case 0x12 : // Left SHIFT
(0156) shift = 0;
0212 2422 CLR R2
0213 92200061 STS shift,R2
(0157) break;
0215 C012 RJMP 0x0228
(0158)
(0159) case 0x59 : // Right SHIFT
(0160) shift = 0;
0216 2422 CLR R2
0217 92200061 STS shift,R2
(0161) break;
0219 C00E RJMP 0x0228
(0162)
(0163) case 0x05 : // F1
(0164) if(mode == 1)
021A 91800062 LDS R24,mode
021C 3081 CPI R24,1
021D F419 BNE 0x0221
(0165) mode = 2;
021E E082 LDI R24,2
021F 93800062 STS mode,R24
(0166) if(mode == 3)
0221 91800062 LDS R24,mode
0223 3083 CPI R24,3
0224 F419 BNE 0x0228
(0167) mode = 0;
0225 2422 CLR R2
0226 92200062 STS mode,R2
(0168) break;
(0169) case 0x06 : // F2
(0170) // clr();
(0171) break;
(0172)
(0173) }
(0174) }
0228 940E0278 CALL pop_gset2
022A 9508 RET
_int0_isr:
022B 940E029A CALL push_lset
(0175) }
(0176)
(0177)
(0178) #pragma interrupt_handler int0_isr:iv_INT0
(0179) void int0_isr(void)
(0180) {
(0181) //external interupt on INT0
(0182) static unsigned char data; // Holds the received scan code
(0183)
(0184) if(bitcount < 11 && bitcount > 2) // Bit 3 to 10 is data. Parity bit,
022D 918000A9 LDS R24,bitcount
022F 308B CPI R24,0xB
0230 F480 BCC 0x0241
0231 E082 LDI R24,2
0232 902000A9 LDS R2,bitcount
0234 1582 CP R24,R2
0235 F458 BCC 0x0241
(0185) { // start and stop bits are ignored.
(0186) data = (data >> 1);
0236 90200063 LDS R2,data
0238 9426 LSR R2
0239 92200063 STS data,R2
(0187) if(PIND & 8) //first receive lsb
023B 9B83 SBIS 0x10,3
023C C004 RJMP 0x0241
(0188) data = data | 0x80; // Store a '1'
023D 2D82 MOV R24,R2
023E 6880 ORI R24,0x80
023F 93800063 STS data,R24
(0189) }
(0190)
(0191) if(--bitcount == 0) // All bits received
0241 918000A9 LDS R24,bitcount
0243 5081 SUBI R24,1
0244 2E28 MOV R2,R24
0245 922000A9 STS bitcount,R2
0247 2388 TST R24
0248 F431 BNE 0x024F
(0192) {
(0193) decode(data);
0249 91000063 LDS R16,data
024B DF0F RCALL _decode
(0194) bitcount = 11;
024C E08B LDI R24,0xB
024D 938000A9 STS bitcount,R24
(0195) }
024F 940E02B1 CALL pop_lset
0251 9518 RETI
_delay_ms:
i --> R20
ms --> R16
0252 940E0283 CALL push_gset1
(0196) }
(0197)
(0198)
(0199)
(0200) void delay_ms(unsigned char ms)
(0201) {
0254 C009 RJMP 0x025E
(0202) unsigned int i;
(0203) while(ms--)
(0204) for(i=11059;i=0;i--);
0255 E343 LDI R20,0x33
0256 E25B LDI R21,0x2B
0257 C002 RJMP 0x025A
0258 5041 SUBI R20,1
0259 4050 SBCI R21,0
025A 2744 CLR R20
025B 2755 CLR R21
025C 2422 CLR R2
025D F7D1 BNE 0x0258
025E 2E20 MOV R2,R16
025F 2433 CLR R3
0260 5001 SUBI R16,1
0261 2022 TST R2
0262 F791 BNE 0x0255
0263 940E0286 CALL pop_gset1
0265 9508 RET
(0205) }
(0206)
(0207) //call this routine to initialize all peripherals
(0208) void init_devices(void)
(0209) {
(0210) //stop errant interrupts until set up
(0211) CLI(); //disable all interrupts
_init_devices:
0266 94F8 BCLR 7
(0212) port_init();
0267 DE6D RCALL _port_init
(0213) InitKeyBoard();
0268 DE76 RCALL _InitKeyBoard
(0214)
(0215) MCUCR = 0x02;
0269 E082 LDI R24,2
026A BF85 OUT 0x35,R24
(0216) GICR = 0x40;
026B E480 LDI R24,0x40
026C BF8B OUT 0x3B,R24
(0217) TIMSK = 0x00; //timer interrupt sources
026D 2422 CLR R2
026E BE29 OUT 0x39,R2
(0218) SEI(); //re-enable interrupts
026F 9478 BSET 7
0270 9508 RET
(0219) //all peripherals are now initialized
(0220) }
(0221)
(0222) //#include <delay.h>
(0223)
(0224) //#include <lcd.h>
(0225)
(0226)
(0227) void main(void)
(0228) {
_main:
key --> R20
0271 C004 RJMP 0x0276
(0229) // Declare your local variables here
(0230) unsigned char key;
(0231)
(0232)
(0233) while(1)
(0234) {
(0235) key = getchar_kb();
0272 DEA6 RCALL _getchar_kb
0273 2F40 MOV R20,R16
(0236) //lcd_putchar(key);
(0237) delay_ms(5);
FILE: <library>
0274 E005 LDI R16,5
0275 DFDC RCALL _delay_ms
0276 CFFB RJMP 0x0272
0277 9508 RET
pop_gset2:
0278 E0E2 LDI R30,2
0279 940C0287 JMP pop
push_gset5:
027B 92FA ST R15,-Y
027C 92EA ST R14,-Y
push_gset4:
027D 92DA ST R13,-Y
027E 92CA ST R12,-Y
push_gset3:
027F 92BA ST R11,-Y
0280 92AA ST R10,-Y
push_gset2:
0281 937A ST R23,-Y
0282 936A ST R22,-Y
push_gset1:
0283 935A ST R21,-Y
0284 934A ST R20,-Y
0285 9508 RET
pop_gset1:
0286 E0E1 LDI R30,1
pop:
0287 9149 LD R20,Y+
0288 9159 LD R21,Y+
0289 FDE0 SBRC R30,0
028A 9508 RET
028B 9169 LD R22,Y+
028C 9179 LD R23,Y+
028D FDE1 SBRC R30,1
028E 9508 RET
028F 90A9 LD R10,Y+
0290 90B9 LD R11,Y+
0291 FDE2 SBRC R30,2
0292 9508 RET
0293 90C9 LD R12,Y+
0294 90D9 LD R13,Y+
0295 FDE3 SBRC R30,3
0296 9508 RET
0297 90E9 LD R14,Y+
0298 90F9 LD R15,Y+
0299 9508 RET
push_lset:
029A 93FA ST R31,-Y
029B 93EA ST R30,-Y
029C 93BA ST R27,-Y
029D 93AA ST R26,-Y
029E 939A ST R25,-Y
029F 938A ST R24,-Y
02A0 933A ST R19,-Y
02A1 932A ST R18,-Y
02A2 931A ST R17,-Y
02A3 930A ST R16,-Y
02A4 929A ST R9,-Y
02A5 928A ST R8,-Y
02A6 927A ST R7,-Y
02A7 926A ST R6,-Y
02A8 925A ST R5,-Y
02A9 924A ST R4,-Y
02AA 923A ST R3,-Y
02AB 922A ST R2,-Y
02AC 921A ST R1,-Y
02AD 920A ST R0,-Y
02AE B60F IN R0,0x3F
02AF 920A ST R0,-Y
02B0 9508 RET
pop_lset:
02B1 9009 LD R0,Y+
02B2 BE0F OUT 0x3F,R0
02B3 9009 LD R0,Y+
02B4 9019 LD R1,Y+
02B5 9029 LD R2,Y+
02B6 9039 LD R3,Y+
02B7 9049 LD R4,Y+
02B8 9059 LD R5,Y+
02B9 9069 LD R6,Y+
02BA 9079 LD R7,Y+
02BB 9089 LD R8,Y+
02BC 9099 LD R9,Y+
02BD 9109 LD R16,Y+
02BE 9119 LD R17,Y+
02BF 9129 LD R18,Y+
02C0 9139 LD R19,Y+
02C1 9189 LD R24,Y+
02C2 9199 LD R25,Y+
02C3 91A9 LD R26,Y+
02C4 91B9 LD R27,Y+
02C5 91E9 LD R30,Y+
02C6 91F9 LD R31,Y+
02C7 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -