📄 main.lis
字号:
.module main.c
.area lit(rom, con, rel)
0000 _Tab::
0000 21F9 .byte 33,249
0002 1351 .byte 19,'Q
0004 C945 .byte 201,'E
0006 05F1 .byte 5,241
0008 0141 .byte 1,'A
000A 810D .byte 129,13
000C 2719 .byte 39,25
000E 0787 .byte 7,135
0010 .dbfile C:\ATMega8515\Key/ForATmega8515.h
0010 .dbsym e Tab _Tab A[16:16]kc
.area text(rom, con, rel)
0000 .dbfile C:\ATMega8515\Key/ForATmega8515.h
0000 .dbfile C:\ATMega8515\Key\main.c
0000 .dbfunc e main _main fV
0000 ; shuma -> R20
0000 ; key -> R22
.even
0000 _main::
0000 .dbline -1
0000 .dbline 13
0000 ; #include <iom8515v.h>
0000 ; #include"ForATmega8515.h"
0000 ; #define C0 0x04
0000 ; #define C1 0x08
0000 ; #define C2 0x10
0000 ; #define R0 0x40
0000 ; #define R1 0x80
0000 ; void delay(uint ticks);//严时
0000 ; uchar GetKey(void);
0000 ;
0000 ; uchar temp;
0000 ; void main()
0000 ; {
0000 .dbline 14
0000 ; uchar shuma=0;
0000 4427 clr R20
0002 .dbline 15
0002 ; uchar key=0;
0002 6627 clr R22
0004 .dbline 16
0004 ; init_devices();
0004 00D0 rcall _init_devices
0006 30C0 rjmp L3
0008 L2:
0008 .dbline 18
0008 ; while(1)
0008 ; {
0008 .dbline 19
0008 ; temp=GetKey();
0008 3FD0 rcall _GetKey
000A 00930000 sts _temp,R16
000E .dbline 20
000E ; key=temp;
000E 602F mov R22,R16
0010 .dbline 21
0010 ; if((key&0x10)!=0) //第一列有键按下
0010 04FF sbrs R16,4
0012 10C0 rjmp L5
0014 .dbline 22
0014 ; {
0014 .dbline 23
0014 ; if((temp&0x01)==0)shuma=1;
0014 00FD sbrc R16,0
0016 02C0 rjmp L7
0018 .dbline 23
0018 41E0 ldi R20,1
001A 1EC0 rjmp L6
001C L7:
001C .dbline 24
001C ; else if((temp&0x02)==0)shuma=3;
001C 20900000 lds R2,_temp
0020 21FC sbrc R2,1
0022 02C0 rjmp L9
0024 .dbline 24
0024 43E0 ldi R20,3
0026 18C0 rjmp L6
0028 L9:
0028 .dbline 25
0028 ; else if((temp&0x04)==0)shuma=5;
0028 20900000 lds R2,_temp
002C 22FC sbrc R2,2
002E 14C0 rjmp L6
0030 .dbline 25
0030 45E0 ldi R20,5
0032 .dbline 26
0032 ; }
0032 12C0 rjmp L6
0034 L5:
0034 .dbline 27
0034 ; else if((key&0x20)!=0)//第二列有键按下
0034 65FF sbrs R22,5
0036 10C0 rjmp L13
0038 .dbline 28
0038 ; {
0038 .dbline 29
0038 ; if((temp&0x01)==0)shuma=2;
0038 20900000 lds R2,_temp
003C 20FC sbrc R2,0
003E 02C0 rjmp L15
0040 .dbline 29
0040 42E0 ldi R20,2
0042 0AC0 rjmp L16
0044 L15:
0044 .dbline 30
0044 ; else if((temp&0x02)==0)shuma=4;
0044 20900000 lds R2,_temp
0048 21FC sbrc R2,1
004A 02C0 rjmp L17
004C .dbline 30
004C 44E0 ldi R20,4
004E 04C0 rjmp L18
0050 L17:
0050 .dbline 31
0050 ; else if((temp&0x04)==0)shuma=6;
0050 20900000 lds R2,_temp
0054 22FE sbrs R2,2
0056 .dbline 31
0056 46E0 ldi R20,6
0058 L19:
0058 L18:
0058 L16:
0058 .dbline 32
0058 ; }
0058 L13:
0058 L6:
0058 .dbline 34
0058 80E0 ldi R24,<_Tab
005A 90E0 ldi R25,>_Tab
005C E42F mov R30,R20
005E FF27 clr R31
0060 E80F add R30,R24
0062 F91F adc R31,R25
0064 E491 lpm R30,Z
0066 EBBB out 0x1b,R30
0068 .dbline 36
0068 L3:
0068 .dbline 17
0068 CFCF rjmp L2
006A X0:
006A .dbline -2
006A L1:
006A .dbline 0 ; func end
006A 0895 ret
006C .dbsym r shuma 20 c
006C .dbsym r key 22 c
006C .dbend
006C .dbfunc e delay _delay fV
006C ; i -> R20
006C ; ticks -> R16,R17
.even
006C _delay::
006C 00D0 rcall push_gset1
006E .dbline -1
006E .dbline 42
006E ;
006E ; PORTA=Tab[shuma];
006E ;
006E ; }
006E ;
006E ; }
006E ;
006E ;
006E ; void delay(uint ticks)
006E ; {
006E .dbline 44
006E 07C0 rjmp L25
0070 L22:
0070 .dbline 44
0070 48EC ldi R20,200
0072 01C0 rjmp L29
0074 L26:
0074 .dbline 44
0074 L27:
0074 .dbline 44
0074 4A95 dec R20
0076 L29:
0076 .dbline 44
0076 4423 tst R20
0078 E9F7 brne L26
007A L23:
007A .dbline 44
007A 0150 subi R16,1
007C 1040 sbci R17,0
007E L25:
007E .dbline 44
007E ; uchar i;
007E ; for(;ticks!=0;ticks--)for(i=200;i!=0;i--);
007E 0030 cpi R16,0
0080 0107 cpc R16,R17
0082 B1F7 brne L22
0084 X1:
0084 .dbline -2
0084 L21:
0084 00D0 rcall pop_gset1
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbsym r i 20 c
0088 .dbsym r ticks 16 i
0088 .dbend
0088 .dbfunc e GetKey _GetKey fc
0088 ; temp -> R20
0088 ; key -> R22
.even
0088 _GetKey::
0088 00D0 rcall push_gset2
008A .dbline -1
008A .dbline 49
008A ; }
008A ;
008A ; ////////////////////////////////////////////////
008A ; uchar GetKey(void)
008A ; {
008A .dbline 54
008A ; uchar key;
008A ; uchar temp;
008A ; //temp的高4位是按下的列
008A ; //temp低4位是按下的行
008A ; DDRD&=~(C0+C1+C2);//C0,C1,C2设置为输入
008A 81B3 in R24,0x11
008C 837E andi R24,227
008E 81BB out 0x11,R24
0090 .dbline 55
0090 ; DDRD|=R0+R1;//R0,R1设置为输出
0090 81B3 in R24,0x11
0092 806C ori R24,192
0094 81BB out 0x11,R24
0096 .dbline 56
0096 ; PORTD&=~(R0+R1);//R0,R1输出0
0096 82B3 in R24,0x12
0098 8F73 andi R24,63
009A 82BB out 0x12,R24
009C .dbline 57
009C ; key=PIND; //读取引脚
009C 60B3 in R22,0x10
009E .dbline 58
009E ; key>>=2;
009E 6695 lsr R22
00A0 6695 lsr R22
00A2 .dbline 59
00A2 ; key&=0x07;
00A2 6770 andi R22,7
00A4 .dbline 60
00A4 ; if(key!=0x07) //如果有键盘按下
00A4 6730 cpi R22,7
00A6 D1F0 breq L31
00A8 .dbline 61
00A8 ; {
00A8 .dbline 62
00A8 ; delay(1); //延时,软件滤波
00A8 01E0 ldi R16,1
00AA 10E0 ldi R17,0
00AC DFDF rcall _delay
00AE .dbline 63
00AE ; key=PIND; //读取引脚
00AE 60B3 in R22,0x10
00B0 .dbline 64
00B0 ; key>>=2;
00B0 6695 lsr R22
00B2 6695 lsr R22
00B4 .dbline 65
00B4 ; key&=0x07;
00B4 6770 andi R22,7
00B6 .dbline 66
00B6 ; if(key!=0x07)
00B6 6730 cpi R22,7
00B8 89F0 breq L33
00BA .dbline 67
00BA ; {
00BA .dbline 69
00BA ; //确实有键按下
00BA ; temp=key;
00BA 462F mov R20,R22
00BC .dbline 70
00BC ; DDRD|=C0+C1+C2;////C0,C1,C2设置为输出
00BC 81B3 in R24,0x11
00BE 8C61 ori R24,28
00C0 81BB out 0x11,R24
00C2 .dbline 71
00C2 ; DDRD&=~(R0+R1);//R0,R1设置为输入
00C2 81B3 in R24,0x11
00C4 8F73 andi R24,63
00C6 81BB out 0x11,R24
00C8 .dbline 72
00C8 ; PORTD|=C0+C1+C2;
00C8 82B3 in R24,0x12
00CA 8C61 ori R24,28
00CC 82BB out 0x12,R24
00CE .dbline 73
00CE ; key=PIND; //读取引脚
00CE 60B3 in R22,0x10
00D0 .dbline 74
00D0 ; key>>=2;
00D0 6695 lsr R22
00D2 6695 lsr R22
00D4 .dbline 75
00D4 ; key&=0x30;
00D4 6073 andi R22,48
00D6 .dbline 76
00D6 ; temp+=key;
00D6 460F add R20,R22
00D8 .dbline 77
00D8 ; return temp;
00D8 042F mov R16,R20
00DA 01C0 rjmp L30
00DC L33:
00DC .dbline 79
00DC ; }
00DC ; }
00DC L31:
00DC .dbline 80
00DC ; return 0xff;//没有键按下
00DC 0FEF ldi R16,255
00DE .dbline -2
00DE L30:
00DE 00D0 rcall pop_gset2
00E0 .dbline 0 ; func end
00E0 0895 ret
00E2 .dbsym r temp 20 c
00E2 .dbsym r key 22 c
00E2 .dbend
.area bss(ram, con, rel)
0000 .dbfile C:\ATMega8515\Key\main.c
0000 _temp::
0000 .blkb 1
0001 .dbsym e temp _temp c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -