📄 key.s
字号:
.module key.c
.area data(ram, con, rel)
_num::
.blkb 2
.area idata
.byte 48,49
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 50,51
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 52,53
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 54,55
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 56,57
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'A,'B
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'C,'D
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'E,'F
.area data(ram, con, rel)
.dbfile F:\自编程序\M16\4-4keyboard\key.c
.dbsym e num _num A[16:16]c
.area vector(rom, abs)
.org 4
jmp _INT0_TURNLOW_handler
.area data(ram, con, rel)
.dbfile F:\自编程序\M16\4-4keyboard\key.c
.area text(rom, con, rel)
.dbfile F:\自编程序\M16\4-4keyboard\key.c
.dbfunc e INT0_TURNLOW_handler _INT0_TURNLOW_handler fV
; i -> R20
; ScanCode -> R22
; j -> R10
.even
_INT0_TURNLOW_handler::
xcall push_lset
xcall push_gset3
.dbline -1
.dbline 18
; #include <iom16v.h>
; #include <macros.h>
;
; //键盘接口
; #define KEYDDR DDRB
; #define KEYPORT PORTB
; #define KEYPIN PINB
; //键盘接口
;
; unsigned char num[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
;
; /**************INT0处理函数 start*******************/
; /**************
; 捕捉键盘输入中断进行处理
; *******************/
; #pragma interrupt_handler INT0_TURNLOW_handler:2
; void INT0_TURNLOW_handler(void)
; {
.dbline 20
; unsigned char i,j,ScanCode;
; ScanCode=0x01;
ldi R22,1
.dbline 21
; CLI();
cli
.dbline 22
; for(i=0;i<4;i++)
clr R20
xjmp L5
L2:
.dbline 23
; {
.dbline 24
out 0x18,R22
.dbline 24
clr R10
xjmp L9
L6:
.dbline 24
L7:
.dbline 24
inc R10
L9:
.dbline 24
; KEYPORT=ScanCode;for(j=0;j<10;j++);
mov R24,R10
cpi R24,10
brlo L6
.dbline 25
; if ((KEYPIN&0XF0)!=0x00) USART_Transmit(keycode(ScanCode,KEYPIN&0XF0));//串口发送
in R24,0x16
andi R24,240
breq L10
.dbline 25
in R18,0x16
clr R19
andi R18,240
andi R19,0
mov R16,R22
clr R17
xcall _keycode
xcall _USART_Transmit
L10:
.dbline 26
lsl R22
.dbline 27
L3:
.dbline 22
inc R20
L5:
.dbline 22
cpi R20,4
brlo L2
.dbline 28
clr R10
xjmp L15
L12:
.dbline 28
L13:
.dbline 28
inc R10
L15:
.dbline 28
; ScanCode<<=1;
; }
; for(j=0;j<200;j++);//消抖
mov R24,R10
cpi R24,200
brlo L12
.dbline 29
; SEI();
sei
.dbline 30
; KEYPORT=0X0F;
ldi R24,15
out 0x18,R24
.dbline -2
.dbline 31
; }
L1:
xcall pop_gset3
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r i 20 c
.dbsym r ScanCode 22 c
.dbsym r j 10 c
.dbend
.dbfunc e keycode _keycode fi
; temp -> R20
; line -> R18
; row -> R16
.even
_keycode::
xcall push_gset2
.dbline -1
.dbline 35
; /**************INT0处理函数 end*******************/
; /**************解码函数 start*******************/
; unsigned keycode(unsigned char row,unsigned char line)
; {
.dbline 37
; unsigned char temp;
; switch(row) //行值处理
mov R20,R16
clr R21
cpi R20,1
ldi R30,0
cpc R21,R30
breq L20
cpi R20,2
ldi R30,0
cpc R21,R30
breq L21
cpi R20,4
ldi R30,0
cpc R21,R30
breq L22
cpi R20,8
ldi R30,0
cpc R21,R30
breq L23
xjmp L17
X0:
.dbline 38
; {
L20:
.dbline 39
; case 0x01:temp=0x00;break;
clr R20
.dbline 39
xjmp L18
L21:
.dbline 40
; case 0x02:temp=0x04;break;
ldi R20,4
.dbline 40
xjmp L18
L22:
.dbline 41
; case 0x04:temp=0x08;break;
ldi R20,8
.dbline 41
xjmp L18
L23:
.dbline 42
; case 0x08:temp=0x0c;break;
ldi R20,12
.dbline 42
L17:
L18:
.dbline 44
; }
; switch(line) //列值处理
mov R22,R18
clr R23
cpi R22,32
ldi R30,0
cpc R23,R30
breq L28
ldi R24,32
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L32
L31:
cpi R22,16
ldi R30,0
cpc R23,R30
breq L27
xjmp L24
L32:
cpi R22,64
ldi R30,0
cpc R23,R30
breq L29
cpi R22,64
ldi R30,0
cpc R23,R30
brlt L24
L33:
cpi R22,128
ldi R30,0
cpc R23,R30
breq L30
xjmp L24
X1:
.dbline 45
; {
L27:
.dbline 46
; case 0x10:temp+=0x00;break;
.dbline 46
xjmp L25
L28:
.dbline 47
; case 0x20:temp+=0x01;break;
inc R20
.dbline 47
xjmp L25
L29:
.dbline 48
; case 0x40:temp+=0x02;break;
subi R20,254 ; addi 2
.dbline 48
xjmp L25
L30:
.dbline 49
; case 0x80:temp+=0x03;break;
subi R20,253 ; addi 3
.dbline 49
L24:
L25:
.dbline 51
; }
; return num[temp];
ldi R24,<_num
ldi R25,>_num
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
clr R17
.dbline -2
L16:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r line 18 c
.dbsym r row 16 c
.dbend
.dbfunc e KEY_INI _KEY_INI fV
.even
_KEY_INI::
.dbline -1
.dbline 56
; }
; /**************解码函数 end*******************/
; /**************键盘初始化 stat*******************/
; void KEY_INI(void)//高四位输出并拉高
; {
.dbline 57
; KEYDDR = 0x0F;
ldi R24,15
out 0x17,R24
.dbline 58
; KEYPORT = 0x0F;
out 0x18,R24
.dbline 61
;
; /*************INT0初始化 start******************/
; PORTD &= 0xFB;
in R24,0x12
andi R24,251
out 0x12,R24
.dbline 62
; DDRD &= 0xFB;
in R24,0x11
andi R24,251
out 0x11,R24
.dbline 63
; MCUCR=(1<<ISC01)|(1<<ISC00);//上升沿触发
ldi R24,3
out 0x35,R24
.dbline 64
; GICR=(1<<INT0);
ldi R24,64
out 0x3b,R24
.dbline -2
.dbline 67
; /**************INT0初始化 end*******************/
;
; }
L34:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -