📄 intkey.lis
字号:
0108 .dbline 67
0108 ; PORTC=0X07;
0108 87E0 ldi R24,7
010A 85BB out 0x15,R24
010C .dbline 68
010C ; delay_us(1);
010C 01E0 ldi R16,1
010E 10E0 ldi R17,0
0110 77DF rcall _delay_us
0112 .dbline 69
0112 ; temp1=PINC;
0112 63B3 in R22,0x13
0114 .dbline 70
0114 ; temp1&=0x07;
0114 6770 andi R22,7
0116 .dbline 71
0116 ; switch(temp1)
0116 7727 clr R23
0118 6330 cpi R22,3
011A E0E0 ldi R30,0
011C 7E07 cpc R23,R30
011E 69F0 breq L39
0120 6530 cpi R22,5
0122 E0E0 ldi R30,0
0124 7E07 cpc R23,R30
0126 39F0 breq L38
0128 6630 cpi R22,6
012A E0E0 ldi R30,0
012C 7E07 cpc R23,R30
012E 09F0 breq L37
0130 06C0 rjmp L34
0132 X4:
0132 .dbline 72
0132 ; {
0132 L37:
0132 .dbline 73
0132 ; case 0x06: key=0x03;
0132 43E0 ldi R20,3
0134 .dbline 74
0134 ; break;
0134 05C0 rjmp L35
0136 L38:
0136 .dbline 75
0136 ; case 0x05: key=0x06;
0136 46E0 ldi R20,6
0138 .dbline 76
0138 ; break;
0138 03C0 rjmp L35
013A L39:
013A .dbline 77
013A ; case 0x03: key=0x09;
013A 49E0 ldi R20,9
013C .dbline 78
013C ; break;
013C 01C0 rjmp L35
013E L34:
013E .dbline 79
013E ; default: key=0;
013E 4427 clr R20
0140 .dbline 80
0140 ; break;
0140 L35:
0140 .dbline 82
0140 ; }
0140 ; DDRC=0X07;
0140 87E0 ldi R24,7
0142 84BB out 0x14,R24
0144 .dbline 83
0144 ; PORTC=0X38;
0144 88E3 ldi R24,56
0146 85BB out 0x15,R24
0148 .dbline 84
0148 ; break;
0148 01C0 rjmp L17
014A L16:
014A .dbline 86
014A ; default:
014A ; key=0;
014A 4427 clr R20
014C .dbline 87
014C ; break;
014C L17:
014C .dbline 89
014C ; }
014C ; return (key);
014C 042F mov R16,R20
014E .dbline -2
014E L15:
014E 00D0 rcall pop_gset3
0150 .dbline 0 ; func end
0150 0895 ret
0152 .dbsym r temp1 22 c
0152 .dbsym r key 20 c
0152 .dbsym r temp 20 c
0152 .dbend
.area vector(rom, abs)
.org 2
0002 A9C0 rjmp _int_fun
.area text(rom, con, rel)
0152 .dbfile F:\Learn\AVR\Pro_Mega8\中断\IntKey\IntKey.C
0152 .dbfunc e int_fun _int_fun fV
.even
0152 _int_fun::
0152 8A93 st -y,R24
0154 8FB7 in R24,0x3f
0156 8A93 st -y,R24
0158 .dbline -1
0158 .dbline 94
0158 ; }
0158 ;
0158 ; #pragma interrupt_handler int_fun:2
0158 ; void int_fun(void)
0158 ; {
0158 .dbline 95
0158 ; KeyDown=1; //在中断中仅设置一个标志
0158 81E0 ldi R24,1
015A 80930000 sts _KeyDown,R24
015E .dbline -2
015E .dbline 96
015E ; }
015E L42:
015E 8991 ld R24,y+
0160 8FBF out 0x3f,R24
0162 8991 ld R24,y+
0164 .dbline 0 ; func end
0164 1895 reti
0166 .dbend
.area lit(rom, con, rel)
0000 L44:
0000 3F06 .byte 63,6
0002 5B4F .byte 91,'O
0004 666D .byte 'f,'m
0006 7D07 .byte 125,7
0008 7F6F .byte 127,'o
.area text(rom, con, rel)
0166 .dbfile F:\Learn\AVR\Pro_Mega8\中断\IntKey\IntKey.C
0166 .dbfunc e main _main fV
0166 ; num -> y+0
0166 ; keynum -> R20
0166 ; temp -> R22
.even
0166 _main::
0166 2A97 sbiw R28,10
0168 .dbline -1
0168 .dbline 100
0168 ;
0168 ; //主函数,扫描按键显示数据
0168 ; void main()
0168 ; {
0168 .dbline 102
0168 ; unsigned char temp, keynum;
0168 ; unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66,
0168 80E0 ldi R24,<L44
016A 90E0 ldi R25,>L44
016C FE01 movw R30,R28
016E 0AE0 ldi R16,10
0170 10E0 ldi R17,0
0172 FA93 st -y,R31
0174 EA93 st -y,R30
0176 9A93 st -y,R25
0178 8A93 st -y,R24
017A 00D0 rcall asgncblk
017C .dbline 105
017C ; 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
017C ; //初始化端口
017C ; DDRB=0xFF; //设置B口为输出模式
017C 8FEF ldi R24,255
017E 87BB out 0x17,R24
0180 .dbline 106
0180 ; PORTB=0xFF; //置高电平
0180 88BB out 0x18,R24
0182 .dbline 107
0182 ; DDRC=0X07;
0182 87E0 ldi R24,7
0184 84BB out 0x14,R24
0186 .dbline 108
0186 ; PORTC=0X38;
0186 88E3 ldi R24,56
0188 85BB out 0x15,R24
018A .dbline 109
018A ; DDRD&=0x0F;
018A 81B3 in R24,0x11
018C 8F70 andi R24,15
018E 81BB out 0x11,R24
0190 .dbline 110
0190 ; PORTD|=0xFC;
0190 82B3 in R24,0x12
0192 8C6F ori R24,252
0194 82BB out 0x12,R24
0196 .dbline 112
0196 ;
0196 ; MCUCR=0x03; //INT0上升沿触发,INT1低电平有效
0196 83E0 ldi R24,3
0198 85BF out 0x35,R24
019A .dbline 113
019A ; GICR|=0x40; //打开INT0中断
019A 8BB7 in R24,0x3b
019C 8064 ori R24,64
019E 8BBF out 0x3b,R24
01A0 .dbline 114
01A0 ; GIFR=0xC0; //清除INT0、INT1中断标志位
01A0 80EC ldi R24,192
01A2 8ABF out 0x3a,R24
01A4 .dbline 116
01A4 ;
01A4 ; KeyDown=0; //初始化全局变量
01A4 2224 clr R2
01A6 20920000 sts _KeyDown,R2
01AA .dbline 117
01AA ; SEI(); //打开全局中断
01AA 7894 sei
01AC 2CC0 rjmp L46
01AE L45:
01AE .dbline 119
01AE ; while(1)
01AE ; {
01AE .dbline 120
01AE ; PORTB=0x40;
01AE 80E4 ldi R24,64
01B0 88BB out 0x18,R24
01B2 .dbline 121
01B2 ; if(KeyDown==1) //检测是否有按键按下
01B2 80910000 lds R24,_KeyDown
01B6 8130 cpi R24,1
01B8 31F5 brne L48
01BA .dbline 122
01BA ; {
01BA .dbline 123
01BA ; GIFR&=0xCF; //关闭INT0中断
01BA 8AB7 in R24,0x3a
01BC 8F7C andi R24,207
01BE 8ABF out 0x3a,R24
01C0 .dbline 124
01C0 ; KeyDown=0;
01C0 2224 clr R2
01C2 20920000 sts _KeyDown,R2
01C6 .dbline 125
01C6 ; delay_ms(5);
01C6 05E0 ldi R16,5
01C8 10E0 ldi R17,0
01CA 2EDF rcall _delay_ms
01CC .dbline 126
01CC ; temp=PINC;
01CC 63B3 in R22,0x13
01CE .dbline 127
01CE ; temp&=0x38;
01CE 6873 andi R22,56
01D0 .dbline 128
01D0 ; if(temp==0x38) //确认是否有按键按下
01D0 6833 cpi R22,56
01D2 21F4 brne L50
01D4 .dbline 129
01D4 ; {
01D4 .dbline 130
01D4 ; GICR|=0x40; //打开INT0中断
01D4 8BB7 in R24,0x3b
01D6 8064 ori R24,64
01D8 8BBF out 0x3b,R24
01DA .dbline 131
01DA ; continue;
01DA 15C0 rjmp L46
01DC L50:
01DC .dbline 133
01DC ; }
01DC ; keynum=ScanKey();
01DC 32DF rcall _ScanKey
01DE 402F mov R20,R16
01E0 .dbline 134
01E0 ; PORTB=num[keynum];
01E0 CE01 movw R24,R28
01E2 E42F mov R30,R20
01E4 FF27 clr R31
01E6 E80F add R30,R24
01E8 F91F adc R31,R25
01EA 2080 ldd R2,z+0
01EC 28BA out 0x18,R2
01EE 02C0 rjmp L53
01F0 L52:
01F0 .dbline 136
01F0 .dbline 137
01F0 63B3 in R22,0x13
01F2 .dbline 138
01F2 6873 andi R22,56
01F4 .dbline 139
01F4 L53:
01F4 .dbline 135
01F4 ; while(temp!=0x38)
01F4 6833 cpi R22,56
01F6 E1F7 brne L52
01F8 .dbline 140
01F8 ; {
01F8 ; temp=PINC;
01F8 ; temp&=0x38;
01F8 ; }
01F8 ; GICR|=0x40; //打开INT0中断
01F8 8BB7 in R24,0x3b
01FA 8064 ori R24,64
01FC 8BBF out 0x3b,R24
01FE .dbline 141
01FE ; DDRC=0X07;
01FE 87E0 ldi R24,7
0200 84BB out 0x14,R24
0202 .dbline 142
0202 ; PORTC=0X38;
0202 88E3 ldi R24,56
0204 85BB out 0x15,R24
0206 .dbline 143
0206 ; }
0206 L48:
0206 .dbline 144
0206 L46:
0206 .dbline 118
0206 D3CF rjmp L45
0208 X6:
0208 .dbline -2
0208 .dbline 145
0208 ; }
0208 ; }
0208 L43:
0208 2A96 adiw R28,10
020A .dbline 0 ; func end
020A 0895 ret
020C .dbsym l num 0 A[10:10]c
020C .dbsym r keynum 20 c
020C .dbsym r temp 22 c
020C .dbend
.area bss(ram, con, rel)
0000 .dbfile F:\Learn\AVR\Pro_Mega8\中断\IntKey\IntKey.C
0000 _KeyDown::
0000 .blkb 1
0001 .dbsym e KeyDown _KeyDown c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -