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

📄 keyboard.lis

📁 一个关于AVR单片机的例程
💻 LIS
字号:
                        .module keyboard.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\桌面\教程\keyboard\keyboard.c
 0000                   .dbfunc e key_scan _key_scan fc
 0000           ;            key -> R20
 0000           ;           temp -> R22
                        .even
 0000           _key_scan::
 0000 0E940000          xcall push_gset2
 0004                   .dbline -1
 0004                   .dbline 16
 0004           ; /**************************************
 0004           ; ** Filename: keyboard.c
 0004           ; ** Describe: 矩阵键盘程序
 0004           ; ** Author : 古欣 www.avrvi.com
 0004           ; ** Time  :   2007-2-15
 0004           ; **************************************/
 0004           ; 
 0004           ; #include "config.h"
 0004           ; 
 0004           ; /**************************************
 0004           ; ** 说明:线翻转法进行键盘扫描
 0004           ; ** 输出:获得高低位的扫描值
 0004           ; ** 有键时需要耗时 14ms
 0004           ; **************************************/
 0004           ; unsigned char key_scan(void)
 0004           ; {
 0004                   .dbline 17
 0004           ;  unsigned char temp=0,key=0;
 0004 6627              clr R22
 0006                   .dbline 17
 0006 4427              clr R20
 0008                   .dbline 18
 0008           ;  KEY_DDR  = 0xF0;  //高四位输出0,键按下,则对应的值为0
 0008 80EF              ldi R24,240
 000A 8ABB              out 0x1a,R24
 000C                   .dbline 19
 000C           ;  KEY_PORT = 0x0F;  //低四位输入,内部电阻上拉,没有键按下时为高
 000C 8FE0              ldi R24,15
 000E 8BBB              out 0x1b,R24
 0010                   .dbline 20
 0010           ;  temp = KEY_PIN&0x0F;//与掉高四位
 0010 69B3              in R22,0x19
 0012 6F70              andi R22,15
 0014                   .dbline 21
 0014           ;  if(temp==0x0F)
 0014 6F30              cpi R22,15
 0016 11F4              brne L2
 0018                   .dbline 22
 0018           ;  {
 0018                   .dbline 23
 0018           ;   return 0; // 无按键返回
 0018 0027              clr R16
 001A 1FC0              xjmp L1
 001C           L2:
 001C                   .dbline 26
 001C           ;  }
 001C           ;  else
 001C           ;  {
 001C                   .dbline 27
 001C           ;   delay_ms(10);
 001C 0AE0              ldi R16,10
 001E 10E0              ldi R17,0
 0020 0E940000          xcall _delay_ms
 0024                   .dbline 28
 0024           ;   temp = KEY_PIN&0x0F; //延时去抖后再检测
 0024 69B3              in R22,0x19
 0026 6F70              andi R22,15
 0028                   .dbline 29
 0028           ;   if(temp==0x0F)
 0028 6F30              cpi R22,15
 002A 11F4              brne L4
 002C                   .dbline 30
 002C           ;     return 0;
 002C 0027              clr R16
 002E 15C0              xjmp L1
 0030           L4:
 0030                   .dbline 32
 0030           ;   else
 0030           ;     key=temp; 
 0030 462F              mov R20,R22
 0032                   .dbline 33
 0032           ;  }
 0032                   .dbline 35
 0032           ;  //翻转
 0032           ;  KEY_DDR  = 0x0F;  //低四位输出0,键按下,则对应的值为0
 0032 8FE0              ldi R24,15
 0034 8ABB              out 0x1a,R24
 0036                   .dbline 36
 0036           ;  KEY_PORT = 0xF0;  //高四位输入,内部电阻上拉,没有键按下时为高
 0036 80EF              ldi R24,240
 0038 8BBB              out 0x1b,R24
 003A                   .dbline 37
 003A           ;  delay_ms(3);     //延时等待稳定
 003A 03E0              ldi R16,3
 003C 10E0              ldi R17,0
 003E 0E940000          xcall _delay_ms
 0042                   .dbline 39
 0042           ;  
 0042           ;  temp = KEY_PIN&0xF0;//与掉低四位
 0042 69B3              in R22,0x19
 0044 607F              andi R22,240
 0046                   .dbline 40
 0046           ;  if(temp==0xF0)
 0046 603F              cpi R22,240
 0048 11F4              brne L6
 004A                   .dbline 41
 004A           ;  {
 004A                   .dbline 42
 004A           ;   return 0; // 无按键返回
 004A 0027              clr R16
 004C 06C0              xjmp L1
 004E           L6:
 004E                   .dbline 45
 004E           ;  }
 004E           ;  else   //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作。
 004E           ;  {
 004E                   .dbline 46
 004E           ;     key |= temp; //高低位的键值进入KEY
 004E 462B              or R20,R22
 0050                   .dbline 47
 0050           ;  }
 0050                   .dbline 48
 0050           ;  KEY_DDR = 0x00;/*输出复位*/
 0050 2224              clr R2
 0052 2ABA              out 0x1a,R2
 0054                   .dbline 49
 0054           ;  KEY_PORT = 0xFF;
 0054 8FEF              ldi R24,255
 0056 8BBB              out 0x1b,R24
 0058                   .dbline 51
 0058           ; 
 0058           ;  return key;
 0058 042F              mov R16,R20
 005A                   .dbline -2
 005A           L1:
 005A 0E940000          xcall pop_gset2
 005E                   .dbline 0 ; func end
 005E 0895              ret
 0060                   .dbsym r key 20 c
 0060                   .dbsym r temp 22 c
 0060                   .dbend
 0060                   .dbfunc e get_key _get_key fc
 0060           ;              i -> R20
                        .even
 0060           _get_key::
 0060 0E940000          xcall push_gset1
 0064                   .dbline -1
 0064                   .dbline 61
 0064           ; }
 0064           ; 
 0064           ; 
 0064           ; /**************************************
 0064           ; ** 说明:获得键盘的值  
 0064           ; ** 内部调用函数key_scan
 0064           ; ** 输出:实际键值
 0064           ; **************************************/
 0064           ; unsigned char get_key(void)
 0064           ; {
 0064                   .dbline 62
 0064           ;  unsigned char i=0;
 0064 4427              clr R20
 0066                   .dbline 63
 0066           ;  i=key_scan();
 0066 CCDF              xcall _key_scan
 0068 402F              mov R20,R16
 006A                   .dbline 64
 006A           ;  switch (i) {/*将按键码转换成键值*/
 006A 5527              clr R21
 006C 473B              cpi R20,183
 006E E0E0              ldi R30,0
 0070 5E07              cpc R21,R30
 0072 09F4              brne X2
 0074 70C0              xjmp L24
 0076           X2:
 0076 4B3B              cpi R20,187
 0078 E0E0              ldi R30,0
 007A 5E07              cpc R21,R30
 007C 09F4              brne X3
 007E 69C0              xjmp L23
 0080           X3:
 0080 4D3B              cpi R20,189
 0082 E0E0              ldi R30,0
 0084 5E07              cpc R21,R30
 0086 09F4              brne X4
 0088 62C0              xjmp L22
 008A           X4:
 008A 4E3B              cpi R20,190
 008C E0E0              ldi R30,0
 008E 5E07              cpc R21,R30
 0090 09F4              brne X5
 0092 5BC0              xjmp L21
 0094           X5:
 0094 8EEB              ldi R24,190
 0096 90E0              ldi R25,0
 0098 8417              cp R24,R20
 009A 9507              cpc R25,R21
 009C F4F0              brlt L30
 009E           L29:
 009E 4030              cpi R20,0
 00A0 4507              cpc R20,R21
 00A2 09F4              brne X6
 00A4 40C0              xjmp L12
 00A6           X6:
 00A6           X0:
 00A6 4030              cpi R20,0
 00A8 E0E0              ldi R30,0
 00AA 5E07              cpc R21,R30
 00AC 0CF4              brge X7
 00AE 5DC0              xjmp L9
 00B0           X7:
 00B0           L31:
 00B0 4737              cpi R20,119
 00B2 E0E0              ldi R30,0
 00B4 5E07              cpc R21,R30
 00B6 09F4              brne X8
 00B8 56C0              xjmp L28
 00BA           X8:
 00BA 4B37              cpi R20,123
 00BC E0E0              ldi R30,0
 00BE 5E07              cpc R21,R30
 00C0 09F4              brne X9
 00C2 4FC0              xjmp L27
 00C4           X9:
 00C4 4D37              cpi R20,125
 00C6 E0E0              ldi R30,0
 00C8 5E07              cpc R21,R30
 00CA 09F4              brne X10
 00CC 48C0              xjmp L26
 00CE           X10:
 00CE 4E37              cpi R20,126
 00D0 E0E0              ldi R30,0
 00D2 5E07              cpc R21,R30
 00D4 09F4              brne X11
 00D6 41C0              xjmp L25
 00D8           X11:
 00D8 48C0              xjmp L9
 00DA           L30:
 00DA 473D              cpi R20,215
 00DC E0E0              ldi R30,0
 00DE 5E07              cpc R21,R30
 00E0 91F1              breq L20
 00E2 4B3D              cpi R20,219
 00E4 E0E0              ldi R30,0
 00E6 5E07              cpc R21,R30
 00E8 61F1              breq L19
 00EA 4D3D              cpi R20,221
 00EC E0E0              ldi R30,0
 00EE 5E07              cpc R21,R30
 00F0 31F1              breq L18
 00F2 4E3D              cpi R20,222
 00F4 E0E0              ldi R30,0
 00F6 5E07              cpc R21,R30
 00F8 01F1              breq L17
 00FA 473D              cpi R20,215
 00FC E0E0              ldi R30,0
 00FE 5E07              cpc R21,R30
 0100 0CF4              brge X12
 0102 33C0              xjmp L9
 0104           X12:
 0104           L32:
 0104 473E              cpi R20,231
 0106 E0E0              ldi R30,0
 0108 5E07              cpc R21,R30
 010A A9F0              breq L16
 010C 4B3E              cpi R20,235
 010E E0E0              ldi R30,0
 0110 5E07              cpc R21,R30
 0112 79F0              breq L15
 0114 4D3E              cpi R20,237
 0116 E0E0              ldi R30,0
 0118 5E07              cpc R21,R30
 011A 49F0              breq L14
 011C 4E3E              cpi R20,238
 011E E0E0              ldi R30,0
 0120 5E07              cpc R21,R30
 0122 19F0              breq L13
 0124 22C0              xjmp L9
 0126           X1:
 0126                   .dbline 64
 0126           L12:
 0126                   .dbline 65
 0126           ;   case  0x00: return 0x00;
 0126 0027              clr R16
 0128 21C0              xjmp L8
 012A           L13:
 012A                   .dbline 66
 012A           ;   case  0xEE: return '1';
 012A 01E3              ldi R16,49
 012C 1FC0              xjmp L8
 012E           L14:
 012E                   .dbline 67
 012E           ;   case  0xED: return '2';
 012E 02E3              ldi R16,50
 0130 1DC0              xjmp L8
 0132           L15:
 0132                   .dbline 68
 0132           ;   case  0xEB: return '3';
 0132 03E3              ldi R16,51
 0134 1BC0              xjmp L8
 0136           L16:
 0136                   .dbline 69
 0136           ;   case  0xE7: return 'A';
 0136 01E4              ldi R16,65
 0138 19C0              xjmp L8
 013A           L17:
 013A                   .dbline 70
 013A           ;   case  0xDE: return '4';
 013A 04E3              ldi R16,52
 013C 17C0              xjmp L8
 013E           L18:
 013E                   .dbline 71
 013E           ;   case  0xDD: return '5';
 013E 05E3              ldi R16,53
 0140 15C0              xjmp L8
 0142           L19:
 0142                   .dbline 72
 0142           ;   case  0xDB: return '6';
 0142 06E3              ldi R16,54
 0144 13C0              xjmp L8
 0146           L20:
 0146                   .dbline 73
 0146           ;   case  0xD7: return 'B';
 0146 02E4              ldi R16,66
 0148 11C0              xjmp L8
 014A           L21:
 014A                   .dbline 74
 014A           ;   case  0xBE: return '7';
 014A 07E3              ldi R16,55
 014C 0FC0              xjmp L8
 014E           L22:
 014E                   .dbline 75
 014E           ;   case  0xBD: return '8';
 014E 08E3              ldi R16,56
 0150 0DC0              xjmp L8
 0152           L23:
 0152                   .dbline 76
 0152           ;   case  0xBB: return '9';
 0152 09E3              ldi R16,57
 0154 0BC0              xjmp L8
 0156           L24:
 0156                   .dbline 77
 0156           ;   case  0xB7: return 'C';
 0156 03E4              ldi R16,67
 0158 09C0              xjmp L8
 015A           L25:
 015A                   .dbline 78
 015A           ;   case  0x7E: return '*';
 015A 0AE2              ldi R16,42
 015C 07C0              xjmp L8
 015E           L26:
 015E                   .dbline 79
 015E           ;   case  0x7D: return '0';
 015E 00E3              ldi R16,48
 0160 05C0              xjmp L8
 0162           L27:
 0162                   .dbline 80
 0162           ;   case  0x7B: return '#';
 0162 03E2              ldi R16,35
 0164 03C0              xjmp L8
 0166           L28:
 0166                   .dbline 81
 0166           ;   case  0x77: return 'D';
 0166 04E4              ldi R16,68
 0168 01C0              xjmp L8
 016A           L9:
 016A                   .dbline 82
 016A           ;   default : return 0x00;
 016A 0027              clr R16
 016C                   .dbline -2
 016C           L8:
 016C 0E940000          xcall pop_gset1
 0170                   .dbline 0 ; func end
 0170 0895              ret
 0172                   .dbsym r i 20 c
 0172                   .dbend

⌨️ 快捷键说明

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