📄 kbscan.s
字号:
.module kbscan.c
.area lit(rom, con, rel)
_digital::
.byte 63,6
.byte 91,'O
.byte 'f,'m
.byte 125,7
.byte 127,'o
.byte 'w,124
.byte 57,94
.byte 'y,'q
.dbfile H:\嵌入式开发\单片机\Proj\4x4KeyBoard\kbscan.c
.dbsym e digital _digital A[16:16]kc
.area text(rom, con, rel)
.dbfile H:\嵌入式开发\单片机\Proj\4x4KeyBoard\kbscan.c
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 35
; /**************************************************************************
; Description:线翻转法键盘扫描程序,只检测和处理单键
;
; 4*4键盘排列:
; 0 1 2 3
; -----------------
; | 0 1 2 3 | 0
; | 4 5 6 7 | 1
; | 8 9 A B | 2
; | C D E F | 3
; -----------------
;
; Write by:杨震禹
; Time:2007-1-5
; ***************************************************************************/
; #include <iom8v.h>
; #include <macros.h>
;
; #define key_port PORTB //定义键盘接口
; #define port_DDR DDRB
; #define port_PIN PINB
; typedef unsigned int UINT;
; typedef unsigned char UCHAR;
;
; const UCHAR digital[16] =
; {
; 0x3f, 0x6, 0x5b, 0x4f, //0,1,2,3
; 0x66, 0x6d, 0x7d, 0x7, //4,5,6,7
; 0x7f, 0x6f, 0x77, 0x7c, //8,9,A,B
; 0x39, 0x5e, 0x79, 0x71 //C,D,E,F
; };
;
; /*延时程序*/
; void delay_1ms(void)
; {//1ms延时函数
.dbline 37
; UINT i;
; for(i=0; i<141; i++)
clr R16
clr R17
rjmp L5
L2:
.dbline 38
.dbline 38
L3:
.dbline 37
subi R16,255 ; offset = 1
sbci R17,255
L5:
.dbline 37
cpi R16,141
ldi R30,0
cpc R17,R30
brlo L2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay _delay fV
; i -> R20,R21
; n -> R22,R23
.even
_delay::
rcall push_gset2
movw R22,R16
.dbline -1
.dbline 42
; {}
; }
;
; void delay(UINT n)
; {//延时n毫秒
.dbline 44
; UINT i;
; for(i=0; i<n; i++) //执行n次1毫秒延时
clr R20
clr R21
rjmp L10
L7:
.dbline 45
rcall _delay_1ms
L8:
.dbline 44
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 44
cp R20,R22
cpc R21,R23
brlo L7
.dbline -2
L6:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e scan_init _scan_init fV
.even
_scan_init::
.dbline -1
.dbline 50
; delay_1ms();
; }
;
; /*键盘扫描*/
; void scan_init(void)
; {//初始化键盘扫描端口
.dbline 51
; key_port = 0xff;
ldi R24,255
out 0x18,R24
.dbline 52
; port_DDR = 0x0f; //高四位输入,开上拉电阻
ldi R24,15
out 0x17,R24
.dbline 53
; key_port = 0xf0; //低四位输出0
ldi R24,240
out 0x18,R24
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e scan_turn _scan_turn fV
.even
_scan_turn::
.dbline -1
.dbline 57
; }
;
; void scan_turn(void)
; {//端口输出翻转
.dbline 58
; key_port |= 0x0f;
in R24,0x18
ori R24,15
out 0x18,R24
.dbline 59
; port_DDR = 0xf0; //低四位输入,开上拉电阻
ldi R24,240
out 0x17,R24
.dbline 60
; key_port &= 0x0f; //高四位输出0
in R24,0x18
andi R24,15
out 0x18,R24
.dbline -2
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e kbscan _kbscan fc
; col -> R20
; row -> R22
.even
_kbscan::
rcall push_gset4
.dbline -1
.dbline 64
; }
;
; UCHAR kbscan(void)
; {
.dbline 66
; UCHAR row, col; //行、列坐标
; row = 4;
ldi R22,4
.dbline 67
; col = 4;
ldi R20,4
.dbline 68
; scan_init();
rcall _scan_init
.dbline 69
; if((port_PIN&0xf0)!=0xf0) { //有键按下
in R24,0x16
andi R24,240
cpi R24,240
brne X3
rjmp L14
X3:
.dbline 69
.dbline 70
; delay(5); //防抖
ldi R16,5
ldi R17,0
rcall _delay
.dbline 71
; if((port_PIN&0xf0)!=0xf0) {
in R24,0x16
andi R24,240
cpi R24,240
brne X4
rjmp L16
X4:
.dbline 71
.dbline 72
; row = (port_PIN&0xf0); //行值
in R22,0x16
andi R22,240
.dbline 74
;
; scan_turn(); //翻转
rcall _scan_turn
.dbline 76
;
; if((port_PIN&0x0f)!=0x0f)
in R24,0x16
andi R24,15
cpi R24,15
breq L18
.dbline 77
; col = (port_PIN&0x0f); //列值
in R20,0x16
andi R20,15
L18:
.dbline 80
;
; /*行坐标*/
; switch(row)
mov R10,R22
clr R11
movw R24,R10
cpi R24,176
ldi R30,0
cpc R25,R30
breq L25
ldi R24,176
cp R24,R10
cpc R25,R11
brlt L28
L27:
movw R24,R10
cpi R24,112
ldi R30,0
cpc R25,R30
breq L26
rjmp L20
L28:
movw R24,R10
cpi R24,208
ldi R30,0
cpc R25,R30
breq L24
cpi R24,208
ldi R30,0
cpc R25,R30
brlt L20
L29:
movw R24,R10
cpi R24,224
ldi R30,0
cpc R25,R30
breq L23
rjmp L20
X0:
.dbline 81
; {
L23:
.dbline 82
; case 0xe0: row = 0;
clr R22
.dbline 83
; break;
rjmp L21
L24:
.dbline 84
; case 0xd0: row = 1;
ldi R22,1
.dbline 85
; break;
rjmp L21
L25:
.dbline 86
; case 0xb0: row = 2;
ldi R22,2
.dbline 87
; break;
rjmp L21
L26:
.dbline 88
; case 0x70: row = 3;
ldi R22,3
.dbline 89
; break;
rjmp L21
L20:
.dbline 90
; default: row=4; //未知数值
ldi R22,4
.dbline 91
; }
L21:
.dbline 93
; /*列坐标*/
; switch(col)
mov R10,R20
clr R11
movw R24,R10
cpi R24,7
ldi R30,0
cpc R25,R30
breq L36
cpi R24,11
ldi R30,0
cpc R25,R30
breq L35
cpi R24,13
ldi R30,0
cpc R25,R30
breq L34
cpi R24,14
ldi R30,0
cpc R25,R30
breq L33
rjmp L30
X1:
.dbline 94
; {
L33:
.dbline 95
; case 0x0e: col = 0;
clr R20
.dbline 96
; break;
rjmp L31
L34:
.dbline 97
; case 0x0d: col = 1;
ldi R20,1
.dbline 98
; break;
rjmp L31
L35:
.dbline 99
; case 0x0b: col = 2;
ldi R20,2
.dbline 100
; break;
rjmp L31
L36:
.dbline 101
; case 0x07: col = 3;
ldi R20,3
.dbline 102
; break;
rjmp L31
L30:
.dbline 103
; default: col=4; //未知数值
ldi R20,4
.dbline 104
; }
L31:
.dbline 105
; }
L16:
.dbline 106
; }
L14:
.dbline 107
; if((row!=4)&(col!=4))
cpi R22,4
breq L39
ldi R24,1
ldi R25,0
movw R12,R24
rjmp L40
L39:
clr R12
clr R13
L40:
cpi R20,4
breq L41
ldi R24,1
ldi R25,0
movw R10,R24
rjmp L42
L41:
clr R10
clr R11
L42:
movw R2,R12
and R2,R10
and R3,R11
tst R2
brne X2
tst R3
breq L37
X2:
.dbline 108
; return row*4+col;
ldi R24,4
mul R24,R22
mov R16,R0
add R16,R20
rjmp L13
L37:
.dbline 109
; else return 16; //错误返回
ldi R16,16
.dbline -2
L13:
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r col 20 c
.dbsym r row 22 c
.dbend
.dbfunc e main _main fV
; key -> R20
.even
_main::
.dbline -1
.dbline 114
; }
;
; /*MAIN*/
; void main(void)
; {
.dbline 116
; UCHAR key;
; DDRD = 0xff;
ldi R24,255
out 0x11,R24
rjmp L45
L44:
.dbline 117
; while(1){
.dbline 118
; key = kbscan();
rcall _kbscan
mov R20,R16
.dbline 119
; if(key!=16)
cpi R16,16
breq L47
.dbline 120
; PORTD = ~digital[key]; //数码管输出相应数字
ldi R24,<_digital
ldi R25,>_digital
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
com R30
out 0x12,R30
L47:
.dbline 121
L45:
.dbline 117
rjmp L44
X5:
.dbline -2
L43:
.dbline 0 ; func end
ret
.dbsym r key 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -