📄 read_key.lis
字号:
.module READ_KEY.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\asdf\MYDOCU~1\11111111111\READ_KEY.c
0000 .dbfunc e READ_KEY _READ_KEY fc
0000 ; pb_input -> y+0
0000 ; i -> R20,R21
0000 ; j -> R22,R23
.even
0000 _READ_KEY::
0000 00D0 rcall push_gset2
0002 EF97 sbiw R28,63
0004 6197 sbiw R28,17 ; offset = 80
0006 .dbline -1
0006 .dbline 16
0006 ; #include <iom8v.h>
0006 ; #include <macros.h>
0006 ; /////////////////////////////////////read_key
0006 ; #define sampling_times 2 //定义取样的次数,连续次数的取样值相同,视为有效取样。
0006 ; #define sampling_interval 10 //定义每次取样的时间间隔,单位 us.
0006 ; #define sapleing_way 8 //定义多少路采样。最大值为8。PB为输入.
0006 ; typedef struct
0006 ; { unsigned int v_last; //上一次sampling_times个取样值的结果
0006 ; unsigned int v_current; //当前sampling_times个取样值的结果
0006 ; unsigned int v[sampling_times]; //存放连续sampling_times次的取样值
0006 ; unsigned int v_temp; //存放比较的临时值,为1时有效,0时无效
0006 ; } inputStruct;
0006 ;
0006 ; void delay_nus(unsigned int n); //延时函数,单位 us.
0006 ; char READ_KEY(void) //主函数
0006 ; {
0006 .dbline 24
0006 ; unsigned int i;
0006 ; unsigned int j;
0006 ; inputStruct pb_input[sapleing_way];
0006 ;
0006 ;
0006 ;
0006 ; //以下的for循环,将连续sampling_times次的取样结果存放在相应的数组里
0006 ; for (i=0;i<sampling_times;i++)
0006 4427 clr R20
0008 5527 clr R21
000A 28C0 rjmp L6
000C L3:
000C .dbline 25
000C ; {
000C .dbline 26
000C ; delay_nus(sampling_interval); //每隔sampling_interval取样一次
000C 0AE0 ldi R16,10
000E 10E0 ldi R17,0
0010 83D0 rcall _delay_nus
0012 .dbline 27
0012 ; for(j=0;j<sapleing_way;j++)
0012 6627 clr R22
0014 7727 clr R23
0016 1CC0 rjmp L10
0018 L7:
0018 .dbline 28
0018 .dbline 29
0018 0AE0 ldi R16,10
001A 10E0 ldi R17,0
001C 9B01 movw R18,R22
001E 00D0 rcall empy16s
0020 1801 movw R2,R16
0022 CE01 movw R24,R28
0024 0496 adiw R24,4
0026 280E add R2,R24
0028 391E adc R3,R25
002A 02E0 ldi R16,2
002C 10E0 ldi R17,0
002E 9A01 movw R18,R20
0030 00D0 rcall empy16s
0032 F801 movw R30,R16
0034 E20D add R30,R2
0036 F31D adc R31,R3
0038 01E0 ldi R16,1
003A 10E0 ldi R17,0
003C 9B01 movw R18,R22
003E 00D0 rcall lsl16
0040 26B2 in R2,0x16
0042 3324 clr R3
0044 2022 and R2,R16
0046 3122 and R3,R17
0048 3182 std z+1,R3
004A 2082 std z+0,R2
004C .dbline 30
004C L8:
004C .dbline 27
004C 6F5F subi R22,255 ; offset = 1
004E 7F4F sbci R23,255
0050 L10:
0050 .dbline 27
0050 6830 cpi R22,8
0052 E0E0 ldi R30,0
0054 7E07 cpc R23,R30
0056 00F3 brlo L7
0058 .dbline 31
0058 L4:
0058 .dbline 24
0058 4F5F subi R20,255 ; offset = 1
005A 5F4F sbci R21,255
005C L6:
005C .dbline 24
005C 4230 cpi R20,2
005E E0E0 ldi R30,0
0060 5E07 cpc R21,R30
0062 A0F2 brlo L3
0064 .dbline 35
0064 ; {
0064 ; pb_input[j].v[i]=PINB&BIT(j);
0064 ; }
0064 ; }
0064 ;
0064 ;
0064 ; //以下的for循环,判断连续sampling_times次的取样结果是否有效
0064 ; for(j=0;j<sapleing_way;j++)
0064 6627 clr R22
0066 7727 clr R23
0068 4DC0 rjmp L15
006A L12:
006A .dbline 36
006A ; {
006A .dbline 37
006A ; for (i=1;i<sampling_times;i++)
006A 41E0 ldi R20,1
006C 50E0 ldi R21,0
006E 43C0 rjmp L19
0070 L16:
0070 .dbline 38
0070 ; {
0070 .dbline 39
0070 ; if (pb_input[j].v[i-1]==pb_input[j].v[i]) //如果sampling_times次取样结果均相同,视为有效
0070 0AE0 ldi R16,10
0072 10E0 ldi R17,0
0074 9B01 movw R18,R22
0076 00D0 rcall empy16s
0078 1801 movw R2,R16
007A CE01 movw R24,R28
007C 0496 adiw R24,4
007E 2101 movw R4,R2
0080 480E add R4,R24
0082 591E adc R5,R25
0084 02E0 ldi R16,2
0086 10E0 ldi R17,0
0088 9A01 movw R18,R20
008A 00D0 rcall empy16s
008C F801 movw R30,R16
008E E40D add R30,R4
0090 F51D adc R31,R5
0092 4080 ldd R4,z+0
0094 5180 ldd R5,z+1
0096 CE01 movw R24,R28
0098 0496 adiw R24,4
009A 280E add R2,R24
009C 391E adc R3,R25
009E 9A01 movw R18,R20
00A0 2150 subi R18,1
00A2 3040 sbci R19,0
00A4 02E0 ldi R16,2
00A6 10E0 ldi R17,0
00A8 00D0 rcall empy16s
00AA F801 movw R30,R16
00AC E20D add R30,R2
00AE F31D adc R31,R3
00B0 2080 ldd R2,z+0
00B2 3180 ldd R3,z+1
00B4 2414 cp R2,R4
00B6 3504 cpc R3,R5
00B8 71F4 brne L20
00BA .dbline 40
00BA ; pb_input[j].v_temp=1; //sampling_times次取样有效的标志
00BA 0AE0 ldi R16,10
00BC 10E0 ldi R17,0
00BE 9B01 movw R18,R22
00C0 00D0 rcall empy16s
00C2 F801 movw R30,R16
00C4 CE01 movw R24,R28
00C6 0896 adiw R24,8
00C8 E80F add R30,R24
00CA F91F adc R31,R25
00CC 81E0 ldi R24,1
00CE 90E0 ldi R25,0
00D0 9183 std z+1,R25
00D2 8083 std z+0,R24
00D4 0EC0 rjmp L21
00D6 L20:
00D6 .dbline 42
00D6 ; else //否则舍弃,不作处理。
00D6 ; {
00D6 .dbline 43
00D6 ; pb_input[j].v_temp=0; //sampling_times次取样无效,不作处理
00D6 0AE0 ldi R16,10
00D8 10E0 ldi R17,0
00DA 9B01 movw R18,R22
00DC 00D0 rcall empy16s
00DE F801 movw R30,R16
00E0 CE01 movw R24,R28
00E2 0896 adiw R24,8
00E4 E80F add R30,R24
00E6 F91F adc R31,R25
00E8 2224 clr R2
00EA 3324 clr R3
00EC 3182 std z+1,R3
00EE 2082 std z+0,R2
00F0 .dbline 44
00F0 ; break;
00F0 07C0 rjmp L18
00F2 L21:
00F2 .dbline 46
00F2 L17:
00F2 .dbline 37
00F2 4F5F subi R20,255 ; offset = 1
00F4 5F4F sbci R21,255
00F6 L19:
00F6 .dbline 37
00F6 4230 cpi R20,2
00F8 E0E0 ldi R30,0
00FA 5E07 cpc R21,R30
00FC 08F4 brsh X0
00FE B8CF rjmp L16
0100 X0:
0100 L18:
0100 .dbline 47
0100 L13:
0100 .dbline 35
0100 6F5F subi R22,255 ; offset = 1
0102 7F4F sbci R23,255
0104 L15:
0104 .dbline 35
0104 6830 cpi R22,8
0106 E0E0 ldi R30,0
0108 7E07 cpc R23,R30
010A 08F4 brsh X1
010C AECF rjmp L12
010E X1:
010E .dbline 48
010E ; }
010E ; }
010E ; }
010E ; return(PINB);
010E 06B3 in R16,0x16
0110 .dbline -2
0110 L2:
0110 EF96 adiw R28,63
0112 6196 adiw R28,17 ; offset = 80
0114 00D0 rcall pop_gset2
0116 .dbline 0 ; func end
0116 0895 ret
0118 .dbsym l pb_input 0 A[80:8]X
0118 .dbsym r i 20 i
0118 .dbsym r j 22 i
0118 .dbend
0118 .dbfunc e delay_nus _delay_nus fV
0118 ; i -> R20,R21
0118 ; n -> R16,R17
.even
0118 _delay_nus::
0118 00D0 rcall push_gset1
011A .dbline -1
011A .dbline 54
011A ;
011A ; } // end main()
011A ;
011A ;
011A ; void delay_nus(unsigned int n)//n微秒延时函数
011A ; {
011A .dbline 56
011A ; unsigned int i;
011A ; for (i=0;i<n;i++)
011A 4427 clr R20
011C 5527 clr R21
011E 03C0 rjmp L30
0120 L27:
0120 .dbline 57
0120 .dbline 58
0120 0000 nop
0122 .dbline 59
0122 L28:
0122 .dbline 56
0122 4F5F subi R20,255 ; offset = 1
0124 5F4F sbci R21,255
0126 L30:
0126 .dbline 56
0126 4017 cp R20,R16
0128 5107 cpc R21,R17
012A D0F3 brlo L27
012C .dbline -2
012C .dbline 60
012C ; {
012C ; asm("nop");
012C ; }
012C ; }
012C L26:
012C 00D0 rcall pop_gset1
012E .dbline 0 ; func end
012E 0895 ret
0130 .dbsym r i 20 i
0130 .dbsym r n 16 i
0130 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -