📄 intkey.lst
字号:
(0068) delay_us(1);
00BE E001 LDI R16,1
00BF E010 LDI R17,0
00C0 DF77 RCALL _delay_us
(0069) temp1=PINC;
00C1 B363 IN R22,0x13
(0070) temp1&=0x07;
00C2 7067 ANDI R22,7
(0071) switch(temp1)
00C3 2777 CLR R23
00C4 3063 CPI R22,3
00C5 E0E0 LDI R30,0
00C6 077E CPC R23,R30
00C7 F069 BEQ 0x00D5
00C8 3065 CPI R22,5
00C9 E0E0 LDI R30,0
00CA 077E CPC R23,R30
00CB F039 BEQ 0x00D3
00CC 3066 CPI R22,6
00CD E0E0 LDI R30,0
00CE 077E CPC R23,R30
00CF F009 BEQ 0x00D1
00D0 C006 RJMP 0x00D7
(0072) {
(0073) case 0x06: key=0x03;
00D1 E043 LDI R20,3
(0074) break;
00D2 C005 RJMP 0x00D8
(0075) case 0x05: key=0x06;
00D3 E046 LDI R20,6
(0076) break;
00D4 C003 RJMP 0x00D8
(0077) case 0x03: key=0x09;
00D5 E049 LDI R20,0x9
(0078) break;
00D6 C001 RJMP 0x00D8
(0079) default: key=0;
00D7 2744 CLR R20
(0080) break;
(0081) }
(0082) DDRC=0X07;
00D8 E087 LDI R24,7
00D9 BB84 OUT 0x14,R24
(0083) PORTC=0X38;
00DA E388 LDI R24,0x38
00DB BB85 OUT 0x15,R24
(0084) break;
00DC C001 RJMP 0x00DE
(0085) default:
(0086) key=0;
00DD 2744 CLR R20
(0087) break;
(0088) }
(0089) return (key);
00DE 2F04 MOV R16,R20
00DF D060 RCALL pop_gset3
00E0 9508 RET
_int_fun:
00E1 938A ST R24,-Y
00E2 B78F IN R24,0x3F
00E3 938A ST R24,-Y
(0090) }
(0091)
(0092) #pragma interrupt_handler int_fun:2
(0093) void int_fun(void)
(0094) {
(0095) KeyDown=1; //在中断中仅设置一个标志
00E4 E081 LDI R24,1
00E5 93800060 STS _KeyDown,R24
(0096) }
00E7 9189 LD R24,Y+
00E8 BF8F OUT 0x3F,R24
00E9 9189 LD R24,Y+
00EA 9518 RETI
_main:
num --> Y+0
keynum --> R20
temp --> R22
00EB 972A SBIW R28,0xA
(0097)
(0098) //主函数,扫描按键显示数据
(0099) void main()
(0100) {
(0101) unsigned char temp, keynum;
(0102) unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66,
00EC E286 LDI R24,0x26
00ED E090 LDI R25,0
00EE 01FE MOVW R30,R28
00EF E00A LDI R16,0xA
00F0 E010 LDI R17,0
00F1 93FA ST R31,-Y
00F2 93EA ST R30,-Y
00F3 939A ST R25,-Y
00F4 938A ST R24,-Y
00F5 D069 RCALL asgncblk
(0103) 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
(0104) //初始化端口
(0105) DDRB=0xFF; //设置B口为输出模式
00F6 EF8F LDI R24,0xFF
00F7 BB87 OUT 0x17,R24
(0106) PORTB=0xFF; //置高电平
00F8 BB88 OUT 0x18,R24
(0107) DDRC=0X07;
00F9 E087 LDI R24,7
00FA BB84 OUT 0x14,R24
(0108) PORTC=0X38;
00FB E388 LDI R24,0x38
00FC BB85 OUT 0x15,R24
(0109) DDRD&=0x0F;
00FD B381 IN R24,0x11
00FE 708F ANDI R24,0xF
00FF BB81 OUT 0x11,R24
(0110) PORTD|=0xFC;
0100 B382 IN R24,0x12
0101 6F8C ORI R24,0xFC
0102 BB82 OUT 0x12,R24
(0111)
(0112) MCUCR=0x03; //INT0上升沿触发,INT1低电平有效
0103 E083 LDI R24,3
0104 BF85 OUT 0x35,R24
(0113) GICR|=0x40; //打开INT0中断
0105 B78B IN R24,0x3B
0106 6480 ORI R24,0x40
0107 BF8B OUT 0x3B,R24
(0114) GIFR=0xC0; //清除INT0、INT1中断标志位
0108 EC80 LDI R24,0xC0
0109 BF8A OUT 0x3A,R24
(0115)
(0116) KeyDown=0; //初始化全局变量
010A 2422 CLR R2
010B 92200060 STS _KeyDown,R2
(0117) SEI(); //打开全局中断
010D 9478 BSET 7
010E C02C RJMP 0x013B
(0118) while(1)
(0119) {
(0120) PORTB=0x40;
010F E480 LDI R24,0x40
0110 BB88 OUT 0x18,R24
(0121) if(KeyDown==1) //检测是否有按键按下
0111 91800060 LDS R24,_KeyDown
0113 3081 CPI R24,1
0114 F531 BNE 0x013B
(0122) {
(0123) GIFR&=0xCF; //关闭INT0中断
0115 B78A IN R24,0x3A
0116 7C8F ANDI R24,0xCF
0117 BF8A OUT 0x3A,R24
(0124) KeyDown=0;
0118 2422 CLR R2
0119 92200060 STS _KeyDown,R2
(0125) delay_ms(5);
011B E005 LDI R16,5
011C E010 LDI R17,0
011D DF2E RCALL _delay_ms
(0126) temp=PINC;
011E B363 IN R22,0x13
(0127) temp&=0x38;
011F 7368 ANDI R22,0x38
(0128) if(temp==0x38) //确认是否有按键按下
0120 3368 CPI R22,0x38
0121 F421 BNE 0x0126
(0129) {
(0130) GICR|=0x40; //打开INT0中断
0122 B78B IN R24,0x3B
0123 6480 ORI R24,0x40
0124 BF8B OUT 0x3B,R24
(0131) continue;
0125 C015 RJMP 0x013B
(0132) }
(0133) keynum=ScanKey();
0126 DF32 RCALL _ScanKey
0127 2F40 MOV R20,R16
(0134) PORTB=num[keynum];
0128 01CE MOVW R24,R28
0129 2FE4 MOV R30,R20
012A 27FF CLR R31
012B 0FE8 ADD R30,R24
012C 1FF9 ADC R31,R25
012D 8020 LDD R2,Z+0
012E BA28 OUT 0x18,R2
012F C002 RJMP 0x0132
(0135) while(temp!=0x38)
(0136) {
(0137) temp=PINC;
0130 B363 IN R22,0x13
(0138) temp&=0x38;
0131 7368 ANDI R22,0x38
0132 3368 CPI R22,0x38
0133 F7E1 BNE 0x0130
(0139) }
(0140) GICR|=0x40; //打开INT0中断
0134 B78B IN R24,0x3B
0135 6480 ORI R24,0x40
0136 BF8B OUT 0x3B,R24
(0141) DDRC=0X07;
0137 E087 LDI R24,7
0138 BB84 OUT 0x14,R24
(0142) PORTC=0X38;
0139 E388 LDI R24,0x38
013A BB85 OUT 0x15,R24
013B CFD3 RJMP 0x010F
(0143) }
(0144) }
(0145) }
FILE: <library>
013C 962A ADIW R28,0xA
013D 9508 RET
pop_gset2:
013E E0E2 LDI R30,2
013F C006 RJMP pop
pop_gset3:
0140 E0E4 LDI R30,4
0141 C004 RJMP pop
push_gset1:
0142 935A ST R21,-Y
0143 934A ST R20,-Y
0144 9508 RET
pop_gset1:
0145 E0E1 LDI R30,1
pop:
0146 9149 LD R20,Y+
0147 9159 LD R21,Y+
0148 FDE0 SBRC R30,0
0149 9508 RET
014A 9169 LD R22,Y+
014B 9179 LD R23,Y+
014C FDE1 SBRC R30,1
014D 9508 RET
014E 90A9 LD R10,Y+
014F 90B9 LD R11,Y+
0150 FDE2 SBRC R30,2
0151 9508 RET
0152 90C9 LD R12,Y+
0153 90D9 LD R13,Y+
0154 FDE3 SBRC R30,3
0155 9508 RET
0156 90E9 LD R14,Y+
0157 90F9 LD R15,Y+
0158 9508 RET
push_gset2:
0159 937A ST R23,-Y
015A 936A ST R22,-Y
015B CFE6 RJMP push_gset1
push_gset3:
015C 92BA ST R11,-Y
015D 92AA ST R10,-Y
015E CFFA RJMP push_gset2
asgncblk:
015F 93AA ST R26,-Y
0160 93BA ST R27,-Y
0161 93EA ST R30,-Y
0162 93FA ST R31,-Y
0163 920A ST R0,-Y
0164 81AF LDD R26,Y+7
0165 85B8 LDD R27,Y+8
0166 81ED LDD R30,Y+5
0167 81FE LDD R31,Y+6
0168 3000 CPI R16,0
0169 0701 CPC R16,R17
016A F031 BEQ 0x0171
016B 95C8 LPM
016C 920D ST R0,X+
016D 9631 ADIW R30,1
016E 5001 SUBI R16,1
016F 4010 SBCI R17,0
0170 CFF7 RJMP 0x0168
0171 9009 LD R0,Y+
0172 91F9 LD R31,Y+
0173 91E9 LD R30,Y+
0174 91B9 LD R27,Y+
0175 91A9 LD R26,Y+
0176 9624 ADIW R28,4
0177 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -