📄 keyboard.s
字号:
.module keyboard.c
.area text(rom, con, rel)
.dbfile D:\桌面\教程\keyboard\keyboard.c
.dbfunc e key_scan _key_scan fc
; key -> R20
; temp -> R22
.even
_key_scan::
xcall push_gset2
.dbline -1
.dbline 16
; /**************************************
; ** Filename: keyboard.c
; ** Describe: 矩阵键盘程序
; ** Author : 古欣 www.avrvi.com
; ** Time : 2007-2-15
; **************************************/
;
; #include "config.h"
;
; /**************************************
; ** 说明:线翻转法进行键盘扫描
; ** 输出:获得高低位的扫描值
; ** 有键时需要耗时 14ms
; **************************************/
; unsigned char key_scan(void)
; {
.dbline 17
; unsigned char temp=0,key=0;
clr R22
.dbline 17
clr R20
.dbline 18
; KEY_DDR = 0xF0; //高四位输出0,键按下,则对应的值为0
ldi R24,240
out 0x1a,R24
.dbline 19
; KEY_PORT = 0x0F; //低四位输入,内部电阻上拉,没有键按下时为高
ldi R24,15
out 0x1b,R24
.dbline 20
; temp = KEY_PIN&0x0F;//与掉高四位
in R22,0x19
andi R22,15
.dbline 21
; if(temp==0x0F)
cpi R22,15
brne L2
.dbline 22
; {
.dbline 23
; return 0; // 无按键返回
clr R16
xjmp L1
L2:
.dbline 26
; }
; else
; {
.dbline 27
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline 28
; temp = KEY_PIN&0x0F; //延时去抖后再检测
in R22,0x19
andi R22,15
.dbline 29
; if(temp==0x0F)
cpi R22,15
brne L4
.dbline 30
; return 0;
clr R16
xjmp L1
L4:
.dbline 32
; else
; key=temp;
mov R20,R22
.dbline 33
; }
.dbline 35
; //翻转
; KEY_DDR = 0x0F; //低四位输出0,键按下,则对应的值为0
ldi R24,15
out 0x1a,R24
.dbline 36
; KEY_PORT = 0xF0; //高四位输入,内部电阻上拉,没有键按下时为高
ldi R24,240
out 0x1b,R24
.dbline 37
; delay_ms(3); //延时等待稳定
ldi R16,3
ldi R17,0
xcall _delay_ms
.dbline 39
;
; temp = KEY_PIN&0xF0;//与掉低四位
in R22,0x19
andi R22,240
.dbline 40
; if(temp==0xF0)
cpi R22,240
brne L6
.dbline 41
; {
.dbline 42
; return 0; // 无按键返回
clr R16
xjmp L1
L6:
.dbline 45
; }
; else //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作。
; {
.dbline 46
; key |= temp; //高低位的键值进入KEY
or R20,R22
.dbline 47
; }
.dbline 48
; KEY_DDR = 0x00;/*输出复位*/
clr R2
out 0x1a,R2
.dbline 49
; KEY_PORT = 0xFF;
ldi R24,255
out 0x1b,R24
.dbline 51
;
; return key;
mov R16,R20
.dbline -2
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r key 20 c
.dbsym r temp 22 c
.dbend
.dbfunc e get_key _get_key fc
; i -> R20
.even
_get_key::
xcall push_gset1
.dbline -1
.dbline 61
; }
;
;
; /**************************************
; ** 说明:获得键盘的值
; ** 内部调用函数key_scan
; ** 输出:实际键值
; **************************************/
; unsigned char get_key(void)
; {
.dbline 62
; unsigned char i=0;
clr R20
.dbline 63
; i=key_scan();
xcall _key_scan
mov R20,R16
.dbline 64
; switch (i) {/*将按键码转换成键值*/
clr R21
cpi R20,183
ldi R30,0
cpc R21,R30
brne X2
xjmp L24
X2:
cpi R20,187
ldi R30,0
cpc R21,R30
brne X3
xjmp L23
X3:
cpi R20,189
ldi R30,0
cpc R21,R30
brne X4
xjmp L22
X4:
cpi R20,190
ldi R30,0
cpc R21,R30
brne X5
xjmp L21
X5:
ldi R24,190
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L30
L29:
cpi R20,0
cpc R20,R21
brne X6
xjmp L12
X6:
X0:
cpi R20,0
ldi R30,0
cpc R21,R30
brge X7
xjmp L9
X7:
L31:
cpi R20,119
ldi R30,0
cpc R21,R30
brne X8
xjmp L28
X8:
cpi R20,123
ldi R30,0
cpc R21,R30
brne X9
xjmp L27
X9:
cpi R20,125
ldi R30,0
cpc R21,R30
brne X10
xjmp L26
X10:
cpi R20,126
ldi R30,0
cpc R21,R30
brne X11
xjmp L25
X11:
xjmp L9
L30:
cpi R20,215
ldi R30,0
cpc R21,R30
breq L20
cpi R20,219
ldi R30,0
cpc R21,R30
breq L19
cpi R20,221
ldi R30,0
cpc R21,R30
breq L18
cpi R20,222
ldi R30,0
cpc R21,R30
breq L17
cpi R20,215
ldi R30,0
cpc R21,R30
brge X12
xjmp L9
X12:
L32:
cpi R20,231
ldi R30,0
cpc R21,R30
breq L16
cpi R20,235
ldi R30,0
cpc R21,R30
breq L15
cpi R20,237
ldi R30,0
cpc R21,R30
breq L14
cpi R20,238
ldi R30,0
cpc R21,R30
breq L13
xjmp L9
X1:
.dbline 64
L12:
.dbline 65
; case 0x00: return 0x00;
clr R16
xjmp L8
L13:
.dbline 66
; case 0xEE: return '1';
ldi R16,49
xjmp L8
L14:
.dbline 67
; case 0xED: return '2';
ldi R16,50
xjmp L8
L15:
.dbline 68
; case 0xEB: return '3';
ldi R16,51
xjmp L8
L16:
.dbline 69
; case 0xE7: return 'A';
ldi R16,65
xjmp L8
L17:
.dbline 70
; case 0xDE: return '4';
ldi R16,52
xjmp L8
L18:
.dbline 71
; case 0xDD: return '5';
ldi R16,53
xjmp L8
L19:
.dbline 72
; case 0xDB: return '6';
ldi R16,54
xjmp L8
L20:
.dbline 73
; case 0xD7: return 'B';
ldi R16,66
xjmp L8
L21:
.dbline 74
; case 0xBE: return '7';
ldi R16,55
xjmp L8
L22:
.dbline 75
; case 0xBD: return '8';
ldi R16,56
xjmp L8
L23:
.dbline 76
; case 0xBB: return '9';
ldi R16,57
xjmp L8
L24:
.dbline 77
; case 0xB7: return 'C';
ldi R16,67
xjmp L8
L25:
.dbline 78
; case 0x7E: return '*';
ldi R16,42
xjmp L8
L26:
.dbline 79
; case 0x7D: return '0';
ldi R16,48
xjmp L8
L27:
.dbline 80
; case 0x7B: return '#';
ldi R16,35
xjmp L8
L28:
.dbline 81
; case 0x77: return 'D';
ldi R16,68
xjmp L8
L9:
.dbline 82
; default : return 0x00;
clr R16
.dbline -2
L8:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -