?? keypad.lis
字號(hào):
.module keypad.c
.area text(rom, con, rel)
0000 .dbfile D:\ICC-AVR\Pc_At\keypad.c
0000 .dbfunc s scan_key _scan_key fI
; shift -> R10,R11
; i -> R20
; temp -> R12
.even
0000 _scan_key::
0000 0E940000 xcall push_gset4
0004 .dbline -1
0004 .dbline 7
; #include <iom103.h>
; /*鍵盤(pán)掃描函數(shù),沒(méi)有鍵按下返回0x7f*/
; /*如果shift按下,返回值最高位為1*/
; extern delay_1ms(void);
; void delay_ms(unsigned int n);
; unsigned char scan_key(void)
; {
0004 .dbline 9
; unsigned char i,temp;
; unsigned shift=0;
0004 AA24 clr R10
0006 BB24 clr R11
0008 .dbline 10
; DDRB=0x0f;
0008 8FE0 ldi R24,15
000A 87BB out 0x17,R24
000C .dbline 11
; PORTB=0xff;
000C 8FEF ldi R24,255
000E 88BB out 0x18,R24
0010 .dbline 12
; for (i=0;i<4;i++)
0010 4427 clr R20
0012 77C0 xjmp L5
0014 L2:
0014 .dbline 13
; {
0014 .dbline 14
; PORTB=~(1<<i); //鍵盤(pán)線掃描
0014 01E0 ldi R16,1
0016 142F mov R17,R20
0018 0E940000 xcall lsl8
001C 202E mov R2,R16
001E 2094 com R2
0020 28BA out 0x18,R2
0022 .dbline 15
; delay_1ms(); //等待低電平穩(wěn)定
0022 0E940000 xcall _delay_1ms
0026 .dbline 16
; temp=PINB&0xf0;//讀取鍵盤(pán)掃描信號(hào),屏蔽低四位
0026 86B3 in R24,0x16
0028 807F andi R24,240
002A C82E mov R12,R24
002C .dbline 17
; if ((PIND&0x20)==0) temp|=01;//檢查shift鍵
002C 8599 sbic 0x10,5
002E 02C0 rjmp L6
0030 .dbline 17
0030 8160 ori R24,1
0032 C82E mov R12,R24
0034 L6:
0034 .dbline 18
; if (temp!=0xf0)//如果有鍵按下,延時(shí)10ms消抖
0034 8C2D mov R24,R12
0036 803F cpi R24,240
0038 09F4 brne X1
003A 60C0 xjmp L8
003C X1:
003C .dbline 19
; { //本程序用display代替10ms延時(shí),
003C .dbline 20
; delay_ms(5); //可消除顯示抖動(dòng)
003C 05E0 ldi R16,5
003E 10E0 ldi R17,0
0040 0E940000 xcall _delay_ms
0044 .dbline 21
; temp=PINB&0xf0;//再讀鍵盤(pán)
0044 86B3 in R24,0x16
0046 807F andi R24,240
0048 C82E mov R12,R24
004A .dbline 22
; if ((PIND&0x20)==0) //檢查shift鍵
004A 8599 sbic 0x10,5
004C 06C0 rjmp L10
004E .dbline 23
; {
004E .dbline 24
; temp|=01;
004E 8160 ori R24,1
0050 C82E mov R12,R24
0052 .dbline 25
; shift=1;
0052 81E0 ldi R24,1
0054 90E0 ldi R25,0
0056 A82E mov R10,R24
0058 B92E mov R11,R25
005A .dbline 26
; }
005A L10:
005A .dbline 27
; if (temp!=0xf0)
005A 8C2D mov R24,R12
005C 803F cpi R24,240
005E 09F4 brne X2
0060 4DC0 xjmp L12
0062 X2:
0062 .dbline 28
; {
0062 .dbline 29
; temp&=0xf0;
0062 807F andi R24,240
0064 C82E mov R12,R24
0066 .dbline 30
; switch (temp) //計(jì)算鍵值
0066 6C2D mov R22,R12
0068 7727 clr R23
006A 603B cpi R22,176
006C E0E0 ldi R30,0
006E 7E07 cpc R23,R30
0070 01F1 breq L18
0072 80EB ldi R24,176
0074 90E0 ldi R25,0
0076 8617 cp R24,R22
0078 9707 cpc R25,R23
007A 2CF0 brlt L22
007C L21:
007C 6037 cpi R22,112
007E E0E0 ldi R30,0
0080 7E07 cpc R23,R30
0082 79F0 breq L17
0084 2EC0 xjmp L14
0086 L22:
0086 603D cpi R22,208
0088 E0E0 ldi R30,0
008A 7E07 cpc R23,R30
008C D1F0 breq L19
008E 603D cpi R22,208
0090 E0E0 ldi R30,0
0092 7E07 cpc R23,R30
0094 0CF4 brge X3
0096 25C0 xjmp L14
0098 X3:
0098 L23:
0098 603E cpi R22,224
009A E0E0 ldi R30,0
009C 7E07 cpc R23,R30
009E C9F0 breq L20
00A0 20C0 xjmp L14
00A2 X0:
00A2 .dbline 31
; {
00A2 L17:
00A2 .dbline 32
; case 0x70:temp=15-(3-i)*4;break;
00A2 83E0 ldi R24,3
00A4 841B sub R24,R20
00A6 880F lsl R24
00A8 880F lsl R24
00AA 9FE0 ldi R25,15
00AC C92E mov R12,R25
00AE C81A sub R12,R24
00B0 .dbline 32
00B0 1AC0 xjmp L15
00B2 L18:
00B2 .dbline 33
; case 0xb0:temp=14-(3-i)*4;break;
00B2 83E0 ldi R24,3
00B4 841B sub R24,R20
00B6 880F lsl R24
00B8 880F lsl R24
00BA 9EE0 ldi R25,14
00BC C92E mov R12,R25
00BE C81A sub R12,R24
00C0 .dbline 33
00C0 12C0 xjmp L15
00C2 L19:
00C2 .dbline 34
; case 0xd0:temp=13-(3-i)*4;break;
00C2 83E0 ldi R24,3
00C4 841B sub R24,R20
00C6 880F lsl R24
00C8 880F lsl R24
00CA 9DE0 ldi R25,13
00CC C92E mov R12,R25
00CE C81A sub R12,R24
00D0 .dbline 34
00D0 0AC0 xjmp L15
00D2 L20:
00D2 .dbline 35
; case 0xe0:temp=12-(3-i)*4;break;
00D2 83E0 ldi R24,3
00D4 841B sub R24,R20
00D6 880F lsl R24
00D8 880F lsl R24
00DA 9CE0 ldi R25,12
00DC C92E mov R12,R25
00DE C81A sub R12,R24
00E0 .dbline 35
00E0 02C0 xjmp L15
00E2 L14:
00E2 .dbline 36
; default:temp=0x7f;
00E2 8FE7 ldi R24,127
00E4 C82E mov R12,R24
00E6 .dbline 37
; }
00E6 L15:
00E6 .dbline 38
; if (shift==1) temp|=0x80;
00E6 81E0 ldi R24,1
00E8 90E0 ldi R25,0
00EA A816 cp R10,R24
00EC B906 cpc R11,R25
00EE 19F4 brne L24
00F0 .dbline 38
00F0 8C2D mov R24,R12
00F2 8068 ori R24,128
00F4 C82E mov R12,R24
00F6 L24:
00F6 .dbline 39
; return temp;
00F6 0C2D mov R16,R12
00F8 1127 clr R17
00FA 08C0 xjmp L1
00FC L12:
00FC .dbline 41
; }
; }
00FC L8:
00FC .dbline 42
00FC 8FEF ldi R24,255
00FE 88BB out 0x18,R24
0100 .dbline 43
0100 L3:
0100 .dbline 12
0100 4395 inc R20
0102 L5:
0102 .dbline 12
0102 4430 cpi R20,4
0104 08F4 brsh X4
0106 86CF xjmp L2
0108 X4:
0108 .dbline 44
; PORTB=0xff;
; }
; return 0x7f;
0108 0FE7 ldi R16,127
010A 10E0 ldi R17,0
010C .dbline -2
010C L1:
010C 0E940000 xcall pop_gset4
0110 .dbline 0 ; func end
0110 0895 ret
0112 .dbsym r shift 10 i
0112 .dbsym r i 20 c
0112 .dbsym r temp 12 c
0112 .dbfunc s keypad _keypad fI
; temp1 -> R20
; temp2 -> R22
.even
0112 _keypad::
0112 0E940000 xcall push_gset2
0116 .dbline -1
0116 .dbline 47
; }
; unsigned char keypad(void)
; {
0116 .dbline 49
; unsigned char temp1,temp2;
; temp1=scan_key();
0116 74DF xcall _scan_key
0118 202E mov R2,R16
011A 312E mov R3,R17
011C 422D mov R20,R2
011E .dbline 50
; if (temp1==0x7f) return 0x7f;
011E 4F37 cpi R20,127
0120 19F4 brne L27
0122 .dbline 50
0122 0FE7 ldi R16,127
0124 10E0 ldi R17,0
0126 08C0 xjmp L26
0128 L27:
0128 L29:
0128 .dbline 52
; do
; temp2=scan_key();
0128 6BDF xcall _scan_key
012A 202E mov R2,R16
012C 312E mov R3,R17
012E 622D mov R22,R2
0130 L30:
0130 .dbline 53
; while (temp1==temp2);
0130 4617 cp R20,R22
0132 D1F3 breq L29
0134 .dbline 54
; return temp1;
0134 042F mov R16,R20
0136 1127 clr R17
0138 .dbline -2
0138 L26:
0138 0E940000 xcall pop_gset2
013C .dbline 0 ; func end
013C 0895 ret
013E .dbsym r temp1 20 c
013E .dbsym r temp2 22 c
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -