?? ps20317.lst
字號:
__start:
__text_start:
00B4 E5CF LDI R28,0x5F
00B5 E0D4 LDI R29,4
00B6 BFCD OUT 0x3D,R28
00B7 BFDE OUT 0x3E,R29
00B8 51C0 SUBI R28,0x10
00B9 40D0 SBCI R29,0
00BA EA0A LDI R16,0xAA
00BB 8308 STD Y+0,R16
00BC 2400 CLR R0
00BD E6E3 LDI R30,0x63
00BE E0F0 LDI R31,0
00BF E010 LDI R17,0
00C0 3AEB CPI R30,0xAB
00C1 07F1 CPC R31,R17
00C2 F011 BEQ 0x00C5
00C3 9201 ST R0,Z+
00C4 CFFB RJMP 0x00C0
00C5 8300 STD Z+0,R16
00C6 E6E4 LDI R30,0x64
00C7 E0F1 LDI R31,1
00C8 E6A0 LDI R26,0x60
00C9 E0B0 LDI R27,0
00CA E011 LDI R17,1
00CB 36E7 CPI R30,0x67
00CC 07F1 CPC R31,R17
00CD F021 BEQ 0x00D2
00CE 95C8 LPM
00CF 9631 ADIW R30,1
00D0 920D ST R0,X+
00D1 CFF9 RJMP 0x00CB
00D2 940E0271 CALL _main
_exit:
00D4 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
(0001) /*****************************
(0002) ** low level kexboard routines VERSION 1.0
(0003) ******************************/
(0004) //ICC-AVR application builder : 2009-3-13 23:41:54
(0005) // Target : M16
(0006) // Crystal: 11.059Mhz
(0007)
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010)
(0011) // "kb.h"
(0012) #include "scancode.h"
(0013)
(0014) #define BUFF_SIZE 64
(0015) #define CLOCK 2
(0016) #define DATAPIN 3
(0017)
(0018) #define ISC00 0
(0019) #define ISC01 1
(0020)
(0021) // Declare your global variables here
(0022) unsigned char edge, bitcount; // 0 = neg. 1 = pos.
(0023)
(0024) unsigned char kb_buffer[BUFF_SIZE];
(0025) unsigned char *inpt, *outpt;
(0026) unsigned char buffcnt;
(0027)
(0028) void port_init(void)
(0029) {
(0030) PORTA = 0x00;
_port_init:
00D5 2422 CLR R2
00D6 BA2B OUT 0x1B,R2
(0031) DDRA = 0x00;
00D7 BA2A OUT 0x1A,R2
(0032) PORTB = 0x00;
00D8 BA28 OUT 0x18,R2
(0033) DDRB = 0x00;
00D9 BA27 OUT 0x17,R2
(0034) PORTC = 0x00; //m103 output only
00DA BA25 OUT 0x15,R2
(0035) DDRC = 0x00;
00DB BA24 OUT 0x14,R2
(0036) PORTD = 0x00;
00DC BA22 OUT 0x12,R2
(0037) DDRD = 0x00;
00DD BA21 OUT 0x11,R2
00DE 9508 RET
(0038) }
(0039)
(0040)
(0041) void InitKeyBoard(void)
(0042) {
(0043) inpt = kb_buffer; // Initialize buffer
_InitKeyBoard:
00DF E689 LDI R24,0x69
00E0 E090 LDI R25,0
00E1 93900068 STS inpt+1,R25
00E3 93800067 STS inpt,R24
(0044) outpt = kb_buffer;
00E5 93900066 STS outpt+1,R25
00E7 93800065 STS outpt,R24
(0045) buffcnt = 0;
00E9 2422 CLR R2
00EA 92200064 STS buffcnt,R2
(0046)
(0047) //MCUCR = 2; // INT0 interrupt on falling edge
(0048) edge = 0; // 0 = falling edge 1 = rising edge
00EC 922000AA STS edge,R2
(0049) bitcount = 11;
00EE E08B LDI R24,0xB
00EF 938000A9 STS bitcount,R24
00F1 9508 RET
(0050) //#asm("sei") // interrupt enable
(0051) }
(0052)
(0053)
(0054) void put_kbbuff(unsigned char c)
(0055) {
(0056) if (buffcnt<BUFF_SIZE) // If buffer not full
_put_kbbuff:
c --> R16
00F2 91800064 LDS R24,buffcnt
00F4 3480 CPI R24,0x40
00F5 F510 BCC 0x0118
(0057) {
(0058) *inpt = c; // Put character into buffer
00F6 91E00067 LDS R30,inpt
00F8 91F00068 LDS R31,inpt+1
00FA 8300 STD Z+0,R16
(0059) inpt++; // Increment pointer
00FB 91800067 LDS R24,inpt
00FD 91900068 LDS R25,inpt+1
00FF 9601 ADIW R24,1
0100 93900068 STS inpt+1,R25
0102 93800067 STS inpt,R24
(0060)
(0061) buffcnt++;
0104 91800064 LDS R24,buffcnt
0106 5F8F SUBI R24,0xFF
0107 93800064 STS buffcnt,R24
(0062)
(0063) if (inpt >= kb_buffer + BUFF_SIZE) // Pointer wrapping
0109 EA89 LDI R24,0xA9
010A E090 LDI R25,0
010B 90200067 LDS R2,inpt
010D 90300068 LDS R3,inpt+1
010F 1628 CP R2,R24
0110 0639 CPC R3,R25
0111 F030 BCS 0x0118
(0064) inpt = kb_buffer;
0112 E689 LDI R24,0x69
0113 E090 LDI R25,0
0114 93900068 STS inpt+1,R25
0116 93800067 STS inpt,R24
(0065) }
0118 9508 RET
(0066) }
(0067)
(0068) int getchar_kb(void)
(0069) {
(0070) int byte;
(0071) while(buffcnt == 0); // Wait for data
_getchar_kb:
byte --> R16
0119 90200064 LDS R2,buffcnt
011B 2022 TST R2
011C F3E1 BEQ 0x0119
(0072)
(0073) byte = *outpt; // Get byte
011D 91E00065 LDS R30,outpt
011F 91F00066 LDS R31,outpt+1
0121 8100 LDD R16,Z+0
0122 2711 CLR R17
(0074) outpt++; // Increment pointer
0123 01CF MOVW R24,R30
0124 9601 ADIW R24,1
0125 93900066 STS outpt+1,R25
0127 93800065 STS outpt,R24
(0075)
(0076) if (outpt >= kb_buffer + BUFF_SIZE) // Pointer wrapping
0129 EA89 LDI R24,0xA9
012A E090 LDI R25,0
012B 90200065 LDS R2,outpt
012D 90300066 LDS R3,outpt+1
012F 1628 CP R2,R24
0130 0639 CPC R3,R25
0131 F030 BCS 0x0138
(0077) outpt = kb_buffer;
0132 E689 LDI R24,0x69
0133 E090 LDI R25,0
0134 93900066 STS outpt+1,R25
0136 93800065 STS outpt,R24
(0078)
(0079) buffcnt--; // Decrement buffer count
0138 91800064 LDS R24,buffcnt
013A 5081 SUBI R24,1
013B 93800064 STS buffcnt,R24
(0080)
(0081) return byte;
013D 9508 RET
_print_hexbyte:
l --> R20
h --> R22
i --> R20
013E 940E0281 CALL push_gset2
0140 2F40 MOV R20,R16
(0082) }
(0083)
(0084) void print_hexbyte(unsigned char i) //???
(0085) {
(0086) unsigned char h, l;
(0087)
(0088) h = i & 0xF0; // High nibble
0141 2F64 MOV R22,R20
0142 7F60 ANDI R22,0xF0
(0089) h = h>>4;
0143 2F86 MOV R24,R22
0144 9582 SWAP R24
0145 708F ANDI R24,0xF
0146 2F68 MOV R22,R24
(0090) h = h + '0';
0147 5D60 SUBI R22,0xD0
(0091)
(0092) if (h > '9')
0148 E389 LDI R24,0x39
0149 1786 CP R24,R22
014A F408 BCC 0x014C
(0093) h = h + 7;
014B 5F69 SUBI R22,0xF9
(0094)
(0095) l = (i & 0x0F)+'0'; // Low nibble
014C 2F84 MOV R24,R20
014D 708F ANDI R24,0xF
014E 5D80 SUBI R24,0xD0
014F 2F48 MOV R20,R24
(0096) if (l > '9')
0150 E389 LDI R24,0x39
0151 1784 CP R24,R20
0152 F408 BCC 0x0154
(0097) l = l + 7;
0153 5F49 SUBI R20,0xF9
(0098)
(0099) put_kbbuff(h);
0154 2F06 MOV R16,R22
0155 DF9C RCALL _put_kbbuff
(0100) put_kbbuff(l);
0156 2F04 MOV R16,R20
0157 DF9A RCALL _put_kbbuff
0158 940E0278 CALL pop_gset2
015A 9508 RET
_decode:
i --> R22
sc --> R20
015B 940E0281 CALL push_gset2
015D 2F40 MOV R20,R16
(0101) }
(0102)
(0103) void decode(unsigned char sc)
(0104) {
(0105) static unsigned char is_up=0, shift = 0, mode = 0;
(0106) unsigned char i;
(0107)
(0108) if (!is_up) // Last data received was the up-key identifier
015E 90200060 LDS R2,is_up
0160 2022 TST R2
0161 F009 BEQ 0x0163
0162 C094 RJMP 0x01F7
(0109) {
(0110) switch (sc)
0163 2F64 MOV R22,R20
0164 2777 CLR R23
0165 3162 CPI R22,0x12
0166 E0E0 LDI R30,0
0167 077E CPC R23,R30
0168 F0D9 BEQ 0x0184
0169 E182 LDI R24,0x12
016A E090 LDI R25,0
016B 1786 CP R24,R22
016C 0797 CPC R25,R23
016D F02C BLT 0x0173
016E 3065 CPI R22,5
016F E0E0 LDI R30,0
0170 077E CPC R23,R30
0171 F0D1 BEQ 0x018C
0172 C029 RJMP 0x019C
0173 3569 CPI R22,0x59
0174 E0E0 LDI R30,0
0175 077E CPC R23,R30
0176 F089 BEQ 0x0188
0177 3569 CPI R22,0x59
0178 E0E0 LDI R30,0
0179 077E CPC R23,R30
017A F10C BLT 0x019C
017B 3F60 CPI R22,0xF0
017C E0E0 LDI R30,0
017D 077E CPC R23,R30
017E F009 BEQ 0x0180
017F C01C RJMP 0x019C
(0111) {
(0112) case 0xF0 : // The up-key identifier
(0113) is_up = 1;
0180 E081 LDI R24,1
0181 93800060 STS is_up,R24
(0114) break;
0183 C0A4 RJMP 0x0228
(0115)
(0116) case 0x12 : // Left SHIFT
(0117) shift = 1;
0184 E081 LDI R24,1
0185 93800061 STS shift,R24
(0118) break;
0187 C0A0 RJMP 0x0228
(0119)
(0120) case 0x59 : // Right SHIFT
(0121) shift = 1;
0188 E081 LDI R24,1
0189 93800061 STS shift,R24
(0122) break;
018B C09C RJMP 0x0228
(0123)
(0124) case 0x05 : // F1
(0125) if(mode == 0) mode = 1; // Enter scan code mode
018C 90200062 LDS R2,mode
018E 2022 TST R2
018F F419 BNE 0x0193
0190 E081 LDI R24,1
0191 93800062 STS mode,R24
(0126) if(mode == 2) mode = 3; // Leave scan code mode
0193 91800062 LDS R24,mode
0195 3082 CPI R24,2
0196 F009 BEQ 0x0198
0197 C090 RJMP 0x0228
0198 E083 LDI R24,3
0199 93800062 STS mode,R24
(0127) break;
019B C08C RJMP 0x0228
(0128)
(0129) default:
(0130) if(mode == 0 || mode == 3) // If ASCII mode
019C 90200062 LDS R2,mode
019E 2022 TST R2
019F F021 BEQ 0x01A4
01A0 2D82 MOV R24,R2
01A1 3083 CPI R24,3
01A2 F009 BEQ 0x01A4
01A3 C04E RJMP 0x01F2
(0131) {
(0132) if(!shift) // If shift is not pressed,
01A4 90200061 LDS R2,shift
01A6 2022 TST R2
01A7 F529 BNE 0x01CD
(0133) { // do a table look-up
(0134) for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);//???
01A8 2766 CLR R22
01A9 C001 RJMP 0x01AB
01AA 9563 INC R22
01AB E082 LDI R24,2
01AC 9F86 MUL R24,R22
01AD 01F0 MOVW R30,R0
01AE E584 LDI R24,0x54
01AF E090 LDI R25,0
01B0 0FE8 ADD R30,R24
01B1 1FF9 ADC R31,R25
01B2 9024 LPM R2,0(Z)
01B3 2433 CLR R3
01B4 1624 CP R2,R20
01B5 F011 BEQ 0x01B8
01B6 2022 TST R2
01B7 F791 BNE 0x01AA
(0135) if (unshifted[i][0] == sc) {
01B8 E082 LDI R24,2
01B9 9F86 MUL R24,R22
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -