📄 keyboard_int.lis
字号:
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 + -