📄 keyboard.lst
字号:
__start:
__text_start:
0034 E5CF LDI R28,0x5F
0035 E0D4 LDI R29,4
0036 BFCD OUT 0x3D,R28
0037 BFDE OUT 0x3E,R29
0038 51C0 SUBI R28,0x10
0039 40D0 SBCI R29,0
003A EA0A LDI R16,0xAA
003B 8308 STD Y+0,R16
003C 2400 CLR R0
003D E6E4 LDI R30,0x64
003E E0F0 LDI R31,0
003F E010 LDI R17,0
0040 36E5 CPI R30,0x65
0041 07F1 CPC R31,R17
0042 F011 BEQ 0x0045
0043 9201 ST R0,Z+
0044 CFFB RJMP 0x0040
0045 8300 STD Z+0,R16
0046 E6E4 LDI R30,0x64
0047 E0F0 LDI R31,0
0048 E6A0 LDI R26,0x60
0049 E0B0 LDI R27,0
004A E010 LDI R17,0
004B 36E8 CPI R30,0x68
004C 07F1 CPC R31,R17
004D F021 BEQ 0x0052
004E 95C8 LPM
004F 9631 ADIW R30,1
0050 920D ST R0,X+
0051 CFF9 RJMP 0x004B
0052 940E006D CALL _main
_exit:
0054 CFFF RJMP _exit
FILE: D:\桌面\interrupt_wake_keyboard_4-4\main.c
(0001) //ICC-AVR application builder : 2007-5-16 5:50:45
(0002) // Target : M16
(0003) // Crystal: 4.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) extern void delay_ms (int time);
(0008) void port_init(void)
(0009) {
(0010) PORTA = 0x00;
_port_init:
0055 2422 CLR R2
0056 BA2B OUT 0x1B,R2
(0011) DDRA = 0xFF;
0057 EF8F LDI R24,0xFF
0058 BB8A OUT 0x1A,R24
(0012) PORTB = 0xF0;
0059 EF80 LDI R24,0xF0
005A BB88 OUT 0x18,R24
(0013) DDRB = 0x0F;
005B E08F LDI R24,0xF
005C BB87 OUT 0x17,R24
(0014) PORTC = 0x80; //m103 output only
005D E880 LDI R24,0x80
005E BB85 OUT 0x15,R24
(0015) DDRC = 0x80;
005F BB84 OUT 0x14,R24
(0016) PORTD = 0x04;
0060 E084 LDI R24,4
0061 BB82 OUT 0x12,R24
(0017) DDRD = 0x00;
0062 BA21 OUT 0x11,R2
0063 9508 RET
(0018) }
(0019)
(0020) //call this routine to initialize all peripherals
(0021) void init_devices(void)
(0022) {
(0023) //stop errant interrupts until set up
(0024) CLI(); //disable all interrupts
_init_devices:
0064 94F8 BCLR 7
(0025) port_init();
0065 DFEF RCALL _port_init
(0026)
(0027) MCUCR = 0x00;
0066 2422 CLR R2
0067 BE25 OUT 0x35,R2
(0028) GICR = 0x40;
0068 E480 LDI R24,0x40
0069 BF8B OUT 0x3B,R24
(0029) TIMSK = 0x00; //timer interrupt sources
006A BE29 OUT 0x39,R2
(0030) SEI(); //re-enable interrupts
006B 9478 BSET 7
006C 9508 RET
(0031) //all peripherals are now initialized
(0032) }
(0033)
(0034)
(0035) const unsigned char table[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x77,0x1f,0x4e,0x3d,0x4f,0x47};
(0036) unsigned char position[]={0x80,0x80,0x80,0x80};
(0037) unsigned char key;
(0038) void main(void)
(0039) {
(0040)
(0041) init_devices();
_main:
006D DFF6 RCALL _init_devices
006E C009 RJMP 0x0078
(0042) while(1)
(0043) {
(0044) PORTA=table[key];
006F E584 LDI R24,0x54
0070 E090 LDI R25,0
0071 91E00064 LDS R30,key
0073 27FF CLR R31
0074 0FE8 ADD R30,R24
0075 1FF9 ADC R31,R25
0076 91E4 LPM R30,0(Z)
0077 BBEB OUT 0x1B,R30
0078 CFF6 RJMP 0x006F
0079 9508 RET
_scan_key:
007A 940E012C CALL push_lset
007C 940E0115 CALL push_gset1
(0045) }
(0046) }
(0047) /*
(0048) void main(void)
(0049) {
(0050) init_devices();
(0051) for(;;)
(0052) {
(0053) unsigned char i;
(0054) for(i=0;i<4;i++)
(0055) {PORTC|=position[i];
(0056) PORTA=table[key];
(0057) delay_ms(2);
(0058) }
(0059) }
(0060) }
(0061) #pragma interrupt_handler scan_key:2
(0062) void scan_key(void)
(0063) { CLI();
(0064) switch(PINB)
(0065) {
(0066) case 0x70:key=0;break;
(0067) case 0xb0:key=1;break;
(0068) case 0xd0:key=2;break;
(0069) case 0xe0:key=3;break;
(0070) }
(0071) PORTB=0x0F;
(0072) DDRB=0xF0;
(0073) delay_ms(1);
(0074) switch(PINB&0X0F)
(0075) {
(0076) case 0x07:key=key+0;break;
(0077) case 0x0b:key=key+4;break;
(0078) case 0x0d:key=key+8;break;
(0079) case 0x0e:key=key+12;break;
(0080) }
(0081) PORTB=0xF0;
(0082) DDRB=0x0F;
(0083) SEI();
(0084) }
(0085) */
(0086) #pragma interrupt_handler scan_key:2
(0087) void scan_key(void)
(0088) {
(0089) NOP();
007E 0000 NOP
(0090) NOP();
007F 0000 NOP
(0091) PORTB=0xF0;
0080 EF80 LDI R24,0xF0
0081 BB88 OUT 0x18,R24
(0092) DDRB=0x0F;
0082 E08F LDI R24,0xF
0083 BB87 OUT 0x17,R24
(0093) NOP();
0084 0000 NOP
(0094) if(PINB!=0xF0)
0085 B386 IN R24,0x16
0086 3F80 CPI R24,0xF0
0087 F409 BNE 0x0089
0088 C066 RJMP 0x00EF
(0095) {
(0096) delay_ms(10);
0089 E00A LDI R16,0xA
008A E010 LDI R17,0
008B 940E00FC CALL _delay_ms
(0097) if(PINB!=0xF0)
008D B386 IN R24,0x16
008E 3F80 CPI R24,0xF0
008F F409 BNE 0x0091
0090 C05E RJMP 0x00EF
(0098) {
(0099) //key=0;
(0100) switch(PINB)
0091 B346 IN R20,0x16
0092 2755 CLR R21
0093 3B40 CPI R20,0xB0
0094 E0E0 LDI R30,0
0095 075E CPC R21,R30
0096 F0D9 BEQ 0x00B2
0097 EB80 LDI R24,0xB0
0098 E090 LDI R25,0
0099 1784 CP R24,R20
009A 0795 CPC R25,R21
009B F02C BLT 0x00A1
009C 3740 CPI R20,0x70
009D E0E0 LDI R30,0
009E 075E CPC R21,R30
009F F071 BEQ 0x00AE
00A0 C01C RJMP 0x00BD
00A1 3D40 CPI R20,0xD0
00A2 E0E0 LDI R30,0
00A3 075E CPC R21,R30
00A4 F089 BEQ 0x00B6
00A5 3D40 CPI R20,0xD0
00A6 E0E0 LDI R30,0
00A7 075E CPC R21,R30
00A8 F0A4 BLT 0x00BD
00A9 3E40 CPI R20,0xE0
00AA E0E0 LDI R30,0
00AB 075E CPC R21,R30
00AC F069 BEQ 0x00BA
00AD C00F RJMP 0x00BD
(0101) {
(0102) case 0x70:key=0;break;
00AE 2422 CLR R2
00AF 92200064 STS key,R2
00B1 C00B RJMP 0x00BD
(0103) case 0xb0:key=1;break;
00B2 E081 LDI R24,1
00B3 93800064 STS key,R24
00B5 C007 RJMP 0x00BD
(0104) case 0xd0:key=2;break;
00B6 E082 LDI R24,2
00B7 93800064 STS key,R24
00B9 C003 RJMP 0x00BD
(0105) case 0xe0:key=3;break;
00BA E083 LDI R24,3
00BB 93800064 STS key,R24
(0106) default: break;
(0107) }
(0108) PORTB=0x0F;
00BD E08F LDI R24,0xF
00BE BB88 OUT 0x18,R24
(0109) DDRB=0xF0;
00BF EF80 LDI R24,0xF0
00C0 BB87 OUT 0x17,R24
(0110) NOP();
00C1 0000 NOP
(0111) switch(PINB&0X0F)
00C2 B346 IN R20,0x16
00C3 2755 CLR R21
00C4 704F ANDI R20,0xF
00C5 7050 ANDI R21,0
00C6 3047 CPI R20,7
00C7 E0E0 LDI R30,0
00C8 075E CPC R21,R30
00C9 F069 BEQ 0x00D7
00CA 304B CPI R20,0xB
00CB E0E0 LDI R30,0
00CC 075E CPC R21,R30
00CD F071 BEQ 0x00DC
00CE 304D CPI R20,0xD
00CF E0E0 LDI R30,0
00D0 075E CPC R21,R30
00D1 F081 BEQ 0x00E2
00D2 304E CPI R20,0xE
00D3 E0E0 LDI R30,0
00D4 075E CPC R21,R30
00D5 F091 BEQ 0x00E8
00D6 C016 RJMP 0x00ED
(0112) {
(0113) case 0x07:key=key+0;break;
00D7 90200064 LDS R2,key
00D9 92200064 STS key,R2
00DB C011 RJMP 0x00ED
(0114) case 0x0b:key=key+4;break;
00DC 91800064 LDS R24,key
00DE 5F8C SUBI R24,0xFC
00DF 93800064 STS key,R24
00E1 C00B RJMP 0x00ED
(0115) case 0x0d:key=key+8;break;
00E2 91800064 LDS R24,key
00E4 5F88 SUBI R24,0xF8
00E5 93800064 STS key,R24
00E7 C005 RJMP 0x00ED
(0116) case 0x0e:key=key+12;break;
00E8 91800064 LDS R24,key
00EA 5F84 SUBI R24,0xF4
00EB 93800064 STS key,R24
(0117) default: break;
(0118) }
(0119) NOP();
00ED 0000 NOP
(0120) NOP();
00EE 0000 NOP
(0121) }
(0122) }
00EF 940E0118 CALL pop_gset1
00F1 940E0143 CALL pop_lset
00F3 9518 RETI
FILE: D:\桌面\interrupt_wake_keyboard_4-4\delay.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) extern void delay_us (int time);
(0004) void delay_us (int time)//微秒级延时
(0005) {do
(0006) time--;
_delay_us:
time --> R16
00F4 5001 SUBI R16,1
00F5 4010 SBCI R17,0
(0007) while(time>0);
00F6 2422 CLR R2
00F7 2433 CLR R3
00F8 1620 CP R2,R16
00F9 0631 CPC R3,R17
00FA F3CC BLT 0x00F4
00FB 9508 RET
_delay_ms:
time --> R20
00FC 940E0115 CALL push_gset1
00FE 01A8 MOVW R20,R16
(0008) }
(0009) extern void delay_ms (int time)//毫秒级延时
(0010) {for(;time>0;time--)
00FF C005 RJMP 0x0105
(0011) delay_us(1000);
FILE: <library>
0100 EE08 LDI R16,0xE8
0101 E013 LDI R17,3
0102 DFF1 RCALL _delay_us
0103 5041 SUBI R20,1
0104 4050 SBCI R21,0
0105 2422 CLR R2
0106 2433 CLR R3
0107 1624 CP R2,R20
0108 0635 CPC R3,R21
0109 F3B4 BLT 0x0100
010A 940E0118 CALL pop_gset1
010C 9508 RET
push_gset5:
010D 92FA ST R15,-Y
010E 92EA ST R14,-Y
push_gset4:
010F 92DA ST R13,-Y
0110 92CA ST R12,-Y
push_gset3:
0111 92BA ST R11,-Y
0112 92AA ST R10,-Y
push_gset2:
0113 937A ST R23,-Y
0114 936A ST R22,-Y
push_gset1:
0115 935A ST R21,-Y
0116 934A ST R20,-Y
0117 9508 RET
pop_gset1:
0118 E0E1 LDI R30,1
pop:
0119 9149 LD R20,Y+
011A 9159 LD R21,Y+
011B FDE0 SBRC R30,0
011C 9508 RET
011D 9169 LD R22,Y+
011E 9179 LD R23,Y+
011F FDE1 SBRC R30,1
0120 9508 RET
0121 90A9 LD R10,Y+
0122 90B9 LD R11,Y+
0123 FDE2 SBRC R30,2
0124 9508 RET
0125 90C9 LD R12,Y+
0126 90D9 LD R13,Y+
0127 FDE3 SBRC R30,3
0128 9508 RET
0129 90E9 LD R14,Y+
012A 90F9 LD R15,Y+
012B 9508 RET
push_lset:
012C 93FA ST R31,-Y
012D 93EA ST R30,-Y
012E 93BA ST R27,-Y
012F 93AA ST R26,-Y
0130 939A ST R25,-Y
0131 938A ST R24,-Y
0132 933A ST R19,-Y
0133 932A ST R18,-Y
0134 931A ST R17,-Y
0135 930A ST R16,-Y
0136 929A ST R9,-Y
0137 928A ST R8,-Y
0138 927A ST R7,-Y
0139 926A ST R6,-Y
013A 925A ST R5,-Y
013B 924A ST R4,-Y
013C 923A ST R3,-Y
013D 922A ST R2,-Y
013E 921A ST R1,-Y
013F 920A ST R0,-Y
0140 B60F IN R0,0x3F
0141 920A ST R0,-Y
0142 9508 RET
pop_lset:
0143 9009 LD R0,Y+
0144 BE0F OUT 0x3F,R0
0145 9009 LD R0,Y+
0146 9019 LD R1,Y+
0147 9029 LD R2,Y+
0148 9039 LD R3,Y+
0149 9049 LD R4,Y+
014A 9059 LD R5,Y+
014B 9069 LD R6,Y+
014C 9079 LD R7,Y+
014D 9089 LD R8,Y+
014E 9099 LD R9,Y+
014F 9109 LD R16,Y+
0150 9119 LD R17,Y+
0151 9129 LD R18,Y+
0152 9139 LD R19,Y+
0153 9189 LD R24,Y+
0154 9199 LD R25,Y+
0155 91A9 LD R26,Y+
0156 91B9 LD R27,Y+
0157 91E9 LD R30,Y+
0158 91F9 LD R31,Y+
0159 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -