📄 keyboard.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 + -