⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intkey.lis

📁 protues_atmeg8学习之:中断篇源代码
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -