📄 lesson8.lst
字号:
__start:
__text_start:
0030 E5CF LDI R28,0x5F
0031 E0D4 LDI R29,4
0032 BFCD OUT P3D,R28
0033 BFDE OUT P3E,R29
0034 51C0 SUBI R28,0x10
0035 40D0 SBCI R29,0
0036 EA0A LDI R16,0xAA
0037 8308 STD R16,0+Y
0038 2400 CLR R0
0039 E6E0 LDI R30,0x60
003A E0F0 LDI R31,0
003B E010 LDI R17,0
003C 36E0 CPI R30,0x60
003D 07F1 CPC R31,R17
003E F011 BEQ 0x0041
003F 9201 ST R0,Z+
0040 CFFB RJMP 0x003C
0041 8300 STD R16,0+Z
0042 E6E0 LDI R30,0x60
0043 E0F0 LDI R31,0
0044 E6A0 LDI R26,0x60
0045 E0B0 LDI R27,0
0046 E010 LDI R17,0
0047 36E0 CPI R30,0x60
0048 07F1 CPC R31,R17
0049 F021 BEQ 0x004E
004A 95C8 LPM
004B 9631 ADIW R30,1
004C 920D ST R0,X+
004D CFF9 RJMP 0x0047
004E 940E00D4 CALL _main
_exit:
0050 CFFF RJMP _exit
_delay:
i --> R20
j --> R22
ms --> R16
0051 D0C4 RCALL push_gset2
FILE: I:\AVR视频教程\视频教程\lesson8\lesson8\Skey.c
(0001) void delay(uint ms)
(0002) {
(0003) uint i,j;
(0004) for(i=0;i<ms;i++)
0052 2744 CLR R20
0053 2755 CLR R21
0054 C00B RJMP 0x0060
(0005) {
(0006) for(j=0;j<1141;j++);
0055 2766 CLR R22
0056 2777 CLR R23
0057 C002 RJMP 0x005A
0058 5F6F SUBI R22,0xFF
0059 4F7F SBCI R23,0xFF
005A 3765 CPI R22,0x75
005B E0E4 LDI R30,4
005C 077E CPC R23,R30
005D F3D0 BCS 0x0058
005E 5F4F SUBI R20,0xFF
005F 4F5F SBCI R21,0xFF
0060 1740 CP R20,R16
0061 0751 CPC R21,R17
0062 F390 BCS 0x0055
(0007) }
(0008) }
0063 D0BA RCALL pop_gset2
0064 9508 RET
(0009)
(0010) uchar key_press()
(0011) {
(0012) uchar j;
(0013) DDRD|=0X0F;
_key_press:
j --> R16
0065 B381 IN R24,P11
0066 608F ORI R24,0xF
0067 BB81 OUT P11,R24
(0014) PORTD|=0X0F;
0068 B382 IN R24,P12
0069 608F ORI R24,0xF
006A BB82 OUT P12,R24
(0015)
(0016) DDRD&=0XF0;
006B B381 IN R24,P11
006C 7F80 ANDI R24,0xF0
006D BB81 OUT P11,R24
(0017)
(0018) j=PIND;
006E B300 IN R16,P10
(0019) j=j&0X0F;//00001111
006F 700F ANDI R16,0xF
(0020) if(j==0X0F)
0070 300F CPI R16,0xF
0071 F411 BNE 0x0074
(0021) {
(0022) return 0;
0072 2700 CLR R16
0073 C001 RJMP 0x0075
(0023) }
(0024) else
(0025) {
(0026) return 1;
0074 E001 LDI R16,1
0075 9508 RET
_key_scan:
key --> R20
0076 D09F RCALL push_gset2
(0027) }
(0028)
(0029) }
(0030)
(0031) uchar key_scan()
(0032) {
(0033) uchar key;
(0034) delay(10);
0077 E00A LDI R16,0xA
0078 E010 LDI R17,0
0079 DFD7 RCALL _delay
(0035) if(key_press())
007A DFEA RCALL _key_press
007B 2300 TST R16
007C F111 BEQ 0x009F
(0036) {
(0037) key=PIND;
007D B340 IN R20,P10
(0038) key&=0X0F;
007E 704F ANDI R20,0xF
(0039) switch(key)
007F 2F64 MOV R22,R20
0080 2777 CLR R23
0081 3067 CPI R22,7
0082 E0E0 LDI R30,0
0083 077E CPC R23,R30
0084 F099 BEQ 0x0098
0085 306B CPI R22,0xB
0086 E0E0 LDI R30,0
0087 077E CPC R23,R30
0088 F069 BEQ 0x0096
0089 306D CPI R22,0xD
008A E0E0 LDI R30,0
008B 077E CPC R23,R30
008C F039 BEQ 0x0094
008D 306E CPI R22,0xE
008E E0E0 LDI R30,0
008F 077E CPC R23,R30
0090 F009 BEQ 0x0092
0091 C008 RJMP 0x009A
(0040) {
(0041) case 0X0E:
(0042) key=0;
0092 2744 CLR R20
(0043) break;
0093 C007 RJMP 0x009B
(0044) case 0X0D:
(0045) key=1;
0094 E041 LDI R20,1
(0046) break;
0095 C005 RJMP 0x009B
(0047) case 0X0B:
(0048) key=2;
0096 E042 LDI R20,2
(0049) break;
0097 C003 RJMP 0x009B
(0050) case 0X07:
(0051) key=3;
0098 E043 LDI R20,3
(0052) break;
0099 C001 RJMP 0x009B
(0053) default:
(0054) key=0;
009A 2744 CLR R20
(0055) }
(0056) while(key_press());
009B DFC9 RCALL _key_press
009C 2300 TST R16
009D F7E9 BNE 0x009B
(0057) }
009E C001 RJMP 0x00A0
(0058) else
(0059) {
(0060) key=0;
009F 2744 CLR R20
(0061) }
(0062) return key;
00A0 2F04 MOV R16,R20
00A1 D07C RCALL pop_gset2
00A2 9508 RET
FILE: I:\AVR视频教程\视频教程\lesson8\lesson8\lesson8.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) #include "Skey.c"
(0006) void spi_init()
(0007) {
(0008) DDRB|=0XA0;
_spi_init:
00A3 B387 IN R24,P17
00A4 6A80 ORI R24,0xA0
00A5 BB87 OUT P17,R24
(0009) DDRA|=BIT(PA1);
00A6 9AD1 SBI P1A,1
(0010) SPCR=0X57;
00A7 E587 LDI R24,0x57
00A8 B98D OUT P0D,R24
(0011) }
00A9 9508 RET
_ad5300:
temp2 --> R22
temp1 --> R20
status --> R22
daword --> R10
00AA D06F RCALL push_gset3
00AB 2EA0 MOV R10,R16
(0012) void ad5300(uchar daword)
(0013) {
(0014) uchar temp1=0,temp2=0,status;
00AC 2744 CLR R20
00AD 2766 CLR R22
(0015) temp1|=daword<<4;//1101 1001
00AE 2D8A MOV R24,R10
00AF 708F ANDI R24,0xF
00B0 9582 SWAP R24
00B1 2B48 OR R20,R24
(0016) temp2|=daword>>4;
00B2 2D8A MOV R24,R10
00B3 9582 SWAP R24
00B4 708F ANDI R24,0xF
00B5 2B68 OR R22,R24
(0017)
(0018) PORTA&=~BIT(PA1);
00B6 98D9 CBI P1B,1
(0019) SPSR=0;
00B7 2422 CLR R2
00B8 B82E OUT P0E,R2
(0020) SPDR=temp2;
00B9 B96F OUT P0F,R22
(0021) do
(0022) {
(0023) status=SPSR;
00BA B16E IN R22,P0E
(0024) }while(!(status&=0X80));
00BB 2F86 MOV R24,R22
00BC 7880 ANDI R24,0x80
00BD 2F68 MOV R22,R24
00BE 2388 TST R24
00BF F3D1 BEQ 0x00BA
(0025)
(0026) delay(10);
00C0 E00A LDI R16,0xA
00C1 E010 LDI R17,0
00C2 DF8E RCALL _delay
(0027) SPSR=0;
00C3 2422 CLR R2
00C4 B82E OUT P0E,R2
(0028) SPDR=temp1;
00C5 B94F OUT P0F,R20
(0029) do
(0030) {
(0031) status=SPSR;
00C6 B16E IN R22,P0E
(0032) }while(!(status&=0X80));
00C7 2F86 MOV R24,R22
00C8 7880 ANDI R24,0x80
00C9 2F68 MOV R22,R24
00CA 2388 TST R24
00CB F3D1 BEQ 0x00C6
(0033) SPSR=0;
00CC 2422 CLR R2
00CD B82E OUT P0E,R2
(0034) delay(10);
00CE E00A LDI R16,0xA
00CF E010 LDI R17,0
00D0 DF80 RCALL _delay
(0035) PORTA|=BIT(PA1);
00D1 9AD9 SBI P1B,1
(0036) }
00D2 D04E RCALL pop_gset3
00D3 9508 RET
(0037) void main()
(0038) {
(0039) uchar i,data=128;
_main:
data --> R20
i --> R10
00D4 E840 LDI R20,0x80
(0040) DDRB=0XFF;
00D5 EF8F LDI R24,0xFF
00D6 BB87 OUT P17,R24
(0041) spi_init();
00D7 DFCB RCALL _spi_init
(0042) ad5300(0);
00D8 2700 CLR R16
00D9 DFD0 RCALL _ad5300
(0043) ad5300(data);
00DA 2F04 MOV R16,R20
00DB DFCE RCALL _ad5300
00DC C020 RJMP 0x00FD
(0044)
(0045) while(1)
(0046) {
(0047) if(key_press())
00DD DF87 RCALL _key_press
00DE 2300 TST R16
00DF F0E9 BEQ 0x00FD
(0048) {
(0049) i=key_scan();
00E0 DF95 RCALL _key_scan
00E1 2EA0 MOV R10,R16
(0050) switch(i)
00E2 2D6A MOV R22,R10
00E3 2777 CLR R23
00E4 3060 CPI R22,0
00E5 0767 CPC R22,R23
00E6 F069 BEQ 0x00F4
00E7 3061 CPI R22,1
00E8 E0E0 LDI R30,0
00E9 077E CPC R23,R30
00EA F059 BEQ 0x00F6
00EB 3062 CPI R22,2
00EC E0E0 LDI R30,0
00ED 077E CPC R23,R30
00EE F049 BEQ 0x00F8
00EF 3063 CPI R22,3
00F0 E0E0 LDI R30,0
00F1 077E CPC R23,R30
00F2 F039 BEQ 0x00FA
00F3 C007 RJMP 0x00FB
(0051) {
(0052) case 0:
(0053) data=data+16;
00F4 5F40 SUBI R20,0xF0
(0054) break;
00F5 C005 RJMP 0x00FB
(0055) case 1:
(0056) data=data-16;
00F6 5140 SUBI R20,0x10
(0057) break;
00F7 C003 RJMP 0x00FB
(0058) case 2:
(0059) data=0;
00F8 2744 CLR R20
(0060) break;
00F9 C001 RJMP 0x00FB
(0061) case 3:
(0062) data=255;
00FA EF4F LDI R20,0xFF
(0063) break;
(0064) }
(0065) ad5300(data);
00FB 2F04 MOV R16,R20
00FC DFAD RCALL _ad5300
00FD CFDF RJMP 0x00DD
(0066) }
(0067) }
(0068) }FILE: <library>
00FE 9508 RET
push_gset1:
00FF 935A ST R21,-Y
0100 934A ST R20,-Y
0101 9508 RET
pop_gset1:
0102 E0E1 LDI R30,1
pop:
0103 9149 LD R20,Y+
0104 9159 LD R21,Y+
0105 FDE0 SBRC R30,0
0106 9508 RET
0107 9169 LD R22,Y+
0108 9179 LD R23,Y+
0109 FDE1 SBRC R30,1
010A 9508 RET
010B 90A9 LD R10,Y+
010C 90B9 LD R11,Y+
010D FDE2 SBRC R30,2
010E 9508 RET
010F 90C9 LD R12,Y+
0110 90D9 LD R13,Y+
0111 FDE3 SBRC R30,3
0112 9508 RET
0113 90E9 LD R14,Y+
0114 90F9 LD R15,Y+
0115 9508 RET
push_gset2:
0116 937A ST R23,-Y
0117 936A ST R22,-Y
0118 940C00FF JMP push_gset1
push_gset3:
011A 92BA ST R11,-Y
011B 92AA ST R10,-Y
011C 940C0116 JMP push_gset2
pop_gset2:
011E E0E2 LDI R30,2
011F 940C0103 JMP pop
pop_gset3:
0121 E0E4 LDI R30,4
0122 940C0103 JMP pop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -