📄 mkey.s
字号:
.module mkey.c
.area code(ram, con, rel)
.area lit(rom, con, rel)
_table::
.word 63
.word 6
.word 91
.word 79
.word 102
.word 109
.word 125
.word 7
.word 127
.word 111
.word 119
.word 124
.word 57
.word 94
.word 121
.word 113
.word 255
.dbfile I:\AVR视频教程\视频教程\lesson5\mkey\mkey.c
.dbsym e table _table A[34:17]I
.area text(rom, con, rel)
.dbfile I:\AVR视频教程\视频教程\lesson5\mkey\mkey.c
.dbfunc e delay _delay fV
; i -> R20,R21
; j -> R22,R23
; ms -> R16,R17
.even
_delay::
rcall push_gset2
.dbline -1
.dbline 9
; #include <iom16v.h>
; #include <macros.h>
; #define uchar unsigned char
; #define uint unsigned int
; #pragma data:code
; const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
; 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0XFF};
; void delay(uint ms)
; {
.dbline 11
; uint i,j;
; for(i=0;i<ms;i++)
clr R20
clr R21
rjmp L5
L2:
.dbline 12
; {
.dbline 13
clr R22
clr R23
rjmp L9
L6:
.dbline 13
L7:
.dbline 13
subi R22,255 ; offset = 1
sbci R23,255
L9:
.dbline 13
cpi R22,117
ldi R30,4
cpc R23,R30
brlo L6
.dbline 14
L3:
.dbline 11
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 11
cp R20,R16
cpc R21,R17
brlo L2
.dbline -2
.dbline 15
; for(j=0;j<1141;j++);
; }
; }
L1:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r ms 16 i
.dbend
.dbfunc e show _show fV
; k -> R20
; j -> R22
.even
_show::
rcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 17
; void show(uchar j,uchar k)
; {
.dbline 18
; PORTA|=BIT(3);
sbi 0x1b,3
.dbline 19
; PORTB=table[j];
ldi R24,<_table
ldi R25,>_table
mov R16,R22
clr R17
lsl R16
rol R17
add R16,R24
adc R17,R25
rcall lpm16
out 0x18,R16
.dbline 20
; PORTA&=~BIT(3);
cbi 0x1b,3
.dbline 22
;
; PORTB=0XFF;
ldi R24,255
out 0x18,R24
.dbline 23
; PORTB&=~BIT(k);
ldi R16,1
mov R17,R20
rcall lsl8
mov R2,R16
com R2
in R3,0x18
and R3,R2
out 0x18,R3
.dbline 24
; PORTA|=BIT(4);
sbi 0x1b,4
.dbline 25
; PORTA&=~BIT(4);
cbi 0x1b,4
.dbline 26
; delay(1);
ldi R16,1
ldi R17,0
rcall _delay
.dbline -2
.dbline 27
; }
L10:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r k 20 c
.dbsym r j 22 c
.dbend
.dbfunc e key_press _key_press fc
; i -> R16
.even
_key_press::
.dbline -1
.dbline 29
; uchar key_press()
; {
.dbline 31
; uchar i;
; DDRD=0XFF;
ldi R24,255
out 0x11,R24
.dbline 32
; PORTD=0XF0;
ldi R24,240
out 0x12,R24
.dbline 34
;
; DDRD=0X0F;
ldi R24,15
out 0x11,R24
.dbline 36
;
; i=PIND;
in R16,0x10
.dbline 37
; if(i==0XF0)
cpi R16,240
brne L12
.dbline 38
; {
.dbline 39
; DDRD=0XFF;
ldi R24,255
out 0x11,R24
.dbline 40
; return 0;
clr R16
rjmp L11
L12:
.dbline 43
; }
; else
; {
.dbline 44
; DDRD=0XFF;
ldi R24,255
out 0x11,R24
.dbline 45
; return 1;
ldi R16,1
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e key_scan _key_scan fc
; j -> R22
; key -> R20
; i -> R10
.even
_key_scan::
rcall push_gset3
.dbline -1
.dbline 50
; }
; }
;
; uchar key_scan()
; {
.dbline 51
; uchar key,i=0X7F,j;
ldi R24,127
mov R10,R24
.dbline 52
; delay(10);
ldi R16,10
ldi R17,0
rcall _delay
.dbline 53
; if(key_press())
rcall _key_press
tst R16
brne X1
rjmp L15
X1:
.dbline 54
; {
L17:
.dbline 56
; do
; {
.dbline 57
; i=(i<<1|i>>7);
mov R2,R10
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
mov R3,R10
lsl R3
or R3,R2
mov R10,R3
.dbline 58
; PORTD=i;
out 0x12,R3
.dbline 59
; DDRD=0X0F;
ldi R24,15
out 0x11,R24
.dbline 61
;
; key=PIND;
in R20,0x10
.dbline 62
; j=key&0XF0;
mov R22,R20
andi R22,240
.dbline 64
L18:
.dbline 64
;
; }while(j==0XF0);
cpi R22,240
breq L17
L20:
.dbline 66
L21:
.dbline 66
;
; while(key_press());
rcall _key_press
tst R16
brne L20
.dbline 67
; switch(key)
mov R22,R20
clr R23
cpi R22,183
ldi R30,0
cpc R23,R30
brne X2
rjmp L40
X2:
cpi R22,187
ldi R30,0
cpc R23,R30
brne X3
rjmp L36
X3:
cpi R22,189
ldi R30,0
cpc R23,R30
brne X4
rjmp L32
X4:
cpi R22,190
ldi R30,0
cpc R23,R30
brne X5
rjmp L28
X5:
ldi R24,190
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L43
L42:
cpi R22,119
ldi R30,0
cpc R23,R30
brne X6
rjmp L41
X6:
cpi R22,123
ldi R30,0
cpc R23,R30
brne X7
rjmp L37
X7:
cpi R22,125
ldi R30,0
cpc R23,R30
brne X8
rjmp L33
X8:
cpi R22,126
ldi R30,0
cpc R23,R30
breq L29
rjmp L23
L43:
cpi R22,215
ldi R30,0
cpc R23,R30
brne X9
rjmp L39
X9:
cpi R22,219
ldi R30,0
cpc R23,R30
breq L35
cpi R22,221
ldi R30,0
cpc R23,R30
breq L31
cpi R22,222
ldi R30,0
cpc R23,R30
breq L27
cpi R22,215
ldi R30,0
cpc R23,R30
brge X10
rjmp L23
X10:
L44:
cpi R22,231
ldi R30,0
cpc R23,R30
breq L38
cpi R22,235
ldi R30,0
cpc R23,R30
breq L34
cpi R22,237
ldi R30,0
cpc R23,R30
breq L30
cpi R22,238
ldi R30,0
cpc R23,R30
breq L26
rjmp L23
X0:
.dbline 68
; {
L26:
.dbline 70
; case 0xEE:
; key=0x0;
clr R20
.dbline 71
; break;
rjmp L16
L27:
.dbline 73
; case 0xDE:
; key=0x1;
ldi R20,1
.dbline 74
; break;
rjmp L16
L28:
.dbline 76
; case 0xBE:
; key=0x2;
ldi R20,2
.dbline 77
; break;
rjmp L16
L29:
.dbline 79
; case 0x7E:
; key=0x3;
ldi R20,3
.dbline 80
; break;
rjmp L16
L30:
.dbline 82
; case 0xED:
; key=0x4;
ldi R20,4
.dbline 83
; break;
rjmp L16
L31:
.dbline 85
; case 0xDD:
; key=0x5;
ldi R20,5
.dbline 86
; break;
rjmp L16
L32:
.dbline 88
; case 0xBD:
; key=0x6;
ldi R20,6
.dbline 89
; break;
rjmp L16
L33:
.dbline 91
; case 0x7D:
; key=0x7;
ldi R20,7
.dbline 92
; break;
rjmp L16
L34:
.dbline 94
; case 0xEB:
; key=0x8;
ldi R20,8
.dbline 95
; break;
rjmp L16
L35:
.dbline 97
; case 0xDB:
; key=0x9;
ldi R20,9
.dbline 98
; break;
rjmp L16
L36:
.dbline 100
; case 0xBB:
; key=0xA;
ldi R20,10
.dbline 101
; break;
rjmp L16
L37:
.dbline 103
; case 0x7B:
; key=0xB;
ldi R20,11
.dbline 104
; break;
rjmp L16
L38:
.dbline 106
; case 0xE7:
; key=0xC;
ldi R20,12
.dbline 107
; break;
rjmp L16
L39:
.dbline 109
; case 0xD7:
; key=0xD;
ldi R20,13
.dbline 110
; break;
rjmp L16
L40:
.dbline 112
; case 0xB7:
; key=0xE;
ldi R20,14
.dbline 113
; break;
rjmp L16
L41:
.dbline 115
; case 0x77:
; key=0xF;
ldi R20,15
.dbline 116
; break;
rjmp L16
L23:
.dbline 118
; default:
; key=16;
ldi R20,16
.dbline 119
; }
.dbline 120
; }
rjmp L16
L15:
.dbline 122
; else
; {
.dbline 123
; key=16;
ldi R20,16
.dbline 124
; }
L16:
.dbline 125
; return key;
mov R16,R20
.dbline -2
L14:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r j 22 c
.dbsym r key 20 c
.dbsym r i 10 c
.dbend
.dbfunc e main _main fV
; l -> R20
.even
_main::
.dbline -1
.dbline 128
; }
; void main()
; {
.dbline 130
; uchar l;
; DDRA|=0X18;// 0001 1000
in R24,0x1a
ori R24,24
out 0x1a,R24
.dbline 131
; DDRB=0XFF;
ldi R24,255
out 0x17,R24
rjmp L47
L46:
.dbline 133
; while(1)
; {
.dbline 134
; if(key_press())
rcall _key_press
tst R16
breq L49
.dbline 135
; {
.dbline 136
; l=key_scan();
rcall _key_scan
mov R20,R16
.dbline 137
; show(l,0);
clr R18
rcall _show
.dbline 138
; }
L49:
.dbline 139
L47:
.dbline 132
rjmp L46
X11:
.dbline -2
.dbline 141
; }
;
; }
L45:
.dbline 0 ; func end
ret
.dbsym r l 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -