📄 keypad.lis
字号:
.module keypad.c
.area text(rom, con, rel)
0000 .dbfile E:\Backup\单片机相关\avr双龙\双龙开发工具\SL-MEGA128\mix_exp\keypad.c
0000 .dbfunc e scan_key _scan_key fc
0000 ; shift -> R22,R23
0000 ; i -> R10
0000 ; temp -> R12
.even
0000 _scan_key::
0000 0E940000 xcall push_gset4
0004 .dbline -1
0004 .dbline 6
0004 ; #include <iom128v.h>
0004 ; /*键盘扫描函数,没有键按下返回0x7f*/
0004 ; /*如果shift按下,返回值最高位为1*/
0004 ; extern void delay_ms(unsigned int time);
0004 ; unsigned char scan_key(void)
0004 ; {
0004 .dbline 8
0004 ; unsigned char i,temp;
0004 ; unsigned shift=0;
0004 6627 clr R22
0006 7727 clr R23
0008 .dbline 9
0008 ; DDRB=0x0f;
0008 8FE0 ldi R24,15
000A 87BB out 0x17,R24
000C .dbline 10
000C ; PORTB=0xff;
000C 8FEF ldi R24,255
000E 88BB out 0x18,R24
0010 .dbline 11
0010 ; for (i=0;i<4;i++)
0010 AA24 clr R10
0012 74C0 xjmp L5
0014 L2:
0014 .dbline 12
0014 ; {
0014 .dbline 13
0014 ; PORTB=~(1<<i); //键盘线扫描
0014 01E0 ldi R16,1
0016 1A2D mov R17,R10
0018 0E940000 xcall lsl8
001C 202E mov R2,R16
001E 2094 com R2
0020 28BA out 0x18,R2
0022 .dbline 14
0022 ; delay_ms(5); //等待低电平稳定
0022 05E0 ldi R16,5
0024 10E0 ldi R17,0
0026 0E940000 xcall _delay_ms
002A .dbline 15
002A ; temp=PINB&0xf0;//读取键盘扫描信号,屏蔽低四位
002A 86B3 in R24,0x16
002C 807F andi R24,240
002E C82E mov R12,R24
0030 .dbline 16
0030 ; if ((PIND&0x20)==0) temp|=01;//检查shift键
0030 8599 sbic 0x10,5
0032 02C0 rjmp L6
0034 .dbline 16
0034 8160 ori R24,1
0036 C82E mov R12,R24
0038 L6:
0038 .dbline 17
0038 ; if (temp!=0xf0)//如果有键按下,延时10ms消抖
0038 8C2D mov R24,R12
003A 803F cpi R24,240
003C 09F4 brne X1
003E 5BC0 xjmp L8
0040 X1:
0040 .dbline 18
0040 ; { //本程序用display代替10ms延时,
0040 .dbline 19
0040 ; delay_ms(5); //可消除显示抖动
0040 05E0 ldi R16,5
0042 10E0 ldi R17,0
0044 0E940000 xcall _delay_ms
0048 .dbline 20
0048 ; temp=PINB&0xf0;//再读键盘
0048 86B3 in R24,0x16
004A 807F andi R24,240
004C C82E mov R12,R24
004E .dbline 21
004E ; if ((PIND&0x20)==0) //检查shift键
004E 8599 sbic 0x10,5
0050 04C0 rjmp L10
0052 .dbline 22
0052 ; {
0052 .dbline 23
0052 ; temp|=01;
0052 8160 ori R24,1
0054 C82E mov R12,R24
0056 .dbline 24
0056 ; shift=1;
0056 61E0 ldi R22,1
0058 70E0 ldi R23,0
005A .dbline 25
005A ; }
005A L10:
005A .dbline 26
005A ; if (temp!=0xf0)
005A 8C2D mov R24,R12
005C 803F cpi R24,240
005E 09F4 brne X2
0060 4AC0 xjmp L12
0062 X2:
0062 .dbline 27
0062 ; {
0062 .dbline 28
0062 ; temp&=0xf0;
0062 807F andi R24,240
0064 C82E mov R12,R24
0066 .dbline 29
0066 ; switch (temp) //计算键值
0066 482F mov R20,R24
0068 5527 clr R21
006A 403B cpi R20,176
006C E0E0 ldi R30,0
006E 5E07 cpc R21,R30
0070 F9F0 breq L18
0072 80EB ldi R24,176
0074 90E0 ldi R25,0
0076 8417 cp R24,R20
0078 9507 cpc R25,R21
007A 2CF0 brlt L22
007C L21:
007C 4037 cpi R20,112
007E E0E0 ldi R30,0
0080 5E07 cpc R21,R30
0082 71F0 breq L17
0084 2DC0 xjmp L14
0086 L22:
0086 403D cpi R20,208
0088 E0E0 ldi R30,0
008A 5E07 cpc R21,R30
008C C9F0 breq L19
008E 403D cpi R20,208
0090 E0E0 ldi R30,0
0092 5E07 cpc R21,R30
0094 2CF1 brlt L14
0096 L23:
0096 403E cpi R20,224
0098 E0E0 ldi R30,0
009A 5E07 cpc R21,R30
009C C9F0 breq L20
009E 20C0 xjmp L14
00A0 X0:
00A0 .dbline 30
00A0 ; {
00A0 L17:
00A0 .dbline 31
00A0 ; case 0x70:temp=15-(3-i)*4;break;
00A0 13E0 ldi R17,3
00A2 1A19 sub R17,R10
00A4 04E0 ldi R16,4
00A6 0102 muls R16,R17
00A8 8FE0 ldi R24,15
00AA C82E mov R12,R24
00AC C018 sub R12,R0
00AE .dbline 31
00AE 1AC0 xjmp L15
00B0 L18:
00B0 .dbline 32
00B0 ; case 0xb0:temp=14-(3-i)*4;break;
00B0 13E0 ldi R17,3
00B2 1A19 sub R17,R10
00B4 04E0 ldi R16,4
00B6 0102 muls R16,R17
00B8 8EE0 ldi R24,14
00BA C82E mov R12,R24
00BC C018 sub R12,R0
00BE .dbline 32
00BE 12C0 xjmp L15
00C0 L19:
00C0 .dbline 33
00C0 ; case 0xd0:temp=13-(3-i)*4;break;
00C0 13E0 ldi R17,3
00C2 1A19 sub R17,R10
00C4 04E0 ldi R16,4
00C6 0102 muls R16,R17
00C8 8DE0 ldi R24,13
00CA C82E mov R12,R24
00CC C018 sub R12,R0
00CE .dbline 33
00CE 0AC0 xjmp L15
00D0 L20:
00D0 .dbline 34
00D0 ; case 0xe0:temp=12-(3-i)*4;break;
00D0 13E0 ldi R17,3
00D2 1A19 sub R17,R10
00D4 04E0 ldi R16,4
00D6 0102 muls R16,R17
00D8 8CE0 ldi R24,12
00DA C82E mov R12,R24
00DC C018 sub R12,R0
00DE .dbline 34
00DE 02C0 xjmp L15
00E0 L14:
00E0 .dbline 35
00E0 ; default:temp=0x7f;
00E0 8FE7 ldi R24,127
00E2 C82E mov R12,R24
00E4 .dbline 36
00E4 ; }
00E4 L15:
00E4 .dbline 37
00E4 ; if (shift==1) temp|=0x80;
00E4 6130 cpi R22,1
00E6 E0E0 ldi R30,0
00E8 7E07 cpc R23,R30
00EA 19F4 brne L24
00EC .dbline 37
00EC 8C2D mov R24,R12
00EE 8068 ori R24,128
00F0 C82E mov R12,R24
00F2 L24:
00F2 .dbline 38
00F2 ; return temp;
00F2 0C2D mov R16,R12
00F4 08C0 xjmp L1
00F6 L12:
00F6 .dbline 40
00F6 ; }
00F6 ; }
00F6 L8:
00F6 .dbline 41
00F6 8FEF ldi R24,255
00F8 88BB out 0x18,R24
00FA .dbline 42
00FA L3:
00FA .dbline 11
00FA A394 inc R10
00FC L5:
00FC .dbline 11
00FC 8A2D mov R24,R10
00FE 8430 cpi R24,4
0100 08F4 brsh X3
0102 88CF xjmp L2
0104 X3:
0104 .dbline 43
0104 ; PORTB=0xff;
0104 ; }
0104 ; return 0x7f;
0104 0FE7 ldi R16,127
0106 .dbline -2
0106 L1:
0106 0E940000 xcall pop_gset4
010A .dbline 0 ; func end
010A 0895 ret
010C .dbsym r shift 22 i
010C .dbsym r i 10 c
010C .dbsym r temp 12 c
010C .dbend
010C .dbfunc e keypad _keypad fc
010C ; temp1 -> R20
010C ; temp2 -> R22
.even
010C _keypad::
010C 0E940000 xcall push_gset2
0110 .dbline -1
0110 .dbline 46
0110 ; }
0110 ; unsigned char keypad(void)
0110 ; {
0110 .dbline 48
0110 ; unsigned char temp1,temp2;
0110 ; temp1=scan_key();
0110 77DF xcall _scan_key
0112 402F mov R20,R16
0114 .dbline 49
0114 ; if (temp1==0x7f) return 0x7f;
0114 0F37 cpi R16,127
0116 11F4 brne L27
0118 .dbline 49
0118 0FE7 ldi R16,127
011A 05C0 xjmp L26
011C L27:
011C L29:
011C .dbline 51
011C ; do
011C ; temp2=scan_key();
011C 71DF xcall _scan_key
011E 602F mov R22,R16
0120 L30:
0120 .dbline 52
0120 ; while (temp1==temp2);
0120 4617 cp R20,R22
0122 E1F3 breq L29
0124 .dbline 53
0124 ; return temp1;
0124 042F mov R16,R20
0126 .dbline -2
0126 L26:
0126 0E940000 xcall pop_gset2
012A .dbline 0 ; func end
012A 0895 ret
012C .dbsym r temp1 20 c
012C .dbsym r temp2 22 c
012C .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -