📄 main.s
字号:
.module main.c
.area lit(rom, con, rel)
_Tab::
.byte 33,249
.byte 19,'Q
.byte 201,'E
.byte 5,241
.byte 1,'A
.byte 129,13
.byte 39,25
.byte 7,135
.dbfile C:\ATMega8515\Key/ForATmega8515.h
.dbsym e Tab _Tab A[16:16]kc
.area text(rom, con, rel)
.dbfile C:\ATMega8515\Key/ForATmega8515.h
.dbfile C:\ATMega8515\Key\main.c
.dbfunc e main _main fV
; shuma -> R20
; key -> R22
.even
_main::
.dbline -1
.dbline 13
; #include <iom8515v.h>
; #include"ForATmega8515.h"
; #define C0 0x04
; #define C1 0x08
; #define C2 0x10
; #define R0 0x40
; #define R1 0x80
; void delay(uint ticks);//严时
; uchar GetKey(void);
;
; uchar temp;
; void main()
; {
.dbline 14
; uchar shuma=0;
clr R20
.dbline 15
; uchar key=0;
clr R22
.dbline 16
; init_devices();
rcall _init_devices
rjmp L3
L2:
.dbline 18
; while(1)
; {
.dbline 19
; temp=GetKey();
rcall _GetKey
sts _temp,R16
.dbline 20
; key=temp;
mov R22,R16
.dbline 21
; if((key&0x10)!=0) //第一列有键按下
sbrs R16,4
rjmp L5
.dbline 22
; {
.dbline 23
; if((temp&0x01)==0)shuma=1;
sbrc R16,0
rjmp L7
.dbline 23
ldi R20,1
rjmp L6
L7:
.dbline 24
; else if((temp&0x02)==0)shuma=3;
lds R2,_temp
sbrc R2,1
rjmp L9
.dbline 24
ldi R20,3
rjmp L6
L9:
.dbline 25
; else if((temp&0x04)==0)shuma=5;
lds R2,_temp
sbrc R2,2
rjmp L6
.dbline 25
ldi R20,5
.dbline 26
; }
rjmp L6
L5:
.dbline 27
; else if((key&0x20)!=0)//第二列有键按下
sbrs R22,5
rjmp L13
.dbline 28
; {
.dbline 29
; if((temp&0x01)==0)shuma=2;
lds R2,_temp
sbrc R2,0
rjmp L15
.dbline 29
ldi R20,2
rjmp L16
L15:
.dbline 30
; else if((temp&0x02)==0)shuma=4;
lds R2,_temp
sbrc R2,1
rjmp L17
.dbline 30
ldi R20,4
rjmp L18
L17:
.dbline 31
; else if((temp&0x04)==0)shuma=6;
lds R2,_temp
sbrs R2,2
.dbline 31
ldi R20,6
L19:
L18:
L16:
.dbline 32
; }
L13:
L6:
.dbline 34
ldi R24,<_Tab
ldi R25,>_Tab
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
out 0x1b,R30
.dbline 36
L3:
.dbline 17
rjmp L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r shuma 20 c
.dbsym r key 22 c
.dbend
.dbfunc e delay _delay fV
; i -> R20
; ticks -> R16,R17
.even
_delay::
rcall push_gset1
.dbline -1
.dbline 42
;
; PORTA=Tab[shuma];
;
; }
;
; }
;
;
; void delay(uint ticks)
; {
.dbline 44
rjmp L25
L22:
.dbline 44
ldi R20,200
rjmp L29
L26:
.dbline 44
L27:
.dbline 44
dec R20
L29:
.dbline 44
tst R20
brne L26
L23:
.dbline 44
subi R16,1
sbci R17,0
L25:
.dbline 44
; uchar i;
; for(;ticks!=0;ticks--)for(i=200;i!=0;i--);
cpi R16,0
cpc R16,R17
brne L22
X1:
.dbline -2
L21:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r ticks 16 i
.dbend
.dbfunc e GetKey _GetKey fc
; temp -> R20
; key -> R22
.even
_GetKey::
rcall push_gset2
.dbline -1
.dbline 49
; }
;
; ////////////////////////////////////////////////
; uchar GetKey(void)
; {
.dbline 54
; uchar key;
; uchar temp;
; //temp的高4位是按下的列
; //temp低4位是按下的行
; DDRD&=~(C0+C1+C2);//C0,C1,C2设置为输入
in R24,0x11
andi R24,227
out 0x11,R24
.dbline 55
; DDRD|=R0+R1;//R0,R1设置为输出
in R24,0x11
ori R24,192
out 0x11,R24
.dbline 56
; PORTD&=~(R0+R1);//R0,R1输出0
in R24,0x12
andi R24,63
out 0x12,R24
.dbline 57
; key=PIND; //读取引脚
in R22,0x10
.dbline 58
; key>>=2;
lsr R22
lsr R22
.dbline 59
; key&=0x07;
andi R22,7
.dbline 60
; if(key!=0x07) //如果有键盘按下
cpi R22,7
breq L31
.dbline 61
; {
.dbline 62
; delay(1); //延时,软件滤波
ldi R16,1
ldi R17,0
rcall _delay
.dbline 63
; key=PIND; //读取引脚
in R22,0x10
.dbline 64
; key>>=2;
lsr R22
lsr R22
.dbline 65
; key&=0x07;
andi R22,7
.dbline 66
; if(key!=0x07)
cpi R22,7
breq L33
.dbline 67
; {
.dbline 69
; //确实有键按下
; temp=key;
mov R20,R22
.dbline 70
; DDRD|=C0+C1+C2;////C0,C1,C2设置为输出
in R24,0x11
ori R24,28
out 0x11,R24
.dbline 71
; DDRD&=~(R0+R1);//R0,R1设置为输入
in R24,0x11
andi R24,63
out 0x11,R24
.dbline 72
; PORTD|=C0+C1+C2;
in R24,0x12
ori R24,28
out 0x12,R24
.dbline 73
; key=PIND; //读取引脚
in R22,0x10
.dbline 74
; key>>=2;
lsr R22
lsr R22
.dbline 75
; key&=0x30;
andi R22,48
.dbline 76
; temp+=key;
add R20,R22
.dbline 77
; return temp;
mov R16,R20
rjmp L30
L33:
.dbline 79
; }
; }
L31:
.dbline 80
; return 0xff;//没有键按下
ldi R16,255
.dbline -2
L30:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r key 22 c
.dbend
.area bss(ram, con, rel)
.dbfile C:\ATMega8515\Key\main.c
_temp::
.blkb 1
.dbsym e temp _temp c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -