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

📄 keypad.lis

📁 双龙AVR-MEGA128开发板的配套源码
💻 LIS
字号:
                         .module keypad.c
                         .area text(rom, con, rel)
 0000                   .dbfile D:\ICC-AVR\Pc_At\keypad.c
 0000                   .dbfunc s scan_key _scan_key fI
                       ;          shift -> R10,R11
                       ;              i -> R20
                       ;           temp -> R12
                         .even
 0000                 _scan_key::
 0000 0E940000          xcall push_gset4
 0004                   .dbline -1
 0004                   .dbline 7
                       ; #include <iom103.h>
                       ; /*键盘扫描函数,没有键按下返回0x7f*/
                       ; /*如果shift按下,返回值最高位为1*/
                       ; extern delay_1ms(void);
                       ; void delay_ms(unsigned int n);
                       ; unsigned char scan_key(void)
                       ;    {
 0004                   .dbline 9
                       ;     unsigned char i,temp;
                       ;     unsigned shift=0;
 0004 AA24              clr R10
 0006 BB24              clr R11
 0008                   .dbline 10
                       ;     DDRB=0x0f;  
 0008 8FE0              ldi R24,15
 000A 87BB              out 0x17,R24
 000C                   .dbline 11
                       ;     PORTB=0xff;   
 000C 8FEF              ldi R24,255
 000E 88BB              out 0x18,R24
 0010                   .dbline 12
                       ;     for (i=0;i<4;i++)
 0010 4427              clr R20
 0012 77C0              xjmp L5
 0014                 L2:
 0014                   .dbline 13
                       ;         {
 0014                   .dbline 14
                       ;          PORTB=~(1<<i); //键盘线扫描
 0014 01E0              ldi R16,1
 0016 142F              mov R17,R20
 0018 0E940000          xcall lsl8
 001C 202E              mov R2,R16
 001E 2094              com R2
 0020 28BA              out 0x18,R2
 0022                   .dbline 15
                       ;          delay_1ms();   //等待低电平稳定
 0022 0E940000          xcall _delay_1ms
 0026                   .dbline 16
                       ;          temp=PINB&0xf0;//读取键盘扫描信号,屏蔽低四位
 0026 86B3              in R24,0x16
 0028 807F              andi R24,240
 002A C82E              mov R12,R24
 002C                   .dbline 17
                       ;          if ((PIND&0x20)==0) temp|=01;//检查shift键
 002C 8599              sbic 0x10,5
 002E 02C0              rjmp L6
 0030                   .dbline 17
 0030 8160              ori R24,1
 0032 C82E              mov R12,R24
 0034                 L6:
 0034                   .dbline 18
                       ;          if (temp!=0xf0)//如果有键按下,延时10ms消抖
 0034 8C2D              mov R24,R12
 0036 803F              cpi R24,240
 0038 09F4              brne X1
 003A 60C0              xjmp L8
 003C                 X1:
 003C                   .dbline 19
                       ;             {           //本程序用display代替10ms延时,
 003C                   .dbline 20
                       ;              delay_ms(5); //可消除显示抖动
 003C 05E0              ldi R16,5
 003E 10E0              ldi R17,0
 0040 0E940000          xcall _delay_ms
 0044                   .dbline 21
                       ;              temp=PINB&0xf0;//再读键盘
 0044 86B3              in R24,0x16
 0046 807F              andi R24,240
 0048 C82E              mov R12,R24
 004A                   .dbline 22
                       ;              if ((PIND&0x20)==0) //检查shift键
 004A 8599              sbic 0x10,5
 004C 06C0              rjmp L10
 004E                   .dbline 23
                       ;                 {
 004E                   .dbline 24
                       ;                  temp|=01;
 004E 8160              ori R24,1
 0050 C82E              mov R12,R24
 0052                   .dbline 25
                       ;                  shift=1;
 0052 81E0              ldi R24,1
 0054 90E0              ldi R25,0
 0056 A82E              mov R10,R24
 0058 B92E              mov R11,R25
 005A                   .dbline 26
                       ;                 }
 005A                 L10:
 005A                   .dbline 27
                       ;              if (temp!=0xf0)
 005A 8C2D              mov R24,R12
 005C 803F              cpi R24,240
 005E 09F4              brne X2
 0060 4DC0              xjmp L12
 0062                 X2:
 0062                   .dbline 28
                       ;                 {
 0062                   .dbline 29
                       ;                  temp&=0xf0;
 0062 807F              andi R24,240
 0064 C82E              mov R12,R24
 0066                   .dbline 30
                       ;                  switch (temp) //计算键值
 0066 6C2D              mov R22,R12
 0068 7727              clr R23
 006A 603B              cpi R22,176
 006C E0E0              ldi R30,0
 006E 7E07              cpc R23,R30
 0070 01F1              breq L18
 0072 80EB              ldi R24,176
 0074 90E0              ldi R25,0
 0076 8617              cp R24,R22
 0078 9707              cpc R25,R23
 007A 2CF0              brlt L22
 007C                 L21:
 007C 6037              cpi R22,112
 007E E0E0              ldi R30,0
 0080 7E07              cpc R23,R30
 0082 79F0              breq L17
 0084 2EC0              xjmp L14
 0086                 L22:
 0086 603D              cpi R22,208
 0088 E0E0              ldi R30,0
 008A 7E07              cpc R23,R30
 008C D1F0              breq L19
 008E 603D              cpi R22,208
 0090 E0E0              ldi R30,0
 0092 7E07              cpc R23,R30
 0094 0CF4              brge X3
 0096 25C0              xjmp L14
 0098                 X3:
 0098                 L23:
 0098 603E              cpi R22,224
 009A E0E0              ldi R30,0
 009C 7E07              cpc R23,R30
 009E C9F0              breq L20
 00A0 20C0              xjmp L14
 00A2                 X0:
 00A2                   .dbline 31
                       ;                      {
 00A2                 L17:
 00A2                   .dbline 32
                       ;                       case 0x70:temp=15-(3-i)*4;break;
 00A2 83E0              ldi R24,3
 00A4 841B              sub R24,R20
 00A6 880F              lsl R24
 00A8 880F              lsl R24
 00AA 9FE0              ldi R25,15
 00AC C92E              mov R12,R25
 00AE C81A              sub R12,R24
 00B0                   .dbline 32
 00B0 1AC0              xjmp L15
 00B2                 L18:
 00B2                   .dbline 33
                       ;                       case 0xb0:temp=14-(3-i)*4;break;
 00B2 83E0              ldi R24,3
 00B4 841B              sub R24,R20
 00B6 880F              lsl R24
 00B8 880F              lsl R24
 00BA 9EE0              ldi R25,14
 00BC C92E              mov R12,R25
 00BE C81A              sub R12,R24
 00C0                   .dbline 33
 00C0 12C0              xjmp L15
 00C2                 L19:
 00C2                   .dbline 34
                       ;                       case 0xd0:temp=13-(3-i)*4;break;
 00C2 83E0              ldi R24,3
 00C4 841B              sub R24,R20
 00C6 880F              lsl R24
 00C8 880F              lsl R24
 00CA 9DE0              ldi R25,13
 00CC C92E              mov R12,R25
 00CE C81A              sub R12,R24
 00D0                   .dbline 34
 00D0 0AC0              xjmp L15
 00D2                 L20:
 00D2                   .dbline 35
                       ;                       case 0xe0:temp=12-(3-i)*4;break;
 00D2 83E0              ldi R24,3
 00D4 841B              sub R24,R20
 00D6 880F              lsl R24
 00D8 880F              lsl R24
 00DA 9CE0              ldi R25,12
 00DC C92E              mov R12,R25
 00DE C81A              sub R12,R24
 00E0                   .dbline 35
 00E0 02C0              xjmp L15
 00E2                 L14:
 00E2                   .dbline 36
                       ;                       default:temp=0x7f;                     
 00E2 8FE7              ldi R24,127
 00E4 C82E              mov R12,R24
 00E6                   .dbline 37
                       ;                       }
 00E6                 L15:
 00E6                   .dbline 38
                       ;                  if (shift==1) temp|=0x80; 
 00E6 81E0              ldi R24,1
 00E8 90E0              ldi R25,0
 00EA A816              cp R10,R24
 00EC B906              cpc R11,R25
 00EE 19F4              brne L24
 00F0                   .dbline 38
 00F0 8C2D              mov R24,R12
 00F2 8068              ori R24,128
 00F4 C82E              mov R12,R24
 00F6                 L24:
 00F6                   .dbline 39
                       ;                  return temp;
 00F6 0C2D              mov R16,R12
 00F8 1127              clr R17
 00FA 08C0              xjmp L1
 00FC                 L12:
 00FC                   .dbline 41
                       ;                  }       
                       ;              }
 00FC                 L8:
 00FC                   .dbline 42
 00FC 8FEF              ldi R24,255
 00FE 88BB              out 0x18,R24
 0100                   .dbline 43
 0100                 L3:
 0100                   .dbline 12
 0100 4395              inc R20
 0102                 L5:
 0102                   .dbline 12
 0102 4430              cpi R20,4
 0104 08F4              brsh X4
 0106 86CF              xjmp L2
 0108                 X4:
 0108                   .dbline 44
                       ;          PORTB=0xff;     
                       ;         }
                       ;     return 0x7f;             
 0108 0FE7              ldi R16,127
 010A 10E0              ldi R17,0
 010C                   .dbline -2
 010C                 L1:
 010C 0E940000          xcall pop_gset4
 0110                   .dbline 0 ; func end
 0110 0895              ret
 0112                   .dbsym r shift 10 i
 0112                   .dbsym r i 20 c
 0112                   .dbsym r temp 12 c
 0112                   .dbfunc s keypad _keypad fI
                       ;          temp1 -> R20
                       ;          temp2 -> R22
                         .even
 0112                 _keypad::
 0112 0E940000          xcall push_gset2
 0116                   .dbline -1
 0116                   .dbline 47
                       ;     }
                       ; unsigned char keypad(void)
                       ;     {
 0116                   .dbline 49
                       ;      unsigned char temp1,temp2;
                       ;      temp1=scan_key();
 0116 74DF              xcall _scan_key
 0118 202E              mov R2,R16
 011A 312E              mov R3,R17
 011C 422D              mov R20,R2
 011E                   .dbline 50
                       ;      if (temp1==0x7f) return 0x7f;
 011E 4F37              cpi R20,127
 0120 19F4              brne L27
 0122                   .dbline 50
 0122 0FE7              ldi R16,127
 0124 10E0              ldi R17,0
 0126 08C0              xjmp L26
 0128                 L27:
 0128                 L29:
 0128                   .dbline 52
                       ;      do
                       ;        temp2=scan_key();
 0128 6BDF              xcall _scan_key
 012A 202E              mov R2,R16
 012C 312E              mov R3,R17
 012E 622D              mov R22,R2
 0130                 L30:
 0130                   .dbline 53
                       ;      while (temp1==temp2);
 0130 4617              cp R20,R22
 0132 D1F3              breq L29
 0134                   .dbline 54
                       ;      return temp1;   
 0134 042F              mov R16,R20
 0136 1127              clr R17
 0138                   .dbline -2
 0138                 L26:
 0138 0E940000          xcall pop_gset2
 013C                   .dbline 0 ; func end
 013C 0895              ret
 013E                   .dbsym r temp1 20 c
 013E                   .dbsym r temp2 22 c

⌨️ 快捷键说明

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