📄 tuner.lst
字号:
__text_start:
__start:
E1 EFCF LDI R28,0xFF
E2 E1D0 LDI R29,0x10
E3 BFCD OUT 0x3D,R28
E4 BFDE OUT 0x3E,R29
E5 53CC SUBI R28,0x3C
E6 40D0 SBCI R29,0
E7 EA0A LDI R16,0xAA
E8 8308 STD Y+0,R16
E9 2400 CLR R0
EA E3E6 LDI R30,0x36
EB E0F2 LDI R31,2
EC E012 LDI R17,2
ED 33E6 CPI R30,0x36
EE 07F1 CPC R31,R17
EF F011 BEQ 0x00F2
F0 9201 ST R0,Z+
F1 CFFB RJMP 0x00ED
F2 8300 STD Z+0,R16
F3 E8EC LDI R30,0x8C
F4 E0F0 LDI R31,0
F5 E0A0 LDI R26,0
F6 E0B1 LDI R27,1
F7 E011 LDI R17,1
F8 E000 LDI R16,0
F9 BF0B OUT 0x3B,R16
FA 3CE2 CPI R30,0xC2
FB 07F1 CPC R31,R17
FC F021 BEQ 0x0101
FD 95C8 LPM
FE 9631 ADIW R30,1
FF 920D ST R0,X+
100 CFF9 RJMP 0x00FA
101 940E 01C6 CALL _main
_exit:
103 CFFF RJMP _exit
_delay_us:
i --> R10
count --> R16
104 92AA ST R10,-Y
FILE: E:\电视接收头\高频头项目\avr\SRC\I2C.c
(0001) #include "..\inc\main.h"
(0002)
(0003) BYTE ack=0;
(0004)
(0005) //函数声明
(0006) void delay_us(BYTE count);
(0007) void Start_I2C(void);
(0008) void Stop_I2C(void);
(0009) void Ack_I2C(BYTE a);
(0010) void SendByte(BYTE c);
(0011) BYTE ReceiveByte(void);
(0012)
(0013) void delay_us(BYTE count)
(0014) {
(0015) BYTE i;
(0016) for(i=0;i<count;i++)
105 24AA CLR R10
106 C00B RJMP 0x0112
(0017) {
(0018) asm("nop");
107 0000 NOP
(0019) asm("nop");
108 0000 NOP
(0020) asm("nop");
109 0000 NOP
(0021) asm("nop");
10A 0000 NOP
(0022) asm("nop");
10B 0000 NOP
(0023) asm("nop");
10C 0000 NOP
(0024) asm("nop");
10D 0000 NOP
(0025) asm("nop");
10E 0000 NOP
(0026) asm("nop");
10F 0000 NOP
(0027) asm("nop");
110 0000 NOP
111 94A3 INC R10
112 16A0 CP R10,R16
113 F398 BCS 0x0107
114 90A9 LD R10,Y+
115 9508 RET
(0028) }
(0029) }
(0030)
(0031) void Start_I2C(void)
(0032) {
(0033) I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
_Start_I2C:
116 EA80 LDI R24,0xA0
117 BB81 OUT 0x11,R24
(0034) SDA_H; /*发送起始条件的数据信号*/
118 9A97 SBI 0x12,7
(0035) delay_us(1);
119 E001 LDI R16,1
11A DFE9 RCALL _delay_us
(0036) SCL_H;
11B 9A95 SBI 0x12,5
(0037) delay_us(5); /*起始条件建立时间大于4.7us,延时*/
11C E005 LDI R16,5
11D DFE6 RCALL _delay_us
(0038) SDA_L; /*发送起始信号*/
11E 9897 CBI 0x12,7
(0039) delay_us(4); /*起始条件锁定时间大于4μs*/
11F E004 LDI R16,4
120 DFE3 RCALL _delay_us
(0040) SCL_L; /*钳住I2C总线,准备发送或接收数据 */
121 9895 CBI 0x12,5
(0041) delay_us(2);
122 E002 LDI R16,2
123 DFE0 RCALL _delay_us
124 9508 RET
(0042) }
(0043)
(0044) void Stop_I2C(void)
(0045) {
(0046) I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
_Stop_I2C:
125 EA80 LDI R24,0xA0
126 BB81 OUT 0x11,R24
(0047) SDA_L; /*发送结束条件的数据信号*/
127 9897 CBI 0x12,7
(0048) delay_us(1);
128 E001 LDI R16,1
129 DFDA RCALL _delay_us
(0049) SCL_H; /*结束条件建立时间大于4us*/
12A 9A95 SBI 0x12,5
(0050) delay_us(5);
12B E005 LDI R16,5
12C DFD7 RCALL _delay_us
(0051) SDA_H; /*发送I2C总线结束信号*/
12D 9A97 SBI 0x12,7
(0052) delay_us(4);
12E E004 LDI R16,4
12F DFD4 RCALL _delay_us
(0053) I2C_DDR=~((1<<SDA)|(1<<SCL));
130 E58F LDI R24,0x5F
131 EF9F LDI R25,0xFF
132 BB81 OUT 0x11,R24
(0054) SDA_H;
133 9A97 SBI 0x12,7
(0055) SCL_H;
134 9A95 SBI 0x12,5
135 9508 RET
_Ack_I2C:
a --> R10
136 92AA ST R10,-Y
137 2EA0 MOV R10,R16
(0056) }
(0057)
(0058) void Ack_I2C(BYTE a)
(0059) {
(0060) I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
138 EA80 LDI R24,0xA0
139 BB81 OUT 0x11,R24
(0061) if(a==0) /*在此发出应答或非应答信号 */
13A 20AA TST R10
13B F411 BNE 0x013E
(0062) {
(0063) SDA_L;
13C 9897 CBI 0x12,7
(0064) }
13D C001 RJMP 0x013F
(0065) else
(0066) {
(0067) SDA_H;
13E 9A97 SBI 0x12,7
(0068) }
(0069) delay_us(4);
13F E004 LDI R16,4
140 DFC3 RCALL _delay_us
(0070) SCL_H;
141 9A95 SBI 0x12,5
(0071) delay_us(4); /*时钟低电平周期大于4μs*/
142 E004 LDI R16,4
143 DFC0 RCALL _delay_us
(0072) SCL_L; /*清时钟线,钳住I2C总线以便继续接收*/
144 9895 CBI 0x12,5
(0073) delay_us(2);
145 E002 LDI R16,2
146 DFBD RCALL _delay_us
147 90A9 LD R10,Y+
148 9508 RET
_SendByte:
BitCnt --> R20
c --> R10
149 92AA ST R10,-Y
14A 934A ST R20,-Y
14B 2EA0 MOV R10,R16
(0074) }
(0075)
(0076) void SendByte(BYTE c)
(0077) {
(0078) BYTE BitCnt;
(0079) I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA SCL端口均定义为输出*/
14C EA80 LDI R24,0xA0
14D BB81 OUT 0x11,R24
(0080) for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
14E 2744 CLR R20
14F C011 RJMP 0x0161
(0081) {
(0082) if((c<<BitCnt)&0x08) /*判断发送位*/
150 2D0A MOV R16,R10
151 2F14 MOV R17,R20
152 940E 01F8 CALL lsl8
154 2F80 MOV R24,R16
155 7088 ANDI R24,0x8
156 F011 BEQ 0x0159
(0083) {
(0084) SDA_H;
157 9A97 SBI 0x12,7
(0085) }
158 C001 RJMP 0x015A
(0086) else
(0087) {
(0088) SDA_L;
159 9897 CBI 0x12,7
(0089) }
(0090) delay_us(1);
15A E001 LDI R16,1
15B DFA8 RCALL _delay_us
(0091) SCL_H; /*置时钟线为高,通知被控器开始接收数据位*/
15C 9A95 SBI 0x12,5
(0092) delay_us(5); /*保证时钟高电平周期大于4μs*/
15D E005 LDI R16,5
15E DFA5 RCALL _delay_us
(0093) SCL_L;
15F 9895 CBI 0x12,5
160 9543 INC R20
161 3048 CPI R20,0x8
162 F368 BCS 0x0150
(0094) }
(0095) delay_us(2);
163 E002 LDI R16,2
164 DF9F RCALL _delay_us
(0096) I2C_DDR=~(1<<SDA); /*SDA定义为输入,置数据线为输入方式*/
165 E78F LDI R24,0x7F
166 EF9F LDI R25,0xFF
167 BB81 OUT 0x11,R24
(0097) SDA_H; /*8位发送完后释放数据线,准备接收应答位,打开内部上拉*/
168 9A97 SBI 0x12,7
(0098) delay_us(2);
169 E002 LDI R16,2
16A DF99 RCALL _delay_us
(0099) SCL_H;
16B 9A95 SBI 0x12,5
(0100) delay_us(3);
16C E003 LDI R16,3
16D DF96 RCALL _delay_us
(0101) if(ACK_FAIL) /*判断是否接收到应答信号*/
16E B380 IN R24,0x10
16F 9586 LSR R24
170 9586 LSR R24
171 9586 LSR R24
172 9586 LSR R24
173 9586 LSR R24
174 9586 LSR R24
175 9586 LSR R24
176 7081 ANDI R24,1
177 F021 BEQ 0x017C
(0102) {
(0103) ack=0;
178 2422 CLR R2
179 9220 0100 STS ack,R2
(0104) }
17B C003 RJMP 0x017F
(0105) else
(0106) {
(0107) ack=1;
17C E081 LDI R24,1
17D 9380 0100 STS ack,R24
(0108) }
(0109) SCL_L;
17F 9895 CBI 0x12,5
(0110) delay_us(2);
180 E002 LDI R16,2
181 DF82 RCALL _delay_us
182 9149 LD R20,Y+
183 90A9 LD R10,Y+
184 9508 RET
_ReceiveByte:
retc --> R10
BitCnt --> R20
185 92AA ST R10,-Y
186 934A ST R20,-Y
(0111) }
(0112)
(0113) BYTE ReceiveByte(void)
(0114) {
(0115) BYTE retc;
(0116) BYTE BitCnt;
(0117) retc=0;
187 24AA CLR R10
(0118) I2C_DDR=~(1<<SDA);
188 E78F LDI R24,0x7F
189 EF9F LDI R25,0xFF
18A BB81 OUT 0x11,R24
(0119) SDA_H; /*SDA定义为输入,置数据线为输入方式*/
18B 9A97 SBI 0x12,7
(0120) for(BitCnt=0;BitCnt<8;BitCnt++)
18C 2744 CLR R20
18D C017 RJMP 0x01A5
(0121) {
(0122) delay_us(1);
18E E001 LDI R16,1
18F DF74 RCALL _delay_us
(0123) SCL_L; /*置时钟线位低,准备接收数据位*/
190 9895 CBI 0x12,5
(0124) delay_us(5); /*时钟低电平周期大于4.7μs*/
191 E005 LDI R16,5
192 DF71 RCALL _delay_us
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -