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

📄 keyboard_int.lis

📁 在这个实例中
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 008C 0027              clr R16
 008E 09C0              rjmp L22
 0090           L23:
 0090                   .dbline 62
 0090           ; 
 0090           ;     Delay_ms(20);
 0090 04E1              ldi R16,20
 0092 10E0              ldi R17,0
 0094 B5DF              rcall _Delay_ms
 0096                   .dbline 64
 0096           ; 
 0096           ;     if (TmpKeyValue!=Key_Scan())
 0096 C4DF              rcall _Key_Scan
 0098 4017              cp R20,R16
 009A 11F0              breq L25
 009C                   .dbline 65
 009C           ;         return NoKey;
 009C 0027              clr R16
 009E 01C0              rjmp L22
 00A0           L25:
 00A0                   .dbline 67
 00A0           ; 
 00A0           ;     return TmpKeyValue;
 00A0 042F              mov R16,R20
 00A2                   .dbline -2
 00A2           L22:
 00A2 00D0              rcall pop_gset1
 00A4                   .dbline 0 ; func end
 00A4 0895              ret
 00A6                   .dbsym r TmpKeyValue 20 c
 00A6                   .dbend
                        .area vector(rom, abs)
                        .org 8
 0008 53C0              rjmp _pcint1_isr
                        .area text(rom, con, rel)
 00A6                   .dbfile D:\实例8_中断唤醒的键盘扫描_加入抗抖动\keyboard_int.c
 00A6                   .dbfunc e pcint1_isr _pcint1_isr fV
                        .even
 00A6           _pcint1_isr::
 00A6 8A93              st -y,R24
 00A8 8FB7              in R24,0x3f
 00AA 8A93              st -y,R24
 00AC                   .dbline -1
 00AC                   .dbline 73
 00AC           ; }
 00AC           ; 
 00AC           ; 
 00AC           ; #pragma interrupt_handler pcint1_isr: iv_PCINT1
 00AC           ; void pcint1_isr(void)                                    //引脚电平变化中断PCINT1中断服务函数
 00AC           ; {
 00AC                   .dbline 74
 00AC           ;     SMCR&=0xFE;                                          //禁止休眠功能,以免误触发
 00AC 83B7              in R24,0x33
 00AE 8E7F              andi R24,254
 00B0 83BF              out 0x33,R24
 00B2                   .dbline 75
 00B2           ;     PCMSK1&=(~((1<<PCINT11)|(1<<PCINT10)|(1<<PCINT9)));  //禁止引脚电平变化中断,以免影响键盘扫描程序的运行
 00B2 80916C00          lds R24,108
 00B6 817F              andi R24,241
 00B8 80936C00          sts 108,R24
 00BC                   .dbline 76
 00BC           ;     PCICR&=(~(1<<PCIE1));
 00BC 80916800          lds R24,104
 00C0 8D7F              andi R24,253
 00C2 80936800          sts 104,R24
 00C6                   .dbline -2
 00C6           L27:
 00C6 8991              ld R24,y+
 00C8 8FBF              out 0x3f,R24
 00CA 8991              ld R24,y+
 00CC                   .dbline 0 ; func end
 00CC 1895              reti
 00CE                   .dbend
 00CE                   .dbfunc e main _main fV
 00CE           ;     SleepTimer -> R20,R21
 00CE           ;       KeyValue -> R22
                        .even
 00CE           _main::
 00CE                   .dbline -1
 00CE                   .dbline 80
 00CE           ; }
 00CE           ; 
 00CE           ; void main (void)
 00CE           ; {
 00CE                   .dbline 81
 00CE           ;     unsigned char KeyValue=NoKey;
 00CE 6627              clr R22
 00D0                   .dbline 82
 00D0           ;     unsigned int SleepTimer=0;
 00D0 4427              clr R20
 00D2 5527              clr R21
 00D4                   .dbline 84
 00D4           ; 
 00D4           ;     DDRC=0xF1;                  //将键盘的"行"设置为输出,键盘的"列"设置为输入并开启了输入端的内部上拉电阻
 00D4 81EF              ldi R24,241
 00D6 87B9              out 0x7,R24
 00D8                   .dbline 85
 00D8           ;     DDRB=0xFF;
 00D8 8FEF              ldi R24,255
 00DA 84B9              out 0x4,R24
 00DC                   .dbline 86
 00DC           ;     DDRD=0xFF;
 00DC 8AB9              out 0xa,R24
 00DE                   .dbline 87
 00DE           ;     PORTC=0xFF;
 00DE 88B9              out 0x8,R24
 00E0                   .dbline 88
 00E0           ;     PORTB=0xFF;
 00E0 85B9              out 0x5,R24
 00E2                   .dbline 89
 00E2           ;     PORTD=0xFF;
 00E2 8BB9              out 0xb,R24
 00E4                   .dbline 91
 00E4           ; 
 00E4           ;     SEI();                     //允许全局中断
 00E4 7894              sei
 00E6                   .dbline 93
 00E6           ; 
 00E6           ;     LedDisPort=DisTab[0];      //上电后初始化显示"0"
 00E6 E0E0              ldi R30,<_DisTab
 00E8 F0E0              ldi R31,>_DisTab
 00EA E491              lpm R30,Z
 00EC EBB9              out 0xb,R30
 00EE 2AC0              rjmp L30
 00F0           L29:
 00F0                   .dbline 96
 00F0           ; 
 00F0           ;     while(1)
 00F0           ;     {
 00F0                   .dbline 97
 00F0           ;         KeyValue=Key_Scan_Ant_Dither();
 00F0 C7DF              rcall _Key_Scan_Ant_Dither
 00F2 602F              mov R22,R16
 00F4                   .dbline 98
 00F4           ;         if (KeyValue!=NoKey)                                            //当有按键按下时,显示该键的键值
 00F4 0023              tst R16
 00F6 59F0              breq L32
 00F8                   .dbline 99
 00F8           ;             {
 00F8                   .dbline 100
 00F8           ;                 LedDisPort=DisTab[KeyValue];
 00F8 80E0              ldi R24,<_DisTab
 00FA 90E0              ldi R25,>_DisTab
 00FC E62F              mov R30,R22
 00FE FF27              clr R31
 0100 E80F              add R30,R24
 0102 F91F              adc R31,R25
 0104 E491              lpm R30,Z
 0106 EBB9              out 0xb,R30
 0108                   .dbline 101
 0108           ;                 SleepTimer=0;                                           //并清0休眠计时器
 0108 4427              clr R20
 010A 5527              clr R21
 010C                   .dbline 102
 010C           ;             }
 010C 1BC0              rjmp L33
 010E           L32:
 010E                   .dbline 104
 010E           ;         else                                                            //当没有按键按下时,计算连续未操作的时间
 010E           ;             {
 010E                   .dbline 105
 010E           ;                 SleepTimer++;                                           //休眠计时器自加以实现计时
 010E 4F5F              subi R20,255  ; offset = 1
 0110 5F4F              sbci R21,255
 0112                   .dbline 106
 0112           ;                 if (SleepTimer >= 1500)                                  //当连续3秒钟(近似值)没有按任何按键时,将进入休眠状态
 0112 4C3D              cpi R20,220
 0114 E5E0              ldi R30,5
 0116 5E07              cpc R21,R30
 0118 A8F0              brlo L34
 011A                   .dbline 107
 011A           ;                 {
 011A                   .dbline 108
 011A           ;                     SleepTimer=0;                                       //清0休眠计时器,以便唤醒后继续计时
 011A 4427              clr R20
 011C 5527              clr R21
 011E                   .dbline 109
 011E           ;                     PORTC=0b11001111;                                   //将键盘的行(PC5,PC4)设置为输出"0"状态
 011E 8FEC              ldi R24,207
 0120 88B9              out 0x8,R24
 0122                   .dbline 110
 0122           ;                     PORTD=0x00;                                         //关闭数码管显示驱动以节省电能
 0122 2224              clr R2
 0124 2BB8              out 0xb,R2
 0126                   .dbline 111
 0126           ;                     PCMSK1|=((1<<PCINT11)|(1<<PCINT10)|(1<<PCINT9));    //使能PCINT9..11
 0126 80916C00          lds R24,108
 012A 8E60              ori R24,14
 012C 80936C00          sts 108,R24
 0130                   .dbline 112
 0130           ;                     PCICR|=(1<<PCIE1);                                  //使能第一组引脚电平变化中断
 0130 80916800          lds R24,104
 0134 8260              ori R24,2
 0136 80936800          sts 104,R24
 013A                   .dbline 113
 013A           ;                     SMCR=0x05;                                          //设置掉电状态并使能休眠功能
 013A 85E0              ldi R24,5
 013C 83BF              out 0x33,R24
 013E                   .dbline 114
 013E           ;                     asm("SLEEP");                                       //休眠单片机,进入掉电状态
 013E 8895              SLEEP
 0140                   .dbline 115
 0140           ;                     PORTC=0xFF;                                                                                       //休眠唤醒后将PC端口重置回初始化状态
 0140 8FEF              ldi R24,255
 0142 88B9              out 0x8,R24
 0144                   .dbline 116
 0144           ;                 }
 0144           L34:
 0144                   .dbline 117
 0144           ;             }                                 //End Of Else
 0144           L33:
 0144                   .dbline 118
 0144           L30:
 0144                   .dbline 95
 0144 D5CF              rjmp L29
 0146           X1:
 0146                   .dbline -2
 0146           L28:
 0146                   .dbline 0 ; func end
 0146 0895              ret
 0148                   .dbsym r SleepTimer 20 i
 0148                   .dbsym r KeyValue 22 c
 0148                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -