📄 mkey.lis
字号:
.module mkey.c
.area code(ram, con, rel)
.area lit(rom, con, rel)
0000 _table::
0000 3F00 .word 63
0002 0600 .word 6
0004 5B00 .word 91
0006 4F00 .word 79
0008 6600 .word 102
000A 6D00 .word 109
000C 7D00 .word 125
000E 0700 .word 7
0010 7F00 .word 127
0012 6F00 .word 111
0014 7700 .word 119
0016 7C00 .word 124
0018 3900 .word 57
001A 5E00 .word 94
001C 7900 .word 121
001E 7100 .word 113
0020 FF00 .word 255
0022 .dbfile I:\AVR视频教程\视频教程\lesson5\mkey\mkey.c
0022 .dbsym e table _table A[34:17]I
.area text(rom, con, rel)
0000 .dbfile I:\AVR视频教程\视频教程\lesson5\mkey\mkey.c
0000 .dbfunc e delay _delay fV
0000 ; i -> R20,R21
0000 ; j -> R22,R23
0000 ; ms -> R16,R17
.even
0000 _delay::
0000 00D0 rcall push_gset2
0002 .dbline -1
0002 .dbline 9
0002 ; #include <iom16v.h>
0002 ; #include <macros.h>
0002 ; #define uchar unsigned char
0002 ; #define uint unsigned int
0002 ; #pragma data:code
0002 ; const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0002 ; 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0XFF};
0002 ; void delay(uint ms)
0002 ; {
0002 .dbline 11
0002 ; uint i,j;
0002 ; for(i=0;i<ms;i++)
0002 4427 clr R20
0004 5527 clr R21
0006 0BC0 rjmp L5
0008 L2:
0008 .dbline 12
0008 ; {
0008 .dbline 13
0008 6627 clr R22
000A 7727 clr R23
000C 02C0 rjmp L9
000E L6:
000E .dbline 13
000E L7:
000E .dbline 13
000E 6F5F subi R22,255 ; offset = 1
0010 7F4F sbci R23,255
0012 L9:
0012 .dbline 13
0012 6537 cpi R22,117
0014 E4E0 ldi R30,4
0016 7E07 cpc R23,R30
0018 D0F3 brlo L6
001A .dbline 14
001A L3:
001A .dbline 11
001A 4F5F subi R20,255 ; offset = 1
001C 5F4F sbci R21,255
001E L5:
001E .dbline 11
001E 4017 cp R20,R16
0020 5107 cpc R21,R17
0022 90F3 brlo L2
0024 .dbline -2
0024 .dbline 15
0024 ; for(j=0;j<1141;j++);
0024 ; }
0024 ; }
0024 L1:
0024 00D0 rcall pop_gset2
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbsym r i 20 i
0028 .dbsym r j 22 i
0028 .dbsym r ms 16 i
0028 .dbend
0028 .dbfunc e show _show fV
0028 ; k -> R20
0028 ; j -> R22
.even
0028 _show::
0028 00D0 rcall push_gset2
002A 422F mov R20,R18
002C 602F mov R22,R16
002E .dbline -1
002E .dbline 17
002E ; void show(uchar j,uchar k)
002E ; {
002E .dbline 18
002E ; PORTA|=BIT(3);
002E DB9A sbi 0x1b,3
0030 .dbline 19
0030 ; PORTB=table[j];
0030 80E0 ldi R24,<_table
0032 90E0 ldi R25,>_table
0034 062F mov R16,R22
0036 1127 clr R17
0038 000F lsl R16
003A 111F rol R17
003C 080F add R16,R24
003E 191F adc R17,R25
0040 00D0 rcall lpm16
0042 08BB out 0x18,R16
0044 .dbline 20
0044 ; PORTA&=~BIT(3);
0044 DB98 cbi 0x1b,3
0046 .dbline 22
0046 ;
0046 ; PORTB=0XFF;
0046 8FEF ldi R24,255
0048 88BB out 0x18,R24
004A .dbline 23
004A ; PORTB&=~BIT(k);
004A 01E0 ldi R16,1
004C 142F mov R17,R20
004E 00D0 rcall lsl8
0050 202E mov R2,R16
0052 2094 com R2
0054 38B2 in R3,0x18
0056 3220 and R3,R2
0058 38BA out 0x18,R3
005A .dbline 24
005A ; PORTA|=BIT(4);
005A DC9A sbi 0x1b,4
005C .dbline 25
005C ; PORTA&=~BIT(4);
005C DC98 cbi 0x1b,4
005E .dbline 26
005E ; delay(1);
005E 01E0 ldi R16,1
0060 10E0 ldi R17,0
0062 CEDF rcall _delay
0064 .dbline -2
0064 .dbline 27
0064 ; }
0064 L10:
0064 00D0 rcall pop_gset2
0066 .dbline 0 ; func end
0066 0895 ret
0068 .dbsym r k 20 c
0068 .dbsym r j 22 c
0068 .dbend
0068 .dbfunc e key_press _key_press fc
0068 ; i -> R16
.even
0068 _key_press::
0068 .dbline -1
0068 .dbline 29
0068 ; uchar key_press()
0068 ; {
0068 .dbline 31
0068 ; uchar i;
0068 ; DDRD=0XFF;
0068 8FEF ldi R24,255
006A 81BB out 0x11,R24
006C .dbline 32
006C ; PORTD=0XF0;
006C 80EF ldi R24,240
006E 82BB out 0x12,R24
0070 .dbline 34
0070 ;
0070 ; DDRD=0X0F;
0070 8FE0 ldi R24,15
0072 81BB out 0x11,R24
0074 .dbline 36
0074 ;
0074 ; i=PIND;
0074 00B3 in R16,0x10
0076 .dbline 37
0076 ; if(i==0XF0)
0076 003F cpi R16,240
0078 21F4 brne L12
007A .dbline 38
007A ; {
007A .dbline 39
007A ; DDRD=0XFF;
007A 8FEF ldi R24,255
007C 81BB out 0x11,R24
007E .dbline 40
007E ; return 0;
007E 0027 clr R16
0080 03C0 rjmp L11
0082 L12:
0082 .dbline 43
0082 ; }
0082 ; else
0082 ; {
0082 .dbline 44
0082 ; DDRD=0XFF;
0082 8FEF ldi R24,255
0084 81BB out 0x11,R24
0086 .dbline 45
0086 ; return 1;
0086 01E0 ldi R16,1
0088 .dbline -2
0088 L11:
0088 .dbline 0 ; func end
0088 0895 ret
008A .dbsym r i 16 c
008A .dbend
008A .dbfunc e key_scan _key_scan fc
008A ; j -> R22
008A ; key -> R20
008A ; i -> R10
.even
008A _key_scan::
008A 00D0 rcall push_gset3
008C .dbline -1
008C .dbline 50
008C ; }
008C ; }
008C ;
008C ; uchar key_scan()
008C ; {
008C .dbline 51
008C ; uchar key,i=0X7F,j;
008C 8FE7 ldi R24,127
008E A82E mov R10,R24
0090 .dbline 52
0090 ; delay(10);
0090 0AE0 ldi R16,10
0092 10E0 ldi R17,0
0094 B5DF rcall _delay
0096 .dbline 53
0096 ; if(key_press())
0096 E8DF rcall _key_press
0098 0023 tst R16
009A 09F4 brne X1
009C 8FC0 rjmp L15
009E X1:
009E .dbline 54
009E ; {
009E L17:
009E .dbline 56
009E ; do
009E ; {
009E .dbline 57
009E ; i=(i<<1|i>>7);
009E 2A2C mov R2,R10
00A0 2694 lsr R2
00A2 2694 lsr R2
00A4 2694 lsr R2
00A6 2694 lsr R2
00A8 2694 lsr R2
00AA 2694 lsr R2
00AC 2694 lsr R2
00AE 3A2C mov R3,R10
00B0 330C lsl R3
00B2 3228 or R3,R2
00B4 A32C mov R10,R3
00B6 .dbline 58
00B6 ; PORTD=i;
00B6 32BA out 0x12,R3
00B8 .dbline 59
00B8 ; DDRD=0X0F;
00B8 8FE0 ldi R24,15
00BA 81BB out 0x11,R24
00BC .dbline 61
00BC ;
00BC ; key=PIND;
00BC 40B3 in R20,0x10
00BE .dbline 62
00BE ; j=key&0XF0;
00BE 642F mov R22,R20
00C0 607F andi R22,240
00C2 .dbline 64
00C2 L18:
00C2 .dbline 64
00C2 ;
00C2 ; }while(j==0XF0);
00C2 603F cpi R22,240
00C4 61F3 breq L17
00C6 L20:
00C6 .dbline 66
00C6 L21:
00C6 .dbline 66
00C6 ;
00C6 ; while(key_press());
00C6 D0DF rcall _key_press
00C8 0023 tst R16
00CA E9F7 brne L20
00CC .dbline 67
00CC ; switch(key)
00CC 642F mov R22,R20
00CE 7727 clr R23
00D0 673B cpi R22,183
00D2 E0E0 ldi R30,0
00D4 7E07 cpc R23,R30
00D6 09F4 brne X2
00D8 6BC0 rjmp L40
00DA X2:
00DA 6B3B cpi R22,187
00DC E0E0 ldi R30,0
00DE 7E07 cpc R23,R30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -