📄 getkey.s
字号:
.module getkey.c
.area text(rom, con, rel)
.dbfile E:\MYDOCU~1\ICCAVR_Directory\4x4keys\getkey.c
.dbfunc e main _main fV
; key -> R22
.even
_main::
.dbline -1
.dbline 29
; /*--------------------------------------------------------------------------------
; **工程名称:键盘扫描测试程序
; **编译器:ICCAVR6.31A pro
; **日期:2005.04.14
; **作者:neutronlmk
;
; **芯片类型:M16
; **时钟频率:外接4M
;
; ---------------------------------------------------------------------------------*/
; #include <iom16v.h>
; #include <macros.h>
;
; #define led_port PORTA
; #define led_port_ddr DDRA
; #define key_port PORTD
; #define key_port_ddr DDRD
; #define key_port_pin PIND
;
; /*------------------------------------函数声明----------------------------------*/
; signed char get_key(void);
; void delay_1us(void);
; void delay_nus(unsigned int n);
; void delay_1ms(void);
; void delay_nms(unsigned int n);
;
; /*----------------------------------主函数--------------------------------------*/
; void main(void)
; {
.dbline 31
; //端口初始化
; led_port_ddr=0xff;
ldi R24,255
out 0x1a,R24
.dbline 32
; led_port=0x00;
clr R2
out 0x1b,R2
.dbline 33
; key_port_ddr=0xf0;
ldi R24,240
out 0x11,R24
.dbline 34
; key_port=0xf0;
out 0x12,R24
xjmp L3
L2:
.dbline 38
;
; //死循环,获取键值,并在发光二极管上提示
; while(1)
; {
.dbline 40
; signed char key;
; key=get_key();
xcall _get_key
mov R22,R16
.dbline 41
; if(key!=0xff)
cpi R16,255
brne X3
xjmp L5
X3:
.dbline 42
; {
.dbline 43
; switch(key)
mov R20,R22
clr R21
sbrc R20,7
com R21
cpi R20,0
cpc R20,R21
breq L10
X0:
cpi R20,1
ldi R30,0
cpc R21,R30
breq L11
cpi R20,2
ldi R30,0
cpc R21,R30
breq L12
cpi R20,3
ldi R30,0
cpc R21,R30
breq L13
cpi R20,4
ldi R30,0
cpc R21,R30
breq L14
cpi R20,5
ldi R30,0
cpc R21,R30
breq L15
cpi R20,6
ldi R30,0
cpc R21,R30
breq L16
cpi R20,7
ldi R30,0
cpc R21,R30
breq L17
cpi R20,8
ldi R30,0
cpc R21,R30
breq L18
cpi R20,9
ldi R30,0
cpc R21,R30
breq L19
cpi R20,10
ldi R30,0
cpc R21,R30
breq L20
cpi R20,11
ldi R30,0
cpc R21,R30
breq L21
xjmp L8
X1:
.dbline 44
; {
L10:
.dbline 45
; case 0:led_port=0x01;break;
ldi R24,1
out 0x1b,R24
.dbline 45
xjmp L8
L11:
.dbline 46
; case 1:led_port=0x02;break;
ldi R24,2
out 0x1b,R24
.dbline 46
xjmp L8
L12:
.dbline 47
; case 2:led_port=0x04;break;
ldi R24,4
out 0x1b,R24
.dbline 47
xjmp L8
L13:
.dbline 48
; case 3:led_port=0x08;break;
ldi R24,8
out 0x1b,R24
.dbline 48
xjmp L8
L14:
.dbline 49
; case 4:led_port=0x10;break;
ldi R24,16
out 0x1b,R24
.dbline 49
xjmp L8
L15:
.dbline 50
; case 5:led_port=0x20;break;
ldi R24,32
out 0x1b,R24
.dbline 50
xjmp L8
L16:
.dbline 51
; case 6:led_port=0x40;break;
ldi R24,64
out 0x1b,R24
.dbline 51
xjmp L8
L17:
.dbline 52
; case 7:led_port=0x80;break;
ldi R24,128
out 0x1b,R24
.dbline 52
xjmp L8
L18:
.dbline 53
; case 8:led_port=0x03;break;
ldi R24,3
out 0x1b,R24
.dbline 53
xjmp L8
L19:
.dbline 54
; case 9:led_port=0x06;break;
ldi R24,6
out 0x1b,R24
.dbline 54
xjmp L8
L20:
.dbline 55
; case 10:led_port=0x0c;break;
ldi R24,12
out 0x1b,R24
.dbline 55
xjmp L8
L21:
.dbline 56
; case 11:led_port=0x18;break;
ldi R24,24
out 0x1b,R24
.dbline 56
.dbline 57
; default:break;
L8:
.dbline 59
; }
; }
L5:
.dbline 60
L3:
.dbline 37
xjmp L2
X2:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r key 22 C
.dbend
.dbfunc e get_key _get_key fC
; i -> R22
; tem -> R10
.even
_get_key::
xcall push_gset3
.dbline -1
.dbline 66
; }
; }
;
; /*----------------------------------------------获取按键函数---------------------------------*/
; //获取键值函数,返回0~11号按键,无按键按下则返回0xff
; signed char get_key(void)
; {
.dbline 68
; unsigned char i,tem;
; key_port_ddr=0x0f;//使能键盘口高四位的上拉电阻
ldi R24,15
out 0x11,R24
.dbline 69
; key_port=0xff;
ldi R24,255
out 0x12,R24
.dbline 70
; for(i=0;i<3;i++)//若4*4键盘,这里应为i<4,因为现在PD3悬空,PD3没电平变化,所以你改i<4也不会出错^__^
clr R22
xjmp L26
L23:
.dbline 71
; {
.dbline 72
; key_port=~(1<<i);//键盘线扫描,从PD0~PD2逐位电位变低
ldi R16,1
mov R17,R22
xcall lsl8
mov R2,R16
com R2
out 0x12,R2
.dbline 73
; delay_nus(100);//延时等待电平稳定
ldi R16,100
ldi R17,0
xcall _delay_nus
.dbline 74
; tem=key_port_pin&0xf0;//读键盘扫描信号(PD口高四位)状态,屏蔽低四位
in R24,0x10
andi R24,240
mov R10,R24
.dbline 75
; if(tem!=0xf0)//若PD高四位不等于0xf0,则PD高四位引脚有可能被拉低(即有按键按下)
cpi R24,240
brne X5
xjmp L27
X5:
.dbline 76
; {
.dbline 77
; delay_nms(15);//延时消抖动
ldi R16,15
ldi R17,0
xcall _delay_nms
.dbline 78
; tem=key_port_pin&0xf0;//再读键盘
in R24,0x10
andi R24,240
mov R10,R24
.dbline 79
; if(tem!=0xf0)//确认按键按下
cpi R24,240
brne X6
xjmp L29
X6:
.dbline 80
; {
.dbline 81
; tem&=0xf0;
andi R24,240
mov R10,R24
.dbline 82
; switch(tem)//计算键值
mov R20,R24
clr R21
cpi R20,176
ldi R30,0
cpc R21,R30
breq L35
ldi R24,176
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L39
L38:
cpi R20,112
ldi R30,0
cpc R21,R30
breq L34
xjmp L32
L39:
cpi R20,208
ldi R30,0
cpc R21,R30
breq L36
cpi R20,208
ldi R30,0
cpc R21,R30
brlt L32
L40:
cpi R20,224
ldi R30,0
cpc R21,R30
breq L37
xjmp L32
X4:
.dbline 83
; {
L34:
.dbline 84
; case 0x70:tem=15-(3-i)*4;break;//这里可以改tem=11-(2-i)*4,不过一改4*4键就不适用了^___^
ldi R17,3
sub R17,R22
ldi R16,4
muls R16,R17
ldi R24,15
mov R10,R24
sub R10,R0
.dbline 84
xjmp L32
L35:
.dbline 85
; case 0xb0:tem=14-(3-i)*4;break;
ldi R17,3
sub R17,R22
ldi R16,4
muls R16,R17
ldi R24,14
mov R10,R24
sub R10,R0
.dbline 85
xjmp L32
L36:
.dbline 86
; case 0xd0:tem=13-(3-i)*4;break;
ldi R17,3
sub R17,R22
ldi R16,4
muls R16,R17
ldi R24,13
mov R10,R24
sub R10,R0
.dbline 86
xjmp L32
L37:
.dbline 87
; case 0xe0:tem=12-(3-i)*4;break;
ldi R17,3
sub R17,R22
ldi R16,4
muls R16,R17
ldi R24,12
mov R10,R24
sub R10,R0
.dbline 87
.dbline 88
; default:break;
L32:
.dbline 90
; }
; return tem;//返回0~11号键
mov R16,R10
xjmp L22
L29:
.dbline 92
; }
; }
L27:
.dbline 93
ldi R24,255
out 0x12,R24
.dbline 94
L24:
.dbline 70
inc R22
L26:
.dbline 70
cpi R22,3
brsh X7
xjmp L23
X7:
.dbline 95
; key_port=0xff;
; }
; return 0xff;//无按键按下则返回0xff
ldi R16,255
.dbline -2
L22:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 22 c
.dbsym r tem 10 c
.dbend
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 101
; }
;
; /*--------------------------------------------延时函数------------------------------------*/
; //1us延时函数
; void delay_1us(void)
; {
.dbline 102
; NOP();
nop
.dbline -2
L41:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 107
; }
;
; //n us 延时函数
; void delay_nus(unsigned int n)
; {
.dbline 109
clr R20
clr R21
xjmp L46
L43:
.dbline 109
xcall _delay_1us
L44:
.dbline 109
subi R20,255 ; offset = 1
sbci R21,255
L46:
.dbline 109
; unsigned int i;
; for(i=0;i<n;i++)delay_1us();
cp R20,R22
cpc R21,R23
brlo L43
.dbline -2
L42:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 114
; }
;
; //1ms延时函数
; void delay_1ms(void)
; {
.dbline 116
clr R16
clr R17
xjmp L51
L48:
.dbline 116
L49:
.dbline 116
subi R16,255 ; offset = 1
sbci R17,255
L51:
.dbline 116
; unsigned int i;
; for(i=0;i<600;i++);
cpi R16,88
ldi R30,2
cpc R17,R30
brlo L48
.dbline -2
L47:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nms::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 121
; }
;
; //n ms延时函数
; void delay_nms(unsigned int n)
; {
.dbline 123
clr R20
clr R21
xjmp L56
L53:
.dbline 123
xcall _delay_1ms
L54:
.dbline 123
subi R20,255 ; offset = 1
sbci R21,255
L56:
.dbline 123
; unsigned int i;
; for(i=0;i<n;i++)delay_1ms();
cp R20,R22
cpc R21,R23
brlo L53
.dbline -2
L52:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -