📄 key.lis
字号:
.module key.c
.area data(ram, con, rel)
0000 _num::
0000 .blkb 2
.area idata
0000 3031 .byte 48,49
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 3233 .byte 50,51
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 3435 .byte 52,53
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 3637 .byte 54,55
.area data(ram, con, rel)
0008 .blkb 2
.area idata
0008 3839 .byte 56,57
.area data(ram, con, rel)
000A .blkb 2
.area idata
000A 4142 .byte 'A,'B
.area data(ram, con, rel)
000C .blkb 2
.area idata
000C 4344 .byte 'C,'D
.area data(ram, con, rel)
000E .blkb 2
.area idata
000E 4546 .byte 'E,'F
.area data(ram, con, rel)
0010 .dbfile F:\自编程序\M16\4-4keyboard\key.c
0010 .dbsym e num _num A[16:16]c
.area vector(rom, abs)
.org 4
0004 0C940000 jmp _INT0_TURNLOW_handler
.area data(ram, con, rel)
0010 .dbfile F:\自编程序\M16\4-4keyboard\key.c
.area text(rom, con, rel)
0000 .dbfile F:\自编程序\M16\4-4keyboard\key.c
0000 .dbfunc e INT0_TURNLOW_handler _INT0_TURNLOW_handler fV
0000 ; i -> R20
0000 ; ScanCode -> R22
0000 ; j -> R10
.even
0000 _INT0_TURNLOW_handler::
0000 0E940000 xcall push_lset
0004 0E940000 xcall push_gset3
0008 .dbline -1
0008 .dbline 18
0008 ; #include <iom16v.h>
0008 ; #include <macros.h>
0008 ;
0008 ; //键盘接口
0008 ; #define KEYDDR DDRB
0008 ; #define KEYPORT PORTB
0008 ; #define KEYPIN PINB
0008 ; //键盘接口
0008 ;
0008 ; unsigned char num[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
0008 ;
0008 ; /**************INT0处理函数 start*******************/
0008 ; /**************
0008 ; 捕捉键盘输入中断进行处理
0008 ; *******************/
0008 ; #pragma interrupt_handler INT0_TURNLOW_handler:2
0008 ; void INT0_TURNLOW_handler(void)
0008 ; {
0008 .dbline 20
0008 ; unsigned char i,j,ScanCode;
0008 ; ScanCode=0x01;
0008 61E0 ldi R22,1
000A .dbline 21
000A ; CLI();
000A F894 cli
000C .dbline 22
000C ; for(i=0;i<4;i++)
000C 4427 clr R20
000E 15C0 xjmp L5
0010 L2:
0010 .dbline 23
0010 ; {
0010 .dbline 24
0010 68BB out 0x18,R22
0012 .dbline 24
0012 AA24 clr R10
0014 01C0 xjmp L9
0016 L6:
0016 .dbline 24
0016 L7:
0016 .dbline 24
0016 A394 inc R10
0018 L9:
0018 .dbline 24
0018 ; KEYPORT=ScanCode;for(j=0;j<10;j++);
0018 8A2D mov R24,R10
001A 8A30 cpi R24,10
001C E0F3 brlo L6
001E .dbline 25
001E ; if ((KEYPIN&0XF0)!=0x00) USART_Transmit(keycode(ScanCode,KEYPIN&0XF0));//串口发送
001E 86B3 in R24,0x16
0020 807F andi R24,240
0022 49F0 breq L10
0024 .dbline 25
0024 26B3 in R18,0x16
0026 3327 clr R19
0028 207F andi R18,240
002A 3070 andi R19,0
002C 062F mov R16,R22
002E 1127 clr R17
0030 14D0 xcall _keycode
0032 0E940000 xcall _USART_Transmit
0036 L10:
0036 .dbline 26
0036 660F lsl R22
0038 .dbline 27
0038 L3:
0038 .dbline 22
0038 4395 inc R20
003A L5:
003A .dbline 22
003A 4430 cpi R20,4
003C 48F3 brlo L2
003E .dbline 28
003E AA24 clr R10
0040 01C0 xjmp L15
0042 L12:
0042 .dbline 28
0042 L13:
0042 .dbline 28
0042 A394 inc R10
0044 L15:
0044 .dbline 28
0044 ; ScanCode<<=1;
0044 ; }
0044 ; for(j=0;j<200;j++);//消抖
0044 8A2D mov R24,R10
0046 883C cpi R24,200
0048 E0F3 brlo L12
004A .dbline 29
004A ; SEI();
004A 7894 sei
004C .dbline 30
004C ; KEYPORT=0X0F;
004C 8FE0 ldi R24,15
004E 88BB out 0x18,R24
0050 .dbline -2
0050 .dbline 31
0050 ; }
0050 L1:
0050 0E940000 xcall pop_gset3
0054 0E940000 xcall pop_lset
0058 .dbline 0 ; func end
0058 1895 reti
005A .dbsym r i 20 c
005A .dbsym r ScanCode 22 c
005A .dbsym r j 10 c
005A .dbend
005A .dbfunc e keycode _keycode fi
005A ; temp -> R20
005A ; line -> R18
005A ; row -> R16
.even
005A _keycode::
005A 0E940000 xcall push_gset2
005E .dbline -1
005E .dbline 35
005E ; /**************INT0处理函数 end*******************/
005E ; /**************解码函数 start*******************/
005E ; unsigned keycode(unsigned char row,unsigned char line)
005E ; {
005E .dbline 37
005E ; unsigned char temp;
005E ; switch(row) //行值处理
005E 402F mov R20,R16
0060 5527 clr R21
0062 4130 cpi R20,1
0064 E0E0 ldi R30,0
0066 5E07 cpc R21,R30
0068 69F0 breq L20
006A 4230 cpi R20,2
006C E0E0 ldi R30,0
006E 5E07 cpc R21,R30
0070 59F0 breq L21
0072 4430 cpi R20,4
0074 E0E0 ldi R30,0
0076 5E07 cpc R21,R30
0078 49F0 breq L22
007A 4830 cpi R20,8
007C E0E0 ldi R30,0
007E 5E07 cpc R21,R30
0080 39F0 breq L23
0082 07C0 xjmp L17
0084 X0:
0084 .dbline 38
0084 ; {
0084 L20:
0084 .dbline 39
0084 ; case 0x01:temp=0x00;break;
0084 4427 clr R20
0086 .dbline 39
0086 05C0 xjmp L18
0088 L21:
0088 .dbline 40
0088 ; case 0x02:temp=0x04;break;
0088 44E0 ldi R20,4
008A .dbline 40
008A 03C0 xjmp L18
008C L22:
008C .dbline 41
008C ; case 0x04:temp=0x08;break;
008C 48E0 ldi R20,8
008E .dbline 41
008E 01C0 xjmp L18
0090 L23:
0090 .dbline 42
0090 ; case 0x08:temp=0x0c;break;
0090 4CE0 ldi R20,12
0092 .dbline 42
0092 L17:
0092 L18:
0092 .dbline 44
0092 ; }
0092 ; switch(line) //列值处理
0092 622F mov R22,R18
0094 7727 clr R23
0096 6032 cpi R22,32
0098 E0E0 ldi R30,0
009A 7E07 cpc R23,R30
009C C1F0 breq L28
009E 80E2 ldi R24,32
00A0 90E0 ldi R25,0
00A2 8617 cp R24,R22
00A4 9707 cpc R25,R23
00A6 2CF0 brlt L32
00A8 L31:
00A8 6031 cpi R22,16
00AA E0E0 ldi R30,0
00AC 7E07 cpc R23,R30
00AE 71F0 breq L27
00B0 13C0 xjmp L24
00B2 L32:
00B2 6034 cpi R22,64
00B4 E0E0 ldi R30,0
00B6 7E07 cpc R23,R30
00B8 61F0 breq L29
00BA 6034 cpi R22,64
00BC E0E0 ldi R30,0
00BE 7E07 cpc R23,R30
00C0 5CF0 brlt L24
00C2 L33:
00C2 6038 cpi R22,128
00C4 E0E0 ldi R30,0
00C6 7E07 cpc R23,R30
00C8 31F0 breq L30
00CA 06C0 xjmp L24
00CC X1:
00CC .dbline 45
00CC ; {
00CC L27:
00CC .dbline 46
00CC ; case 0x10:temp+=0x00;break;
00CC .dbline 46
00CC 05C0 xjmp L25
00CE L28:
00CE .dbline 47
00CE ; case 0x20:temp+=0x01;break;
00CE 4395 inc R20
00D0 .dbline 47
00D0 03C0 xjmp L25
00D2 L29:
00D2 .dbline 48
00D2 ; case 0x40:temp+=0x02;break;
00D2 4E5F subi R20,254 ; addi 2
00D4 .dbline 48
00D4 01C0 xjmp L25
00D6 L30:
00D6 .dbline 49
00D6 ; case 0x80:temp+=0x03;break;
00D6 4D5F subi R20,253 ; addi 3
00D8 .dbline 49
00D8 L24:
00D8 L25:
00D8 .dbline 51
00D8 ; }
00D8 ; return num[temp];
00D8 80E0 ldi R24,<_num
00DA 90E0 ldi R25,>_num
00DC E42F mov R30,R20
00DE FF27 clr R31
00E0 E80F add R30,R24
00E2 F91F adc R31,R25
00E4 0081 ldd R16,z+0
00E6 1127 clr R17
00E8 .dbline -2
00E8 L16:
00E8 0E940000 xcall pop_gset2
00EC .dbline 0 ; func end
00EC 0895 ret
00EE .dbsym r temp 20 c
00EE .dbsym r line 18 c
00EE .dbsym r row 16 c
00EE .dbend
00EE .dbfunc e KEY_INI _KEY_INI fV
.even
00EE _KEY_INI::
00EE .dbline -1
00EE .dbline 56
00EE ; }
00EE ; /**************解码函数 end*******************/
00EE ; /**************键盘初始化 stat*******************/
00EE ; void KEY_INI(void)//高四位输出并拉高
00EE ; {
00EE .dbline 57
00EE ; KEYDDR = 0x0F;
00EE 8FE0 ldi R24,15
00F0 87BB out 0x17,R24
00F2 .dbline 58
00F2 ; KEYPORT = 0x0F;
00F2 88BB out 0x18,R24
00F4 .dbline 61
00F4 ;
00F4 ; /*************INT0初始化 start******************/
00F4 ; PORTD &= 0xFB;
00F4 82B3 in R24,0x12
00F6 8B7F andi R24,251
00F8 82BB out 0x12,R24
00FA .dbline 62
00FA ; DDRD &= 0xFB;
00FA 81B3 in R24,0x11
00FC 8B7F andi R24,251
00FE 81BB out 0x11,R24
0100 .dbline 63
0100 ; MCUCR=(1<<ISC01)|(1<<ISC00);//上升沿触发
0100 83E0 ldi R24,3
0102 85BF out 0x35,R24
0104 .dbline 64
0104 ; GICR=(1<<INT0);
0104 80E4 ldi R24,64
0106 8BBF out 0x3b,R24
0108 .dbline -2
0108 .dbline 67
0108 ; /**************INT0初始化 end*******************/
0108 ;
0108 ; }
0108 L34:
0108 .dbline 0 ; func end
0108 0895 ret
010A .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -