📄 read_key.s
字号:
.module READ_KEY.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\asdf\MYDOCU~1\11111111111\READ_KEY.c
.dbfunc e READ_KEY _READ_KEY fc
; pb_input -> y+0
; i -> R20,R21
; j -> R22,R23
.even
_READ_KEY::
rcall push_gset2
sbiw R28,63
sbiw R28,17 ; offset = 80
.dbline -1
.dbline 16
; #include <iom8v.h>
; #include <macros.h>
; /////////////////////////////////////read_key
; #define sampling_times 2 //定义取样的次数,连续次数的取样值相同,视为有效取样。
; #define sampling_interval 10 //定义每次取样的时间间隔,单位 us.
; #define sapleing_way 8 //定义多少路采样。最大值为8。PB为输入.
; typedef struct
; { unsigned int v_last; //上一次sampling_times个取样值的结果
; unsigned int v_current; //当前sampling_times个取样值的结果
; unsigned int v[sampling_times]; //存放连续sampling_times次的取样值
; unsigned int v_temp; //存放比较的临时值,为1时有效,0时无效
; } inputStruct;
;
; void delay_nus(unsigned int n); //延时函数,单位 us.
; char READ_KEY(void) //主函数
; {
.dbline 24
; unsigned int i;
; unsigned int j;
; inputStruct pb_input[sapleing_way];
;
;
;
; //以下的for循环,将连续sampling_times次的取样结果存放在相应的数组里
; for (i=0;i<sampling_times;i++)
clr R20
clr R21
rjmp L6
L3:
.dbline 25
; {
.dbline 26
; delay_nus(sampling_interval); //每隔sampling_interval取样一次
ldi R16,10
ldi R17,0
rcall _delay_nus
.dbline 27
; for(j=0;j<sapleing_way;j++)
clr R22
clr R23
rjmp L10
L7:
.dbline 28
.dbline 29
ldi R16,10
ldi R17,0
movw R18,R22
rcall empy16s
movw R2,R16
movw R24,R28
adiw R24,4
add R2,R24
adc R3,R25
ldi R16,2
ldi R17,0
movw R18,R20
rcall empy16s
movw R30,R16
add R30,R2
adc R31,R3
ldi R16,1
ldi R17,0
movw R18,R22
rcall lsl16
in R2,0x16
clr R3
and R2,R16
and R3,R17
std z+1,R3
std z+0,R2
.dbline 30
L8:
.dbline 27
subi R22,255 ; offset = 1
sbci R23,255
L10:
.dbline 27
cpi R22,8
ldi R30,0
cpc R23,R30
brlo L7
.dbline 31
L4:
.dbline 24
subi R20,255 ; offset = 1
sbci R21,255
L6:
.dbline 24
cpi R20,2
ldi R30,0
cpc R21,R30
brlo L3
.dbline 35
; {
; pb_input[j].v[i]=PINB&BIT(j);
; }
; }
;
;
; //以下的for循环,判断连续sampling_times次的取样结果是否有效
; for(j=0;j<sapleing_way;j++)
clr R22
clr R23
rjmp L15
L12:
.dbline 36
; {
.dbline 37
; for (i=1;i<sampling_times;i++)
ldi R20,1
ldi R21,0
rjmp L19
L16:
.dbline 38
; {
.dbline 39
; if (pb_input[j].v[i-1]==pb_input[j].v[i]) //如果sampling_times次取样结果均相同,视为有效
ldi R16,10
ldi R17,0
movw R18,R22
rcall empy16s
movw R2,R16
movw R24,R28
adiw R24,4
movw R4,R2
add R4,R24
adc R5,R25
ldi R16,2
ldi R17,0
movw R18,R20
rcall empy16s
movw R30,R16
add R30,R4
adc R31,R5
ldd R4,z+0
ldd R5,z+1
movw R24,R28
adiw R24,4
add R2,R24
adc R3,R25
movw R18,R20
subi R18,1
sbci R19,0
ldi R16,2
ldi R17,0
rcall empy16s
movw R30,R16
add R30,R2
adc R31,R3
ldd R2,z+0
ldd R3,z+1
cp R2,R4
cpc R3,R5
brne L20
.dbline 40
; pb_input[j].v_temp=1; //sampling_times次取样有效的标志
ldi R16,10
ldi R17,0
movw R18,R22
rcall empy16s
movw R30,R16
movw R24,R28
adiw R24,8
add R30,R24
adc R31,R25
ldi R24,1
ldi R25,0
std z+1,R25
std z+0,R24
rjmp L21
L20:
.dbline 42
; else //否则舍弃,不作处理。
; {
.dbline 43
; pb_input[j].v_temp=0; //sampling_times次取样无效,不作处理
ldi R16,10
ldi R17,0
movw R18,R22
rcall empy16s
movw R30,R16
movw R24,R28
adiw R24,8
add R30,R24
adc R31,R25
clr R2
clr R3
std z+1,R3
std z+0,R2
.dbline 44
; break;
rjmp L18
L21:
.dbline 46
L17:
.dbline 37
subi R20,255 ; offset = 1
sbci R21,255
L19:
.dbline 37
cpi R20,2
ldi R30,0
cpc R21,R30
brsh X0
rjmp L16
X0:
L18:
.dbline 47
L13:
.dbline 35
subi R22,255 ; offset = 1
sbci R23,255
L15:
.dbline 35
cpi R22,8
ldi R30,0
cpc R23,R30
brsh X1
rjmp L12
X1:
.dbline 48
; }
; }
; }
; return(PINB);
in R16,0x16
.dbline -2
L2:
adiw R28,63
adiw R28,17 ; offset = 80
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l pb_input 0 A[80:8]X
.dbsym r i 20 i
.dbsym r j 22 i
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R16,R17
.even
_delay_nus::
rcall push_gset1
.dbline -1
.dbline 54
;
; } // end main()
;
;
; void delay_nus(unsigned int n)//n微秒延时函数
; {
.dbline 56
; unsigned int i;
; for (i=0;i<n;i++)
clr R20
clr R21
rjmp L30
L27:
.dbline 57
.dbline 58
nop
.dbline 59
L28:
.dbline 56
subi R20,255 ; offset = 1
sbci R21,255
L30:
.dbline 56
cp R20,R16
cpc R21,R17
brlo L27
.dbline -2
.dbline 60
; {
; asm("nop");
; }
; }
L26:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 16 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -