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

📄 keypad.lis

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

⌨️ 快捷键说明

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