📄 lesson9.lst
字号:
__text_start:
__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 940E00E5 CALL _main
_exit:
0050 CFFF RJMP _exit
_delay:
i --> R20
j --> R22
ms --> R16
0051 D0D7 RCALL push_gset2
FILE: I:\AVR视频教程\视频教程\lesson9\LESSON9\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 D0C9 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 D0B2 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 D08B RCALL pop_gset2
00A2 9508 RET
FILE: I:\AVR视频教程\视频教程\lesson9\LESSON9\LESSON9.C
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) #include "Skey.c"
(0006)
(0007) #define START 0X08
(0008) #define MT_SLA_ACK 0X18
(0009) #define MT_DATA_ACK 0X28
(0010)
(0011) #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //产生START信号
(0012) #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //产生STOP信号
(0013) #define Wait() while(!(TWCR&(1<<TWINT))) //等待当前操作完成
(0014) #define TestACK() (TWSR&0xF8) //取出状态码
(0015) #define SetACK() (TWCR|=(1<<TWEA)) //产生ACK
(0016) #define Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);} //发送一个字节(twi_d为写入的数据)
(0017)
(0018) void twi_init()
(0019) {
(0020) TWBR=0X20;
_twi_init:
00A3 E280 LDI R24,0x20
00A4 B980 OUT P00,R24
(0021) TWSR=0;
00A5 2422 CLR R2
00A6 B821 OUT P01,R2
(0022) TWCR=0X44;
00A7 E484 LDI R24,0x44
00A8 BF86 OUT P36,R24
(0023) }
00A9 9508 RET
_AD5161_writeB:
rdata --> Y+4
cmd --> R20
devadd --> R22
00AA D07E RCALL push_gset2
00AB 2F42 MOV R20,R18
00AC 2F60 MOV R22,R16
(0024) uchar AD5161_writeB(uchar devadd,uchar cmd,uchar rdata)
(0025) {
(0026) Start();
00AD EA84 LDI R24,0xA4
00AE BF86 OUT P36,R24
(0027) Wait();
00AF B626 IN R2,P36
00B0 FE27 SBRS R2,7
00B1 CFFD RJMP 0x00AF
(0028) if(TestACK()!=START)
00B2 B181 IN R24,P01
00B3 7F88 ANDI R24,0xF8
00B4 3088 CPI R24,0x8
00B5 F011 BEQ 0x00B8
(0029) {
(0030) return 0;
00B6 2700 CLR R16
00B7 C02B RJMP 0x00E3
(0031) }
(0032) Writebyte(devadd);
00B8 B963 OUT P03,R22
00B9 E884 LDI R24,0x84
00BA BF86 OUT P36,R24
(0033) Wait();
00BB B626 IN R2,P36
00BC FE27 SBRS R2,7
00BD CFFD RJMP 0x00BB
(0034) if(TestACK()!=MT_SLA_ACK)
00BE B181 IN R24,P01
00BF 7F88 ANDI R24,0xF8
00C0 3188 CPI R24,0x18
00C1 F011 BEQ 0x00C4
(0035) {
(0036) return 0;
00C2 2700 CLR R16
00C3 C01F RJMP 0x00E3
(0037) }
(0038) Writebyte(cmd);
00C4 B943 OUT P03,R20
00C5 E884 LDI R24,0x84
00C6 BF86 OUT P36,R24
(0039) Wait();
00C7 B626 IN R2,P36
00C8 FE27 SBRS R2,7
00C9 CFFD RJMP 0x00C7
(0040) if(TestACK()!=MT_DATA_ACK)
00CA B181 IN R24,P01
00CB 7F88 ANDI R24,0xF8
00CC 3288 CPI R24,0x28
00CD F011 BEQ 0x00D0
(0041) {
(0042) return 0;
00CE 2700 CLR R16
00CF C013 RJMP 0x00E3
(0043) }
(0044) Writebyte(rdata);
00D0 800C LDD R0,4+Y
00D1 B803 OUT P03,R0
00D2 E884 LDI R24,0x84
00D3 BF86 OUT P36,R24
(0045) Wait();
00D4 B626 IN R2,P36
00D5 FE27 SBRS R2,7
00D6 CFFD RJMP 0x00D4
(0046) if(TestACK()!=MT_DATA_ACK)
00D7 B181 IN R24,P01
00D8 7F88 ANDI R24,0xF8
00D9 3288 CPI R24,0x28
00DA F011 BEQ 0x00DD
(0047) {
(0048) return 0;
00DB 2700 CLR R16
00DC C006 RJMP 0x00E3
(0049) }
(0050) Stop();
00DD E984 LDI R24,0x94
00DE BF86 OUT P36,R24
(0051) delay(10);
00DF E00A LDI R16,0xA
00E0 E010 LDI R17,0
00E1 DF6F RCALL _delay
(0052) return 1;
00E2 E001 LDI R16,1
00E3 D049 RCALL pop_gset2
00E4 9508 RET
_main:
data --> R20
i --> R10
00E5 9721 SBIW R28,1
(0053) }
(0054)
(0055) void main()
(0056) {
(0057) uchar i,data=0;
00E6 2744 CLR R20
(0058) twi_init();
00E7 DFBB RCALL _twi_init
(0059) AD5161_writeB(0X58,0,data);
00E8 8348 STD R20,0+Y
00E9 2722 CLR R18
00EA E508 LDI R16,0x58
00EB DFBE RCALL _AD5161_writeB
00EC C022 RJMP 0x010F
(0060) while(1)
(0061) {
(0062) if(key_press())
00ED DF77 RCALL _key_press
00EE 2300 TST R16
00EF F0F9 BEQ 0x010F
(0063) {
(0064) i=key_scan();
00F0 DF85 RCALL _key_scan
00F1 2EA0 MOV R10,R16
(0065)
(0066) switch(i)
00F2 2D6A MOV R22,R10
00F3 2777 CLR R23
00F4 3060 CPI R22,0
00F5 0767 CPC R22,R23
00F6 F069 BEQ 0x0104
00F7 3061 CPI R22,1
00F8 E0E0 LDI R30,0
00F9 077E CPC R23,R30
00FA F059 BEQ 0x0106
00FB 3062 CPI R22,2
00FC E0E0 LDI R30,0
00FD 077E CPC R23,R30
00FE F049 BEQ 0x0108
00FF 3063 CPI R22,3
0100 E0E0 LDI R30,0
0101 077E CPC R23,R30
0102 F039 BEQ 0x010A
0103 C007 RJMP 0x010B
(0067) {
(0068) case 0:
(0069) data=data-16;
0104 5140 SUBI R20,0x10
(0070) break;
0105 C005 RJMP 0x010B
(0071) case 1:
(0072) data=data+16;
0106 5F40 SUBI R20,0xF0
(0073) break;
0107 C003 RJMP 0x010B
(0074) case 2:
(0075) data=0;
0108 2744 CLR R20
(0076) break;
0109 C001 RJMP 0x010B
(0077) case 3:
(0078) data=255;
010A EF4F LDI R20,0xFF
(0079) break;
(0080) }
(0081) AD5161_writeB(0x58,0,data);
010B 8348 STD R20,0+Y
010C 2722 CLR R18
010D E508 LDI R16,0x58
010E DF9B RCALL _AD5161_writeB
010F CFDD RJMP 0x00ED
(0082) }
(0083) }
(0084) }FILE: <library>
0110 9621 ADIW R28,1
0111 9508 RET
push_gset1:
0112 935A ST R21,-Y
0113 934A ST R20,-Y
0114 9508 RET
pop_gset1:
0115 E0E1 LDI R30,1
pop:
0116 9149 LD R20,Y+
0117 9159 LD R21,Y+
0118 FDE0 SBRC R30,0
0119 9508 RET
011A 9169 LD R22,Y+
011B 9179 LD R23,Y+
011C FDE1 SBRC R30,1
011D 9508 RET
011E 90A9 LD R10,Y+
011F 90B9 LD R11,Y+
0120 FDE2 SBRC R30,2
0121 9508 RET
0122 90C9 LD R12,Y+
0123 90D9 LD R13,Y+
0124 FDE3 SBRC R30,3
0125 9508 RET
0126 90E9 LD R14,Y+
0127 90F9 LD R15,Y+
0128 9508 RET
push_gset2:
0129 937A ST R23,-Y
012A 936A ST R22,-Y
012B 940C0112 JMP push_gset1
pop_gset2:
012D E0E2 LDI R30,2
012E 940C0116 JMP pop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -