⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps20317.lst

📁 104键PS2接口标准键盘程序(C语言),通过测试可以!程序简单易懂。基于ICCAVR编译器
💻 LST
📖 第 1 页 / 共 2 页
字号:
    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 + -