📄 key.s
字号:
.module key.c
.area data(ram, con, rel)
L2:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
L3:
.blkb 1
.area idata
.byte 111
.area data(ram, con, rel)
.area bss(ram, con, rel)
L4:
.blkb 1
L5:
.blkb 1
L6:
.blkb 1
.area data(ram, con, rel)
L7:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.area text(rom, con, rel)
.dbfile C:\avr3\key.c
.dbfunc e key_t2 _key_t2 fc
.dbsym s key_i L7 c
.dbsym s NKEY_n L6 c
.dbsym s YYK L5 c
.dbsym s KZT L4 c
.dbsym s PPK L3 c
.dbsym s NK L2 c
; i -> R16
; z -> R18
; KEYIN -> R16
; a -> R20
; c -> R22
.even
_key_t2::
rcall push_gset2
.dbline -1
.dbline 3
; #include"sga.h"
; unsigned char key_t2(void)
; {
.dbline 12
; static unsigned char NK=0,
; PPK=111,
; KZT,
; YYK,
; NKEY_n,
; key_i=0;
;
; unsigned char a,c, KEYIN,z,i;
; z=0;
clr R18
.dbline 13
; DDRC|=0X3E;//0011 1110 PC1,PC2,PC3,PC4,PC5设为输出
in R24,0x14
ori R24,62
out 0x14,R24
.dbline 14
; PC5_1;PC4_1;PC3_1; //PC3,PC4,PC5输出为1
sbi 0x15,5
.dbline 14
sbi 0x15,4
.dbline 14
sbi 0x15,3
.dbline 15
; NOP();NOP();NOP();NOP();NOP();NOP();
nop
.dbline 15
nop
.dbline 15
nop
.dbline 15
nop
.dbline 15
nop
.dbline 15
nop
.dbline 16
; switch(key_i)
lds R16,L7
clr R17
cpi R16,0
cpc R16,R17
breq L11
X0:
cpi R16,1
ldi R30,0
cpc R17,R30
breq L12
rjmp L8
X1:
.dbline 17
; {
L11:
.dbline 18
; case 0:PC2_1;PC1_0; break;
sbi 0x15,2
.dbline 18
cbi 0x15,0
.dbline 18
rjmp L9
L12:
.dbline 19
; case 1:PC2_0;PC1_1; break;
in R24,0x15
andi R24,252
out 0x15,R24
.dbline 19
sbi 0x15,1
.dbline 19
L8:
L9:
.dbline 21
; }
; key_i++;
lds R24,L7
subi R24,255 ; addi 1
sts L7,R24
.dbline 22
; NOP();NOP();NOP();NOP();NOP();NOP();
nop
.dbline 22
nop
.dbline 22
nop
.dbline 22
nop
.dbline 22
nop
.dbline 22
nop
.dbline 23
; if(key_i==2) key_i=0;
cpi R24,2
brne L13
.dbline 23
clr R2
sts L7,R2
L13:
.dbline 25
;
; DDRC&=0XC7;//1100 0111
in R24,0x14
andi R24,199
out 0x14,R24
.dbline 26
; i=PORTC;
in R16,0x15
.dbline 27
; i=i&0x38;
andi R16,56
.dbline 28
; if(i==0x18)//PC3,PC4,PC5中有一个为0
cpi R16,24
brne L15
.dbline 29
; {
.dbline 30
; a=3;
ldi R20,3
.dbline 31
; }else
rjmp L16
L15:
.dbline 32
; if(i==0x28)
cpi R16,40
brne L17
.dbline 33
; {
.dbline 34
; a=4;
ldi R20,4
.dbline 35
; }else
rjmp L18
L17:
.dbline 36
; if(i==0x30)
cpi R16,48
brne L19
.dbline 37
; {
.dbline 38
; a=5;
ldi R20,5
.dbline 39
; }else
rjmp L20
L19:
.dbline 40
; {
.dbline 41
; a=0;
clr R20
.dbline 42
; }
L20:
L18:
L16:
.dbline 44
;
; a=a*10+key_i;
ldi R24,10
mul R24,R20
mov R20,R0
lds R2,L7
add R20,R2
.dbline 45
; if(a<20)
cpi R20,20
brsh L21
.dbline 46
; {
.dbline 47
; NKEY_n++;
lds R24,L6
subi R24,255 ; addi 1
sts L6,R24
.dbline 48
; if(NKEY_n==4)
cpi R24,4
breq X6
rjmp L22
X6:
.dbline 49
; {
.dbline 51
;
; NKEY_n=0; z=1;
clr R2
sts L6,R2
.dbline 51
ldi R18,1
.dbline 52
; for(a=0;a!=14;a++)
clr R20
rjmp L28
L25:
.dbline 53
ldi R24,<_KKEY_n
ldi R25,>_KKEY_n
mov R30,R20
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
L26:
.dbline 52
inc R20
L28:
.dbline 52
cpi R20,14
brne L25
.dbline 54
; KKEY_n[a]=0;
; KEYIN=0; //返回空按钮键值
clr R16
.dbline 55
; }
.dbline 56
; }else //A>20
rjmp L22
L21:
.dbline 57
; {
.dbline 58
; NKEY_n=0;
clr R2
sts L6,R2
.dbline 59
; switch(a)
mov R22,R20
clr R23
cpi R22,40
ldi R30,0
cpc R23,R30
breq L38
cpi R22,41
ldi R30,0
cpc R23,R30
breq L36
ldi R24,41
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L44
L43:
cpi R22,30
ldi R30,0
cpc R23,R30
breq L34
cpi R22,31
ldi R30,0
cpc R23,R30
breq L32
rjmp L29
L44:
cpi R22,50
ldi R30,0
cpc R23,R30
breq L41
cpi R22,51
ldi R30,0
cpc R23,R30
breq L39
rjmp L29
X2:
.dbline 60
; {
L32:
.dbline 62
;
; case 31:KKEY_n[3]++;break; //UP 4
lds R24,_KKEY_n+3
subi R24,255 ; addi 1
sts _KKEY_n+3,R24
.dbline 62
rjmp L30
L34:
.dbline 63
; case 30:KKEY_n[8]++;break; //KS3 9
lds R24,_KKEY_n+8
subi R24,255 ; addi 1
sts _KKEY_n+8,R24
.dbline 63
rjmp L30
L36:
.dbline 65
;
; case 41:KKEY_n[1]++;break; // ADD 2
lds R24,_KKEY_n+1
subi R24,255 ; addi 1
sts _KKEY_n+1,R24
.dbline 65
rjmp L30
L38:
.dbline 66
; case 40:KKEY_n[0]++;break; //BEGIN 1
lds R24,_KKEY_n
subi R24,255 ; addi 1
sts _KKEY_n,R24
.dbline 66
rjmp L30
L39:
.dbline 68
;
; case 51:KKEY_n[12]++;break; // X6 13
lds R24,_KKEY_n+12
subi R24,255 ; addi 1
sts _KKEY_n+12,R24
.dbline 68
rjmp L30
L41:
.dbline 69
; case 50:KKEY_n[6]++;break; // MUSIC
lds R24,_KKEY_n+6
subi R24,255 ; addi 1
sts _KKEY_n+6,R24
.dbline 69
L29:
L30:
.dbline 72
;
; }
; for(a=0;a!=14;a++)
clr R20
rjmp L48
L45:
.dbline 73
; {
.dbline 74
; if(KKEY_n[a]==4)
ldi R24,<_KKEY_n
ldi R25,>_KKEY_n
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
cpi R24,4
brne L49
.dbline 75
; {
.dbline 76
; KEYIN=a+1; z=1;
mov R16,R20
subi R16,255 ; addi 1
.dbline 76
ldi R18,1
.dbline 77
; NKEY_n=0;
clr R2
sts L6,R2
.dbline 78
clr R22
rjmp L54
L51:
.dbline 78
ldi R24,<_KKEY_n
ldi R25,>_KKEY_n
mov R30,R22
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
L52:
.dbline 78
inc R22
L54:
.dbline 78
; for(c=0;c!=14;c++) KKEY_n[c]=0;
cpi R22,14
brne L51
.dbline 79
; break;
rjmp L47
L49:
.dbline 81
L46:
.dbline 72
inc R20
L48:
.dbline 72
cpi R20,14
brne L45
L47:
.dbline 82
; }
; }
; if(a==14) return(0); //有按钮,但还没有获得有效按钮
cpi R20,14
brne L55
.dbline 82
clr R16
rjmp L1
L55:
.dbline 83
; }
L22:
.dbline 85
;
; if(z==0) return(0);
tst R18
brne L57
.dbline 85
clr R16
rjmp L1
L57:
.dbline 88
;
;
; if(KEYIN==0) //没有按键时的处理
tst R16
brne L59
.dbline 89
; {
.dbline 91
;
; if((++NK)>2)
lds R24,L2
subi R24,255 ; addi 1
mov R2,R24
sts L2,R2
ldi R24,2
cp R24,R2
brsh L61
.dbline 92
; {
.dbline 93
; NK=30; //强制赋值为20;以防止不断累加溢出
ldi R24,30
sts L2,R24
.dbline 94
; KEY=0;
clr R2
sts _KEY,R2
.dbline 97
; // YYK=0;
; // if(XIE_BEGIN==1) SENG=JIANG=1; //没有按键,停止升降
; switch(PPK)
lds R18,L3
clr R19
cpi R18,5
ldi R30,0
cpc R19,R30
breq L66
rjmp L63
X3:
.dbline 98
; {
L66:
.dbline 100
; case SET:
; KEY=PPK;
lds R2,L3
sts _KEY,R2
.dbline 101
; PPK=111;
ldi R24,111
sts L3,R24
.dbline 102
; if(YYK<16)
lds R24,L5
cpi R24,16
brsh L64
.dbline 103
; return(1);//若连击时间小于2s则认为是单击
ldi R16,1
rjmp L1
X4:
.dbline 104
; break;
L63:
.dbline 105
; default:PPK=111;
ldi R24,111
sts L3,R24
.dbline 106
; }
L64:
.dbline 107
; YYK=0;
clr R2
sts L5,R2
.dbline 108
; }
L61:
.dbline 109
; return(0);
clr R16
rjmp L1
L59:
.dbline 111
; }
; NK=0;
clr R2
sts L2,R2
.dbline 113
;
; if(PPK!=KEYIN)
lds R2,L3
cp R2,R16
breq L69
.dbline 114
; {
.dbline 115
; PPK=KEYIN;
sts L3,R16
.dbline 116
; YYK=0;
clr R2
sts L5,R2
.dbline 117
; KZT=1;
ldi R24,1
sts L4,R24
.dbline 118
; return(0);
clr R16
rjmp L1
L69:
.dbline 120
; }
; if(YYK==200) return(0); //连续按住ok状态,不进行下面处理
lds R24,L5
cpi R24,200
brne L71
.dbline 120
clr R16
rjmp L1
L71:
.dbline 121
; ++YYK;
lds R24,L5
subi R24,255 ; addi 1
sts L5,R24
.dbline 122
; switch(KZT)
lds R16,L4
clr R17
cpi R16,1
ldi R30,0
cpc R17,R30
breq L76
cpi R16,2
ldi R30,0
cpc R17,R30
brne X7
rjmp L89
X7:
cpi R16,3
ldi R30,0
cpc R17,R30
brne X8
rjmp L93
X8:
rjmp L73
X5:
.dbline 123
; {
L76:
.dbline 124
; case 1: if((PPK==SET && YYK>26))
lds R24,L3
cpi R24,5
brne L77
ldi R24,26
lds R2,L5
cp R24,R2
brsh L77
.dbline 125
; {
.dbline 126
; YYK=200;
ldi R24,200
sts L5,R24
.dbline 127
; KEY=PPK;
lds R2,L3
sts _KEY,R2
.dbline 128
; return(2);
ldi R16,2
rjmp L1
L77:
.dbline 131
; }
;
; if ( PPK==BEGIN || PPK==END )//PPK==CLEAR ||
lds R24,L3
cpi R24,1
breq L81
cpi R24,2
brne L79
L81:
.dbline 132
; {
.dbline 133
; if(YYK!=1) return(0);
lds R24,L5
cpi R24,1
breq L82
.dbline 133
clr R16
rjmp L1
L82:
.dbline 134
; NOP();
nop
.dbline 135
; KEY=PPK;
lds R2,L3
sts _KEY,R2
.dbline 136
; return(1);
ldi R16,1
rjmp L1
L79:
.dbline 139
; }
; /// ///
; if(PPK==ADD || PPK==SUB ) // +.-
lds R24,L3
cpi R24,3
breq L86
cpi R24,4
brne L84
L86:
.dbline 140
; {
.dbline 141
; KEY=PPK;
lds R2,L3
sts _KEY,R2
.dbline 142
; KZT=2; YYK=0;
ldi R24,2
sts L4,R24
.dbline 142
clr R2
sts L5,R2
.dbline 143
; if(CHW==0) BIT_80|=0x80;//a.BEEP1=1;
lds R2,_CHW
tst R2
brne L87
.dbline 143
lds R24,_BIT_80
ori R24,128
sts _BIT_80,R24
L87:
.dbline 144
; return(1);
ldi R16,1
rjmp L1
L84:
.dbline 146
; }
; return(0);
clr R16
rjmp L1
L89:
.dbline 147
; case 2: if(YYK!=20 && (PPK==ADD || PPK==SUB ))
lds R24,L5
cpi R24,20
breq L90
lds R24,L3
cpi R24,3
breq L92
cpi R24,4
brne L90
L92:
.dbline 148
; return(0);
clr R16
rjmp L1
L90:
.dbline 149
; YYK=0;
clr R2
sts L5,R2
.dbline 150
; KEY=PPK;
lds R2,L3
sts _KEY,R2
.dbline 151
; KZT=3;
ldi R24,3
sts L4,R24
.dbline 152
; return(1);
ldi R16,1
rjmp L1
L93:
.dbline 153
; case 3: if (YYK!=10) return(0);
lds R24,L5
cpi R24,10
breq L94
.dbline 153
clr R16
rjmp L1
L94:
.dbline 154
; YYK=0;
clr R2
sts L5,R2
.dbline 155
; KEY=PPK;
lds R2,L3
sts _KEY,R2
.dbline 156
; return(1);
ldi R16,1
rjmp L1
L73:
.dbline 158
; }
; return 255;
ldi R16,255
.dbline -2
L1:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbsym r z 18 c
.dbsym r KEYIN 16 c
.dbsym r a 20 c
.dbsym r c 22 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -