?? pc_8535.lst
字號:
__start:
__text_start:
00A2 E5CF LDI R28,0x5F
00A3 E0D2 LDI R29,2
00A4 BFCD OUT P3D,R28
00A5 BFDE OUT P3E,R29
00A6 51C0 SUBI R28,0x10
00A7 40D0 SBCI R29,0
00A8 EA0A LDI R16,0xAA
00A9 8308 STD R16,0+Y
00AA 2400 CLR R0
00AB E7E1 LDI R30,0x71
00AC E0F0 LDI R31,0
00AD E010 LDI R17,0
00AE 3BE8 CPI R30,0xB8
00AF 07F1 CPC R31,R17
00B0 F011 BEQ 0x00B3
00B1 9201 ST R0,Z+
00B2 CFFB RJMP 0x00AE
00B3 8300 STD R16,0+Z
00B4 E3E2 LDI R30,0x32
00B5 E0F1 LDI R31,1
00B6 E6A0 LDI R26,0x60
00B7 E0B0 LDI R27,0
00B8 E011 LDI R17,1
00B9 34E3 CPI R30,0x43
00BA 07F1 CPC R31,R17
00BB F021 BEQ 0x00C0
00BC 95C8 LPM
00BD 9631 ADIW R30,1
00BE 920D ST R0,X+
00BF CFF9 RJMP 0x00B9
00C0 D0F6 RCALL _main
_exit:
00C1 CFFF RJMP _exit
FILE: D:\ICC-AVR\examples.sl\pc_8535\kbc.c
(0001) #include <io8535.h>
(0002) #include <macros.h>
(0003) #include "pindefs.h"
(0004) #include "scancodes.h"
(0005) #define BUFF_SIZE 64
(0006) //const ascii[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
(0007) // 0x39,0x41,0x42,0x43,0x44,0x45,0x46};
(0008) unsigned char bitcount;//PC鍵盤數據長度計數
(0009) unsigned char kb_buffer[BUFF_SIZE];//鍵盤緩沖區
(0010) unsigned char input=0;//緩沖區讀指針
(0011) unsigned char output=0;//緩沖區寫指針
(0012) //送鍵盤按鍵ASCII碼到鍵盤緩沖區
(0013) void put_kbbuff(unsigned char c)
(0014) {
(0015) kb_buffer[input]=c;
_put_kbbuff:
c --> R16
00C2 E785 LDI R24,0x75
00C3 E090 LDI R25,0
00C4 91E00060 LDS R30,0x60
00C6 27FF CLR R31
00C7 0FE8 ADD R30,R24
00C8 1FF9 ADC R31,R25
00C9 8300 STD R16,0+Z
(0016) if (input<(BUFF_SIZE-1))
00CA 91800060 LDS R24,0x60
00CC 338F CPI R24,0x3F
00CD F420 BCC 0x00D2
(0017) input++;
00CE 5F8F SUBI R24,0xFF
00CF 93800060 STS R24,0x60
00D1 C003 RJMP 0x00D5
(0018) else
(0019) input=0;
00D2 2422 CLR R2
00D3 92200060 STS R2,0x60
(0020) }
00D5 9508 RET
(0021) //從鍵盤緩沖區讀取按鍵的ASCII碼
(0022) unsigned char get_char(void)
(0023) {
(0024) unsigned char temp;
(0025) if(output==input)
_get_char:
temp --> R16
00D6 90200060 LDS R2,0x60
00D8 90300061 LDS R3,0x61
00DA 1432 CP R3,R2
00DB F411 BNE 0x00DE
(0026) return 0;
00DC 2700 CLR R16
00DD C013 RJMP 0x00F1
(0027) else
(0028) {
(0029) temp=kb_buffer[output];
00DE E785 LDI R24,0x75
00DF E090 LDI R25,0
00E0 91E00061 LDS R30,0x61
00E2 27FF CLR R31
00E3 0FE8 ADD R30,R24
00E4 1FF9 ADC R31,R25
00E5 8100 LDD R16,0+Z
(0030) if(output<(BUFF_SIZE-1))
00E6 91800061 LDS R24,0x61
00E8 338F CPI R24,0x3F
00E9 F420 BCC 0x00EE
(0031) {
(0032) output++;
00EA 5F8F SUBI R24,0xFF
00EB 93800061 STS R24,0x61
(0033) }
00ED C003 RJMP 0x00F1
(0034) else
(0035) output=0;
00EE 2422 CLR R2
00EF 92200061 STS R2,0x61
(0036) return temp;
00F1 9508 RET
(0037) }
(0038) }
(0039) //為運行讀取PC鍵盤程序進行初始化
(0040) void init_kb(void)
(0041) {
(0042) MCUCR=0x02;//設置8515的INT0為下降沿觸發中斷
_init_kb:
00F2 E082 LDI R24,2
00F3 BF85 OUT P35,R24
(0043) GIMSK|=(1<<INT0);//使能INT0中斷
00F4 B78B IN R24,P3B
00F5 6480 ORI R24,0x40
00F6 BF8B OUT P3B,R24
(0044) SEI(); //開中斷
00F7 9478 BSET 7
(0045) bitcount = 11;
00F8 E08B LDI R24,0xB
00F9 938000B5 STS R24,_bitcount
(0046) }
00FB 9508 RET
_decode:
i --> R20
sc --> R22
00FC D11A RCALL push_gset3
00FD 2F60 MOV R22,R16
(0047) //對PC鍵盤的掃描碼進行解碼
(0048) void decode(unsigned char sc)
(0049) {
(0050) static unsigned char shift,up,shiftup;
(0051) unsigned char i;
(0052) if (sc==0xf0)//按鍵釋放
00FE 3F60 CPI R22,0xF0
00FF F421 BNE 0x0104
(0053) {
(0054) up=1;
0100 E081 LDI R24,1
0101 93800072 STS R24,0x72
(0055) return;
0103 C06C RJMP 0x0170
(0056) }
(0057) if (up==1)//SHIF鍵開關
0104 91800072 LDS R24,0x72
0106 3081 CPI R24,1
0107 F501 BNE 0x0128
(0058) {
(0059) up=0;
0108 2422 CLR R2
0109 92200072 STS R2,0x72
(0060) if ((sc==0x12)|(sc==0x59)) shift=0;
010B 3162 CPI R22,0x12
010C F429 BNE 0x0112
010D E081 LDI R24,1
010E E090 LDI R25,0
010F 2EA8 MOV R10,R24
0110 2EB9 MOV R11,R25
0111 C002 RJMP 0x0114
0112 24AA CLR R10
0113 24BB CLR R11
0114 3569 CPI R22,0x59
0115 F419 BNE 0x0119
0116 E041 LDI R20,1
0117 E050 LDI R21,0
0118 C002 RJMP 0x011B
0119 2744 CLR R20
011A 2755 CLR R21
011B 2C2A MOV R2,R10
011C 2C3B MOV R3,R11
011D 2A24 OR R2,R20
011E 2A35 OR R3,R21
011F 2022 TST R2
0120 F419 BNE 0x0124
0121 2033 TST R3
0122 F409 BNE 0x0124
0123 C04C RJMP 0x0170
0124 2422 CLR R2
0125 92200071 STS R2,0x71
(0061) return;
0127 C048 RJMP 0x0170
(0062) }
(0063) switch (sc)
0128 2F46 MOV R20,R22
0129 2755 CLR R21
012A 3142 CPI R20,0x12
012B E0E0 LDI R30,0
012C 075E CPC R21,R30
012D F049 BEQ 0x0137
012E 3142 CPI R20,0x12
012F E0E0 LDI R30,0
0130 075E CPC R21,R30
0131 F03C BLT 0x0139
0132 3549 CPI R20,0x59
0133 E0E0 LDI R30,0
0134 075E CPC R21,R30
0135 F011 BEQ 0x0138
0136 C002 RJMP 0x0139
(0064) {
(0065) case 0x12:{//檢測左SHIF鍵
(0066) shift=1;
0137 D11F RCALL 0x0257
0138 D11E RCALL 0x0257
(0067) shiftup=1;
(0068) }
(0069) case 0x59:{//檢測右SHIF鍵
(0070) shift=1;
(0071) shiftup=1;
(0072) }
(0073) default:{
(0074) if (shift==0)
0139 90200071 LDS R2,0x71
013B 2022 TST R2
013C F009 BEQ 0x013E
013D C01A RJMP 0x0158
(0075) {
(0076) for(i = 0;unshifted[i][0]!=sc && unshifted[i][0]; i++);
013E 2744 CLR R20
013F C001 RJMP 0x0141
0140 9543 INC R20
0141 E282 LDI R24,0x22
0142 D103 RCALL <created procedures>
0143 2C20 MOV R2,R0
0144 2433 CLR R3
0145 2E46 MOV R4,R22
0146 2455 CLR R5
0147 1424 CP R2,R4
0148 0435 CPC R3,R5
0149 F021 BEQ 0x014E
014A 2022 TST R2
014B F7A1 BNE 0x0140
014C 2033 TST R3
014D F791 BNE 0x0140
(0077) if (unshifted[i][0] == sc)
014E E282 LDI R24,0x22
014F D0F6 RCALL <created procedures>
0150 1606 CP R0,R22
0151 F009 BEQ 0x0153
0152 C01D RJMP 0x0170
(0078) put_kbbuff(unshifted[i][1]);
0153 E283 LDI R24,0x23
0154 D0F1 RCALL <created procedures>
0155 2D00 MOV R16,R0
0156 DF6B RCALL _put_kbbuff
(0079) }
0157 C018 RJMP 0x0170
(0080) else
(0081) {
(0082) for(i = 0;shifted[i][0]!=sc && shifted[i][0]; i++);
0158 2744 CLR R20
0159 C001 RJMP 0x015B
015A 9543 INC R20
015B EA8A LDI R24,0xAA
015C D0E9 RCALL <created procedures>
015D 2C20 MOV R2,R0
015E 2433 CLR R3
015F 2E46 MOV R4,R22
0160 2455 CLR R5
0161 1424 CP R2,R4
0162 0435 CPC R3,R5
0163 F021 BEQ 0x0168
0164 2022 TST R2
0165 F7A1 BNE 0x015A
0166 2033 TST R3
0167 F791 BNE 0x015A
(0083) if (shifted[i][0] == sc)
0168 EA8A LDI R24,0xAA
0169 D0DC RCALL <created procedures>
016A 1606 CP R0,R22
016B F421 BNE 0x0170
(0084) {
(0085) put_kbbuff(shifted[i][1]);
016C EA8B LDI R24,0xAB
016D D0D8 RCALL <created procedures>
016E 2D00 MOV R16,R0
016F DF52 RCALL _put_kbbuff
(0086) }
(0087) }
(0088) }
(0089) }
(0090) }
0170 D0A9 RCALL pop_gset3
0171 9508 RET
_int0_isr:
0172 D05C RCALL push_lset
0173 D089 RCALL push_gset1
(0091) //鍵盤數據讀取程序
(0092) #pragma interrupt_handler int0_isr:2
(0093) void int0_isr(void)
(0094) {
(0095) static unsigned char data;
(0096) switch (bitcount)
0174 914000B5 LDS R20,_bitcount
0176 2755 CLR R21
0177 3041 CPI R20,1
0178 E0E0 LDI R30,0
0179 075E CPC R21,R30
017A F0A1 BEQ 0x018F
017B 3042 CPI R20,2
017C E0E0 LDI R30,0
017D 075E CPC R21,R30
017E F071 BEQ 0x018D
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -