📄 key.lis
字号:
.module Key.C
.area code(ram, con, rel)
.area lit(rom, con, rel)
0000 _keyset::
0000 0C0D .byte 12,13
0002 0E0F .byte 14,15
0004 0809 .byte 8,9
0006 0A0B .byte 10,11
0008 0405 .byte 4,5
000A 0607 .byte 6,7
000C 0001 .byte 0,1
000E 0203 .byte 2,3
0010 .dbfile C:\DOCUME~1\Administrator\桌面\Car&Lcd\Key.C
0010 .dbsym e keyset _keyset A[16:16]kc
.area data(ram, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator\桌面\Car&Lcd\Key.C
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator\桌面\Car&Lcd\Key.C
0000 .dbfunc e key_init _key_init fV
.even
0000 _key_init::
0000 .dbline -1
0000 .dbline 23
0000 ; /********************************************
0000 ; /* 键盘扫描函数
0000 ; /* PROTC口用于扫描键盘
0000 ; /* 函数返回键值,无按键时返回0x7F
0000 ; /* 在其他文件中调用函数时应做以下说明
0000 ; /* extern unsigned char scan_key(void);
0000 ; /* extern unsigned char keypad(void);
0000 ; ********************************************/
0000 ; #include <io8515v.h>
0000 ; #include <Key.h>
0000 ;
0000 ; #pragma data:code
0000 ; const char keyset[]=
0000 ; {
0000 ; 12,13,14,15,
0000 ; 8, 9, 10,11,
0000 ; 4, 5, 6, 7,
0000 ; 0, 1, 2, 3
0000 ; };
0000 ; #pragma data:data
0000 ;
0000 ; void key_init(void)
0000 ; {
0000 .dbline 24
0000 ; JP = 0xFF;
0000 8FEF ldi R24,255
0002 85BB out 0x15,R24
0004 .dbline 25
0004 ; JP_FX = 0x00;
0004 2224 clr R2
0006 24BA out 0x14,R2
0008 .dbline -2
0008 .dbline 26
0008 ; }
0008 L1:
0008 .dbline 0 ; func end
0008 0895 ret
000A .dbend
000A .dbfunc e scan_key _scan_key fc
000A ; i -> R22
000A ; temp -> R10
.even
000A _scan_key::
000A 00D0 rcall push_gset3
000C .dbline -1
000C .dbline 29
000C ;
000C ; unsigned char scan_key(void)
000C ; {
000C .dbline 31
000C ; unsigned char i,temp;
000C ; JP_FX=0x0F;
000C 8FE0 ldi R24,15
000E 84BB out 0x14,R24
0010 .dbline 32
0010 ; JP=0xFF;
0010 8FEF ldi R24,255
0012 85BB out 0x15,R24
0014 .dbline 33
0014 ; for(i=0;i<4;i++)
0014 6627 clr R22
0016 69C0 rjmp L6
0018 L3:
0018 .dbline 34
0018 ; {
0018 .dbline 35
0018 ; JP=~(1<<i);
0018 01E0 ldi R16,1
001A 162F mov R17,R22
001C 00D0 rcall lsl8
001E 202E mov R2,R16
0020 2094 com R2
0022 25BA out 0x15,R2
0024 .dbline 36
0024 ; delay_nus(100);
0024 04E6 ldi R16,100
0026 10E0 ldi R17,0
0028 00D0 rcall _delay_nus
002A .dbline 37
002A ; temp=JP_IN&0xF0;
002A 83B3 in R24,0x13
002C 807F andi R24,240
002E A82E mov R10,R24
0030 .dbline 38
0030 ; if(temp!=0xF0)
0030 803F cpi R24,240
0032 09F4 brne X1
0034 57C0 rjmp L7
0036 X1:
0036 .dbline 39
0036 ; {
0036 .dbline 40
0036 ; delay_nms(15);
0036 0FE0 ldi R16,15
0038 10E0 ldi R17,0
003A 00D0 rcall _delay_nms
003C .dbline 41
003C ; temp=JP_IN&0xF0;
003C 83B3 in R24,0x13
003E 807F andi R24,240
0040 A82E mov R10,R24
0042 .dbline 42
0042 ; if(temp!=0xF0)
0042 803F cpi R24,240
0044 09F4 brne X2
0046 4EC0 rjmp L9
0048 X2:
0048 .dbline 43
0048 ; {
0048 .dbline 44
0048 ; temp&=0xF0;
0048 807F andi R24,240
004A A82E mov R10,R24
004C .dbline 45
004C ; switch(temp)
004C 482F mov R20,R24
004E 5527 clr R21
0050 403B cpi R20,176
0052 E0E0 ldi R30,0
0054 5E07 cpc R21,R30
0056 01F1 breq L15
0058 80EB ldi R24,176
005A 90E0 ldi R25,0
005C 8417 cp R24,R20
005E 9507 cpc R25,R21
0060 2CF0 brlt L19
0062 L18:
0062 4037 cpi R20,112
0064 E0E0 ldi R30,0
0066 5E07 cpc R21,R30
0068 79F0 breq L14
006A 2EC0 rjmp L11
006C L19:
006C 403D cpi R20,208
006E E0E0 ldi R30,0
0070 5E07 cpc R21,R30
0072 D1F0 breq L16
0074 403D cpi R20,208
0076 E0E0 ldi R30,0
0078 5E07 cpc R21,R30
007A 0CF4 brge X3
007C 25C0 rjmp L11
007E X3:
007E L20:
007E 403E cpi R20,224
0080 E0E0 ldi R30,0
0082 5E07 cpc R21,R30
0084 C9F0 breq L17
0086 20C0 rjmp L11
0088 X0:
0088 .dbline 46
0088 ; {
0088 L14:
0088 .dbline 47
0088 ; case 0x70:temp=15-(3-i)*4;break;
0088 83E0 ldi R24,3
008A 861B sub R24,R22
008C 880F lsl R24
008E 880F lsl R24
0090 9FE0 ldi R25,15
0092 A92E mov R10,R25
0094 A81A sub R10,R24
0096 .dbline 47
0096 1AC0 rjmp L12
0098 L15:
0098 .dbline 48
0098 ; case 0xb0:temp=14-(3-i)*4;break;
0098 83E0 ldi R24,3
009A 861B sub R24,R22
009C 880F lsl R24
009E 880F lsl R24
00A0 9EE0 ldi R25,14
00A2 A92E mov R10,R25
00A4 A81A sub R10,R24
00A6 .dbline 48
00A6 12C0 rjmp L12
00A8 L16:
00A8 .dbline 49
00A8 ; case 0xd0:temp=13-(3-i)*4;break;
00A8 83E0 ldi R24,3
00AA 861B sub R24,R22
00AC 880F lsl R24
00AE 880F lsl R24
00B0 9DE0 ldi R25,13
00B2 A92E mov R10,R25
00B4 A81A sub R10,R24
00B6 .dbline 49
00B6 0AC0 rjmp L12
00B8 L17:
00B8 .dbline 50
00B8 ; case 0xe0:temp=12-(3-i)*4;break;
00B8 83E0 ldi R24,3
00BA 861B sub R24,R22
00BC 880F lsl R24
00BE 880F lsl R24
00C0 9CE0 ldi R25,12
00C2 A92E mov R10,R25
00C4 A81A sub R10,R24
00C6 .dbline 50
00C6 02C0 rjmp L12
00C8 L11:
00C8 .dbline 51
00C8 ; default:temp=0x7F;
00C8 8FE7 ldi R24,127
00CA A82E mov R10,R24
00CC .dbline 52
00CC ; }
00CC L12:
00CC .dbline 53
00CC ; temp=keyset[temp];
00CC 80E0 ldi R24,<_keyset
00CE 90E0 ldi R25,>_keyset
00D0 2A2C mov R2,R10
00D2 3324 clr R3
00D4 280E add R2,R24
00D6 391E adc R3,R25
00D8 E22D mov R30,R2
00DA F32D mov R31,R3
00DC C895 lpm
00DE A02C mov R10,R0
00E0 .dbline 54
00E0 ; return temp;
00E0 0A2D mov R16,R10
00E2 07C0 rjmp L2
00E4 L9:
00E4 .dbline 56
00E4 ; }
00E4 ; }
00E4 L7:
00E4 .dbline 57
00E4 8FE7 ldi R24,127
00E6 85BB out 0x15,R24
00E8 .dbline 58
00E8 L4:
00E8 .dbline 33
00E8 6395 inc R22
00EA L6:
00EA .dbline 33
00EA 6430 cpi R22,4
00EC 08F4 brsh X4
00EE 94CF rjmp L3
00F0 X4:
00F0 .dbline 59
00F0 ; JP=0x7F;
00F0 ; }
00F0 ; return 0x7F;
00F0 0FE7 ldi R16,127
00F2 .dbline -2
00F2 L2:
00F2 00D0 rcall pop_gset3
00F4 .dbline 0 ; func end
00F4 0895 ret
00F6 .dbsym r i 22 c
00F6 .dbsym r temp 10 c
00F6 .dbend
00F6 .dbfunc e keypad _keypad fc
00F6 ; temp1 -> R20
00F6 ; temp2 -> R22
.even
00F6 _keypad::
00F6 00D0 rcall push_gset2
00F8 .dbline -1
00F8 .dbline 62
00F8 ; }
00F8 ; unsigned char keypad(void)
00F8 ; {
00F8 .dbline 64
00F8 ; unsigned char temp1,temp2;
00F8 ; temp1=scan_key();
00F8 88DF rcall _scan_key
00FA 402F mov R20,R16
00FC .dbline 65
00FC ; if(temp1==0x7F)
00FC 0F37 cpi R16,127
00FE 11F4 brne L22
0100 .dbline 66
0100 ; return 0x7F;
0100 0FE7 ldi R16,127
0102 05C0 rjmp L21
0104 L22:
0104 L24:
0104 .dbline 68
0104 ; do
0104 ; temp2=scan_key();
0104 82DF rcall _scan_key
0106 602F mov R22,R16
0108 L25:
0108 .dbline 69
0108 ; while(temp1==temp2);
0108 4617 cp R20,R22
010A E1F3 breq L24
010C .dbline 70
010C ; return temp1;
010C 042F mov R16,R20
010E .dbline -2
010E L21:
010E 00D0 rcall pop_gset2
0110 .dbline 0 ; func end
0110 0895 ret
0112 .dbsym r temp1 20 c
0112 .dbsym r temp2 22 c
0112 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -