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

📄 mkey.lis

📁 基于AVR的四个独立键盘程序。是学习矩阵键盘的前奏
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module mkey.c
                        .area code(ram, con, rel)
                        .area lit(rom, con, rel)
 0000           _table::
 0000 3F00              .word 63
 0002 0600              .word 6
 0004 5B00              .word 91
 0006 4F00              .word 79
 0008 6600              .word 102
 000A 6D00              .word 109
 000C 7D00              .word 125
 000E 0700              .word 7
 0010 7F00              .word 127
 0012 6F00              .word 111
 0014 7700              .word 119
 0016 7C00              .word 124
 0018 3900              .word 57
 001A 5E00              .word 94
 001C 7900              .word 121
 001E 7100              .word 113
 0020 FF00              .word 255
 0022                   .dbfile I:\AVR视频教程\视频教程\lesson5\mkey\mkey.c
 0022                   .dbsym e table _table A[34:17]I
                        .area text(rom, con, rel)
 0000                   .dbfile I:\AVR视频教程\视频教程\lesson5\mkey\mkey.c
 0000                   .dbfunc e delay _delay fV
 0000           ;              i -> R20,R21
 0000           ;              j -> R22,R23
 0000           ;             ms -> R16,R17
                        .even
 0000           _delay::
 0000 00D0              rcall push_gset2
 0002                   .dbline -1
 0002                   .dbline 9
 0002           ; #include <iom16v.h>
 0002           ; #include <macros.h>
 0002           ; #define  uchar unsigned char
 0002           ; #define  uint  unsigned int
 0002           ; #pragma data:code 
 0002           ; const  table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
 0002           ;                          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0XFF};
 0002           ; void delay(uint ms)
 0002           ; {
 0002                   .dbline 11
 0002           ;         uint i,j;
 0002           ;       for(i=0;i<ms;i++)
 0002 4427              clr R20
 0004 5527              clr R21
 0006 0BC0              rjmp L5
 0008           L2:
 0008                   .dbline 12
 0008           ;          {
 0008                   .dbline 13
 0008 6627              clr R22
 000A 7727              clr R23
 000C 02C0              rjmp L9
 000E           L6:
 000E                   .dbline 13
 000E           L7:
 000E                   .dbline 13
 000E 6F5F              subi R22,255  ; offset = 1
 0010 7F4F              sbci R23,255
 0012           L9:
 0012                   .dbline 13
 0012 6537              cpi R22,117
 0014 E4E0              ldi R30,4
 0016 7E07              cpc R23,R30
 0018 D0F3              brlo L6
 001A                   .dbline 14
 001A           L3:
 001A                   .dbline 11
 001A 4F5F              subi R20,255  ; offset = 1
 001C 5F4F              sbci R21,255
 001E           L5:
 001E                   .dbline 11
 001E 4017              cp R20,R16
 0020 5107              cpc R21,R17
 0022 90F3              brlo L2
 0024                   .dbline -2
 0024                   .dbline 15
 0024           ;          for(j=0;j<1141;j++);
 0024           ;        }
 0024           ; }
 0024           L1:
 0024 00D0              rcall pop_gset2
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbsym r i 20 i
 0028                   .dbsym r j 22 i
 0028                   .dbsym r ms 16 i
 0028                   .dbend
 0028                   .dbfunc e show _show fV
 0028           ;              k -> R20
 0028           ;              j -> R22
                        .even
 0028           _show::
 0028 00D0              rcall push_gset2
 002A 422F              mov R20,R18
 002C 602F              mov R22,R16
 002E                   .dbline -1
 002E                   .dbline 17
 002E           ; void show(uchar j,uchar k)
 002E           ; {
 002E                   .dbline 18
 002E           ;         PORTA|=BIT(3);
 002E DB9A              sbi 0x1b,3
 0030                   .dbline 19
 0030           ;       PORTB=table[j];
 0030 80E0              ldi R24,<_table
 0032 90E0              ldi R25,>_table
 0034 062F              mov R16,R22
 0036 1127              clr R17
 0038 000F              lsl R16
 003A 111F              rol R17
 003C 080F              add R16,R24
 003E 191F              adc R17,R25
 0040 00D0              rcall lpm16
 0042 08BB              out 0x18,R16
 0044                   .dbline 20
 0044           ;       PORTA&=~BIT(3);
 0044 DB98              cbi 0x1b,3
 0046                   .dbline 22
 0046           ;       
 0046           ;       PORTB=0XFF;
 0046 8FEF              ldi R24,255
 0048 88BB              out 0x18,R24
 004A                   .dbline 23
 004A           ;       PORTB&=~BIT(k);
 004A 01E0              ldi R16,1
 004C 142F              mov R17,R20
 004E 00D0              rcall lsl8
 0050 202E              mov R2,R16
 0052 2094              com R2
 0054 38B2              in R3,0x18
 0056 3220              and R3,R2
 0058 38BA              out 0x18,R3
 005A                   .dbline 24
 005A           ;       PORTA|=BIT(4);
 005A DC9A              sbi 0x1b,4
 005C                   .dbline 25
 005C           ;       PORTA&=~BIT(4);
 005C DC98              cbi 0x1b,4
 005E                   .dbline 26
 005E           ;       delay(1);
 005E 01E0              ldi R16,1
 0060 10E0              ldi R17,0
 0062 CEDF              rcall _delay
 0064                   .dbline -2
 0064                   .dbline 27
 0064           ; }
 0064           L10:
 0064 00D0              rcall pop_gset2
 0066                   .dbline 0 ; func end
 0066 0895              ret
 0068                   .dbsym r k 20 c
 0068                   .dbsym r j 22 c
 0068                   .dbend
 0068                   .dbfunc e key_press _key_press fc
 0068           ;              i -> R16
                        .even
 0068           _key_press::
 0068                   .dbline -1
 0068                   .dbline 29
 0068           ; uchar key_press()
 0068           ; {
 0068                   .dbline 31
 0068           ;      uchar i;
 0068           ;      DDRD=0XFF;
 0068 8FEF              ldi R24,255
 006A 81BB              out 0x11,R24
 006C                   .dbline 32
 006C           ;        PORTD=0XF0;
 006C 80EF              ldi R24,240
 006E 82BB              out 0x12,R24
 0070                   .dbline 34
 0070           ;        
 0070           ;        DDRD=0X0F;
 0070 8FE0              ldi R24,15
 0072 81BB              out 0x11,R24
 0074                   .dbline 36
 0074           ;        
 0074           ;        i=PIND;
 0074 00B3              in R16,0x10
 0076                   .dbline 37
 0076           ;        if(i==0XF0)
 0076 003F              cpi R16,240
 0078 21F4              brne L12
 007A                   .dbline 38
 007A           ;        {
 007A                   .dbline 39
 007A           ;          DDRD=0XFF;
 007A 8FEF              ldi R24,255
 007C 81BB              out 0x11,R24
 007E                   .dbline 40
 007E           ;          return 0;
 007E 0027              clr R16
 0080 03C0              rjmp L11
 0082           L12:
 0082                   .dbline 43
 0082           ;        }
 0082           ;        else
 0082           ;        {
 0082                   .dbline 44
 0082           ;          DDRD=0XFF;
 0082 8FEF              ldi R24,255
 0084 81BB              out 0x11,R24
 0086                   .dbline 45
 0086           ;          return 1;
 0086 01E0              ldi R16,1
 0088                   .dbline -2
 0088           L11:
 0088                   .dbline 0 ; func end
 0088 0895              ret
 008A                   .dbsym r i 16 c
 008A                   .dbend
 008A                   .dbfunc e key_scan _key_scan fc
 008A           ;              j -> R22
 008A           ;            key -> R20
 008A           ;              i -> R10
                        .even
 008A           _key_scan::
 008A 00D0              rcall push_gset3
 008C                   .dbline -1
 008C                   .dbline 50
 008C           ;        }
 008C           ; }
 008C           ; 
 008C           ; uchar key_scan()
 008C           ; {
 008C                   .dbline 51
 008C           ;      uchar key,i=0X7F,j;
 008C 8FE7              ldi R24,127
 008E A82E              mov R10,R24
 0090                   .dbline 52
 0090           ;      delay(10);
 0090 0AE0              ldi R16,10
 0092 10E0              ldi R17,0
 0094 B5DF              rcall _delay
 0096                   .dbline 53
 0096           ;        if(key_press())
 0096 E8DF              rcall _key_press
 0098 0023              tst R16
 009A 09F4              brne X1
 009C 8FC0              rjmp L15
 009E           X1:
 009E                   .dbline 54
 009E           ;        {
 009E           L17:
 009E                   .dbline 56
 009E           ;           do
 009E           ;               {
 009E                   .dbline 57
 009E           ;                i=(i<<1|i>>7);
 009E 2A2C              mov R2,R10
 00A0 2694              lsr R2
 00A2 2694              lsr R2
 00A4 2694              lsr R2
 00A6 2694              lsr R2
 00A8 2694              lsr R2
 00AA 2694              lsr R2
 00AC 2694              lsr R2
 00AE 3A2C              mov R3,R10
 00B0 330C              lsl R3
 00B2 3228              or R3,R2
 00B4 A32C              mov R10,R3
 00B6                   .dbline 58
 00B6           ;                PORTD=i;
 00B6 32BA              out 0x12,R3
 00B8                   .dbline 59
 00B8           ;                DDRD=0X0F;
 00B8 8FE0              ldi R24,15
 00BA 81BB              out 0x11,R24
 00BC                   .dbline 61
 00BC           ;                
 00BC           ;                key=PIND;
 00BC 40B3              in R20,0x10
 00BE                   .dbline 62
 00BE           ;                j=key&0XF0;
 00BE 642F              mov R22,R20
 00C0 607F              andi R22,240
 00C2                   .dbline 64
 00C2           L18:
 00C2                   .dbline 64
 00C2           ;                
 00C2           ;           }while(j==0XF0);
 00C2 603F              cpi R22,240
 00C4 61F3              breq L17
 00C6           L20:
 00C6                   .dbline 66
 00C6           L21:
 00C6                   .dbline 66
 00C6           ;               
 00C6           ;               while(key_press());
 00C6 D0DF              rcall _key_press
 00C8 0023              tst R16
 00CA E9F7              brne L20
 00CC                   .dbline 67
 00CC           ;               switch(key)
 00CC 642F              mov R22,R20
 00CE 7727              clr R23
 00D0 673B              cpi R22,183
 00D2 E0E0              ldi R30,0
 00D4 7E07              cpc R23,R30
 00D6 09F4              brne X2
 00D8 6BC0              rjmp L40
 00DA           X2:
 00DA 6B3B              cpi R22,187
 00DC E0E0              ldi R30,0
 00DE 7E07              cpc R23,R30

⌨️ 快捷键说明

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