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

📄 read_key.lis

📁 一个新颖的乐器.我参加西电星火杯的作品.里面有详细的.doc说明
💻 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 + -