📄 3x3key.lis
字号:
.module _3X3Key.C
.area text(rom, con, rel)
0000 .dbfile F:\Learn\AVR\Pro_Mega8\KEY\3X3Key/Delay.h
0000 .dbfunc e delay_us _delay_us fV
0000 ; i -> R20,R21
0000 ; n -> R16,R17
.even
0000 _delay_us::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 3
0002 ; /******************************************/
0002 ; //文件名:3X3Key.c
0002 ; //功能: 键盘扫描的应用
0002 .dbline 5
0002 A801 movw R20,R16
0004 02C0 rjmp L5
0006 L2:
0006 .dbline 5
0006 L3:
0006 .dbline 5
0006 4150 subi R20,1
0008 5040 sbci R21,0
000A L5:
000A .dbline 5
000A ; //作者: young
000A ; //时间: 2006.11.6
000A 4030 cpi R20,0
000C 4507 cpc R20,R21
000E D9F7 brne L2
0010 X0:
0010 .dbline -2
0010 .dbline 6
0010 ; //目标MCU:ATmega8
0010 L1:
0010 00D0 rcall pop_gset1
0012 .dbline 0 ; func end
0012 0895 ret
0014 .dbsym r i 20 i
0014 .dbsym r n 16 i
0014 .dbend
0014 .dbfunc e delay_1ms _delay_1ms fV
0014 ; i -> R16,R17
.even
0014 _delay_1ms::
0014 .dbline -1
0014 .dbline 10
0014 ; //晶振: 8MHZ
0014 ; /******************************************/
0014 ; #include <iom8v.h>
0014 ; #include "Delay.h"
0014 .dbline 12
0014 ;
0014 ; //按键扫描函数,返回按键的值
0014 01E0 ldi R16,1
0016 10E0 ldi R17,0
0018 02C0 rjmp L10
001A L7:
001A .dbline 13
001A L8:
001A .dbline 12
001A 0F5F subi R16,255 ; offset = 1
001C 1F4F sbci R17,255
001E L10:
001E .dbline 12
001E 0637 cpi R16,118
0020 E4E0 ldi R30,4
0022 1E07 cpc R17,R30
0024 D0F3 brlo L7
0026 .dbline -2
0026 .dbline 14
0026 ; unsigned char ScanKey(void)
0026 ; {
0026 L6:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbsym r i 16 i
0028 .dbend
0028 .dbfunc e delay_ms _delay_ms fV
0028 ; i -> R20,R21
0028 ; n -> R22,R23
.even
0028 _delay_ms::
0028 00D0 rcall push_gset2
002A B801 movw R22,R16
002C .dbline -1
002C .dbline 18
002C ; unsigned char temp,temp1,key;
002C ; temp=PINC;
002C ; temp&=0x07;
002C ; switch(temp) //判断行中哪条线有低电平
002C .dbline 19
002C ; {
002C 4427 clr R20
002E 5527 clr R21
0030 03C0 rjmp L13
0032 L12:
0032 .dbline 21
0032 .dbline 22
0032 F0DF rcall _delay_1ms
0034 .dbline 23
0034 4F5F subi R20,255 ; offset = 1
0036 5F4F sbci R21,255
0038 .dbline 24
0038 L13:
0038 .dbline 20
0038 ; case 0x06:
0038 4617 cp R20,R22
003A 5707 cpc R21,R23
003C D0F3 brlo L12
003E .dbline -2
003E .dbline 25
003E ; DDRC=0X07;
003E ; PORTC=0X38;
003E ; delay_us(1);
003E ; temp1=PINC;
003E ; temp1&=0x38;
003E L11:
003E 00D0 rcall pop_gset2
0040 .dbline 0 ; func end
0040 0895 ret
0042 .dbsym r i 20 i
0042 .dbsym r n 22 i
0042 .dbend
0042 .dbfile F:\Learn\AVR\Pro_Mega8\KEY\3X3Key\3X3Key.C
0042 .dbfunc e ScanKey _ScanKey fc
0042 ; temp1 -> R22
0042 ; key -> R20
0042 ; temp -> R20
.even
0042 _ScanKey::
0042 00D0 rcall push_gset3
0044 .dbline -1
0044 .dbline 14
0044 .dbline 16
0044 43B3 in R20,0x13
0046 .dbline 17
0046 4770 andi R20,7
0048 .dbline 18
0048 5527 clr R21
004A 4330 cpi R20,3
004C E0E0 ldi R30,0
004E 5E07 cpc R21,R30
0050 09F4 brne X5
0052 5FC0 rjmp L37
0054 X5:
0054 4530 cpi R20,5
0056 E0E0 ldi R30,0
0058 5E07 cpc R21,R30
005A 79F1 breq L28
005C 4630 cpi R20,6
005E E0E0 ldi R30,0
0060 5E07 cpc R21,R30
0062 09F0 breq L19
0064 7FC0 rjmp L16
0066 X1:
0066 .dbline 19
0066 L19:
0066 .dbline 21
0066 87E0 ldi R24,7
0068 84BB out 0x14,R24
006A .dbline 22
006A 88E3 ldi R24,56
006C 85BB out 0x15,R24
006E .dbline 23
006E 01E0 ldi R16,1
0070 10E0 ldi R17,0
0072 C6DF rcall _delay_us
0074 .dbline 24
0074 63B3 in R22,0x13
0076 .dbline 25
0076 6873 andi R22,56
0078 .dbline 26
0078 ; switch(temp1) //判断列中哪条线有低电平
0078 462F mov R20,R22
007A 5527 clr R21
007C 4832 cpi R20,40
007E E0E0 ldi R30,0
0080 5E07 cpc R21,R30
0082 89F0 breq L24
0084 88E2 ldi R24,40
0086 90E0 ldi R25,0
0088 8417 cp R24,R20
008A 9507 cpc R25,R21
008C 2CF0 brlt L27
008E L26:
008E 4831 cpi R20,24
0090 E0E0 ldi R30,0
0092 5E07 cpc R21,R30
0094 51F0 breq L25
0096 0BC0 rjmp L20
0098 L27:
0098 4033 cpi R20,48
009A E0E0 ldi R30,0
009C 5E07 cpc R21,R30
009E 09F0 breq L23
00A0 06C0 rjmp L20
00A2 X2:
00A2 .dbline 27
00A2 ; {
00A2 L23:
00A2 .dbline 28
00A2 ; case 0x30: key=0x01; //得到键值
00A2 41E0 ldi R20,1
00A4 .dbline 29
00A4 ; break;
00A4 05C0 rjmp L21
00A6 L24:
00A6 .dbline 30
00A6 ; case 0x28: key=0x02;
00A6 42E0 ldi R20,2
00A8 .dbline 31
00A8 ; break;
00A8 03C0 rjmp L21
00AA L25:
00AA .dbline 32
00AA ; case 0x18: key=0x03;
00AA 43E0 ldi R20,3
00AC .dbline 33
00AC ; break;
00AC 01C0 rjmp L21
00AE L20:
00AE .dbline 34
00AE ; default: key=0;
00AE 4427 clr R20
00B0 .dbline 35
00B0 ; break;
00B0 L21:
00B0 .dbline 37
00B0 ; }
00B0 ; DDRC=0X38;
00B0 88E3 ldi R24,56
00B2 84BB out 0x14,R24
00B4 .dbline 38
00B4 ; PORTC=0X07;
00B4 87E0 ldi R24,7
00B6 85BB out 0x15,R24
00B8 .dbline 39
00B8 ; break;
00B8 56C0 rjmp L17
00BA L28:
00BA .dbline 42
00BA ;
00BA ; case 0x05:
00BA ; DDRC=0X07;
00BA 87E0 ldi R24,7
00BC 84BB out 0x14,R24
00BE .dbline 43
00BE ; PORTC=0X38;
00BE 88E3 ldi R24,56
00C0 85BB out 0x15,R24
00C2 .dbline 44
00C2 ; delay_us(1);
00C2 01E0 ldi R16,1
00C4 10E0 ldi R17,0
00C6 9CDF rcall _delay_us
00C8 .dbline 45
00C8 ; temp1=PINC;
00C8 63B3 in R22,0x13
00CA .dbline 46
00CA ; temp1&=0x38;
00CA 6873 andi R22,56
00CC .dbline 47
00CC ; switch(temp1)
00CC A62E mov R10,R22
00CE BB24 clr R11
00D0 C501 movw R24,R10
00D2 8832 cpi R24,40
00D4 E0E0 ldi R30,0
00D6 9E07 cpc R25,R30
00D8 91F0 breq L33
00DA 88E2 ldi R24,40
00DC 8A15 cp R24,R10
00DE 9B05 cpc R25,R11
00E0 34F0 brlt L36
00E2 L35:
00E2 C501 movw R24,R10
00E4 8831 cpi R24,24
00E6 E0E0 ldi R30,0
00E8 9E07 cpc R25,R30
00EA 59F0 breq L34
00EC 0CC0 rjmp L29
00EE L36:
00EE C501 movw R24,R10
00F0 8033 cpi R24,48
00F2 E0E0 ldi R30,0
00F4 9E07 cpc R25,R30
00F6 09F0 breq L32
00F8 06C0 rjmp L29
00FA X3:
00FA .dbline 48
00FA ; {
00FA L32:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -