📄 key.lst
字号:
__text_start:
__start:
0019 E5CF LDI R28,0x5F
001A E0D2 LDI R29,2
001B BFCD OUT 0x3D,R28
001C BFDE OUT 0x3E,R29
001D 51C0 SUBI R28,0x10
001E 40D0 SBCI R29,0
001F EA0A LDI R16,0xAA
0020 8308 STD Y+0,R16
0021 2400 CLR R0
0022 E6E0 LDI R30,0x60
0023 E0F0 LDI R31,0
0024 E010 LDI R17,0
0025 36E1 CPI R30,0x61
0026 07F1 CPC R31,R17
0027 F011 BEQ 0x002A
0028 9201 ST R0,Z+
0029 CFFB RJMP 0x0025
002A 8300 STD Z+0,R16
002B E3E2 LDI R30,0x32
002C E0F0 LDI R31,0
002D E6A0 LDI R26,0x60
002E E0B0 LDI R27,0
002F E010 LDI R17,0
0030 33E2 CPI R30,0x32
0031 07F1 CPC R31,R17
0032 F021 BEQ 0x0037
0033 95C8 LPM
0034 9631 ADIW R30,1
0035 920D ST R0,X+
0036 CFF9 RJMP 0x0030
0037 D019 RCALL _main
_exit:
0038 CFFF RJMP _exit
FILE: C:\ATMega8515\Key\init.c
(0001) //ICC-AVR application builder : 2006-4-27 19:56:34
(0002) // Target : M8515
(0003) // Crystal: 11.059Mhz
(0004)
(0005) #include <iom8515v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTA = 0x00;
_port_init:
0039 2422 CLR R2
003A BA2B OUT 0x1B,R2
(0011) DDRA = 0xFF;
003B EF8F LDI R24,0xFF
003C BB8A OUT 0x1A,R24
(0012) PORTB = 0x00;
003D BA28 OUT 0x18,R2
(0013) DDRB = 0x00;
003E BA27 OUT 0x17,R2
(0014) PORTC = 0x80;
003F E880 LDI R24,0x80
0040 BB85 OUT 0x15,R24
(0015) DDRC = 0xC0;
0041 EC80 LDI R24,0xC0
0042 BB84 OUT 0x14,R24
(0016) PORTD = 0x00;
0043 BA22 OUT 0x12,R2
(0017) DDRD = 0xC0;
0044 BB81 OUT 0x11,R24
(0018) PORTE = 0x00;
0045 B827 OUT 0x07,R2
(0019) DDRE = 0x00;
0046 B826 OUT 0x06,R2
0047 9508 RET
(0020) }
(0021)
(0022) //call this routine to initialize all peripherals
(0023) void init_devices(void)
(0024) {
(0025) //stop errant interrupts until set up
(0026) CLI(); //disable all interrupts
_init_devices:
0048 94F8 BCLR 7
(0027) port_init();
0049 DFEF RCALL _port_init
(0028)
(0029) MCUCR = 0x00;
004A 2422 CLR R2
004B BE25 OUT 0x35,R2
(0030) EMCUCR = 0x00;
004C BE26 OUT 0x36,R2
(0031) GICR = 0x00;
004D BE2B OUT 0x3B,R2
(0032) TIMSK = 0x00;
004E BE29 OUT 0x39,R2
(0033) SEI(); //re-enable interrupts
004F 9478 BSET 7
0050 9508 RET
FILE: C:\ATMega8515\Key\main.c
(0001) #include <iom8515v.h>
(0002) #include"ForATmega8515.h"
(0003) #define C0 0x04
(0004) #define C1 0x08
(0005) #define C2 0x10
(0006) #define R0 0x40
(0007) #define R1 0x80
(0008) void delay(uint ticks);//严时
(0009) uchar GetKey(void);
(0010)
(0011) uchar temp;
(0012) void main()
(0013) {
(0014) uchar shuma=0;
_main:
shuma --> R20
key --> R22
0051 2744 CLR R20
(0015) uchar key=0;
0052 2766 CLR R22
(0016) init_devices();
0053 DFF4 RCALL _init_devices
0054 C030 RJMP 0x0085
(0017) while(1)
(0018) {
(0019) temp=GetKey();
0055 D03F RCALL _GetKey
0056 93000060 STS temp,R16
(0020) key=temp;
0058 2F60 MOV R22,R16
(0021) if((key&0x10)!=0) //第一列有键按下
0059 FF04 SBRS R16,4
005A C010 RJMP 0x006B
(0022) {
(0023) if((temp&0x01)==0)shuma=1;
005B FD00 SBRC R16,0
005C C002 RJMP 0x005F
005D E041 LDI R20,1
005E C01E RJMP 0x007D
(0024) else if((temp&0x02)==0)shuma=3;
005F 90200060 LDS R2,temp
0061 FC21 SBRC R2,1
0062 C002 RJMP 0x0065
0063 E043 LDI R20,3
0064 C018 RJMP 0x007D
(0025) else if((temp&0x04)==0)shuma=5;
0065 90200060 LDS R2,temp
0067 FC22 SBRC R2,2
0068 C014 RJMP 0x007D
0069 E045 LDI R20,5
(0026) }
006A C012 RJMP 0x007D
(0027) else if((key&0x20)!=0)//第二列有键按下
006B FF65 SBRS R22,5
006C C010 RJMP 0x007D
(0028) {
(0029) if((temp&0x01)==0)shuma=2;
006D 90200060 LDS R2,temp
006F FC20 SBRC R2,0
0070 C002 RJMP 0x0073
0071 E042 LDI R20,2
0072 C00A RJMP 0x007D
(0030) else if((temp&0x02)==0)shuma=4;
0073 90200060 LDS R2,temp
0075 FC21 SBRC R2,1
0076 C002 RJMP 0x0079
0077 E044 LDI R20,4
0078 C004 RJMP 0x007D
(0031) else if((temp&0x04)==0)shuma=6;
0079 90200060 LDS R2,temp
007B FE22 SBRS R2,2
007C E046 LDI R20,6
(0032) }
(0033)
(0034) PORTA=Tab[shuma];
007D E282 LDI R24,0x22
007E E090 LDI R25,0
007F 2FE4 MOV R30,R20
0080 27FF CLR R31
0081 0FE8 ADD R30,R24
0082 1FF9 ADC R31,R25
0083 91E4 LPM R30,0(Z)
0084 BBEB OUT 0x1B,R30
0085 CFCF RJMP 0x0055
0086 9508 RET
_delay:
i --> R20
ticks --> R16
0087 D044 RCALL push_gset1
(0035)
(0036) }
(0037)
(0038) }
(0039)
(0040)
(0041) void delay(uint ticks)
(0042) {
(0043) uchar i;
(0044) for(;ticks!=0;ticks--)for(i=200;i!=0;i--);
0088 C007 RJMP 0x0090
0089 EC48 LDI R20,0xC8
008A C001 RJMP 0x008C
008B 954A DEC R20
008C 2344 TST R20
008D F7E9 BNE 0x008B
008E 5001 SUBI R16,1
008F 4010 SBCI R17,0
0090 3000 CPI R16,0
0091 0701 CPC R16,R17
0092 F7B1 BNE 0x0089
0093 D03B RCALL pop_gset1
0094 9508 RET
_GetKey:
temp --> R20
key --> R22
0095 D034 RCALL push_gset2
(0045) }
(0046)
(0047) ////////////////////////////////////////////////
(0048) uchar GetKey(void)
(0049) {
(0050) uchar key;
(0051) uchar temp;
(0052) //temp的高4位是按下的列
(0053) //temp低4位是按下的行
(0054) DDRD&=~(C0+C1+C2);//C0,C1,C2设置为输入
0096 B381 IN R24,0x11
0097 7E83 ANDI R24,0xE3
0098 BB81 OUT 0x11,R24
(0055) DDRD|=R0+R1;//R0,R1设置为输出
0099 B381 IN R24,0x11
009A 6C80 ORI R24,0xC0
009B BB81 OUT 0x11,R24
(0056) PORTD&=~(R0+R1);//R0,R1输出0
009C B382 IN R24,0x12
009D 738F ANDI R24,0x3F
009E BB82 OUT 0x12,R24
(0057) key=PIND; //读取引脚
009F B360 IN R22,0x10
(0058) key>>=2;
00A0 9566 LSR R22
00A1 9566 LSR R22
(0059) key&=0x07;
00A2 7067 ANDI R22,7
(0060) if(key!=0x07) //如果有键盘按下
00A3 3067 CPI R22,7
00A4 F0D1 BEQ 0x00BF
(0061) {
(0062) delay(1); //延时,软件滤波
00A5 E001 LDI R16,1
00A6 E010 LDI R17,0
00A7 DFDF RCALL _delay
(0063) key=PIND; //读取引脚
00A8 B360 IN R22,0x10
(0064) key>>=2;
00A9 9566 LSR R22
00AA 9566 LSR R22
(0065) key&=0x07;
00AB 7067 ANDI R22,7
(0066) if(key!=0x07)
00AC 3067 CPI R22,7
00AD F089 BEQ 0x00BF
(0067) {
(0068) //确实有键按下
(0069) temp=key;
00AE 2F46 MOV R20,R22
(0070) DDRD|=C0+C1+C2;////C0,C1,C2设置为输出
00AF B381 IN R24,0x11
00B0 618C ORI R24,0x1C
00B1 BB81 OUT 0x11,R24
(0071) DDRD&=~(R0+R1);//R0,R1设置为输入
00B2 B381 IN R24,0x11
00B3 738F ANDI R24,0x3F
00B4 BB81 OUT 0x11,R24
(0072) PORTD|=C0+C1+C2;
00B5 B382 IN R24,0x12
00B6 618C ORI R24,0x1C
00B7 BB82 OUT 0x12,R24
(0073) key=PIND; //读取引脚
00B8 B360 IN R22,0x10
(0074) key>>=2;
00B9 9566 LSR R22
00BA 9566 LSR R22
(0075) key&=0x30;
00BB 7360 ANDI R22,0x30
(0076) temp+=key;
00BC 0F46 ADD R20,R22
(0077) return temp;
00BD 2F04 MOV R16,R20
00BE C001 RJMP 0x00C0
(0078) }
(0079) }
(0080) return 0xff;//没有键按下
FILE: <library>
00BF EF0F LDI R16,0xFF
00C0 D001 RCALL pop_gset2
00C1 9508 RET
pop_gset2:
00C2 E0E2 LDI R30,2
00C3 C00C RJMP pop
push_gset5:
00C4 92FA ST R15,-Y
00C5 92EA ST R14,-Y
push_gset4:
00C6 92DA ST R13,-Y
00C7 92CA ST R12,-Y
push_gset3:
00C8 92BA ST R11,-Y
00C9 92AA ST R10,-Y
push_gset2:
00CA 937A ST R23,-Y
00CB 936A ST R22,-Y
push_gset1:
00CC 935A ST R21,-Y
00CD 934A ST R20,-Y
00CE 9508 RET
pop_gset1:
00CF E0E1 LDI R30,1
pop:
00D0 9149 LD R20,Y+
00D1 9159 LD R21,Y+
00D2 FDE0 SBRC R30,0
00D3 9508 RET
00D4 9169 LD R22,Y+
00D5 9179 LD R23,Y+
00D6 FDE1 SBRC R30,1
00D7 9508 RET
00D8 90A9 LD R10,Y+
00D9 90B9 LD R11,Y+
00DA FDE2 SBRC R30,2
00DB 9508 RET
00DC 90C9 LD R12,Y+
00DD 90D9 LD R13,Y+
00DE FDE3 SBRC R30,3
00DF 9508 RET
00E0 90E9 LD R14,Y+
00E1 90F9 LD R15,Y+
00E2 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -