📄 project.lst
字号:
(0134) delay(20000);
0206 E200 LDI R16,0x20
0207 E41E LDI R17,0x4E
0208 DF3E RCALL _delay
(0135) Set_PD(0);
0209 2700 CLR R16
020A DF4D RCALL _Set_PD
(0136) Seek_Segment(Snd_Welc); //搜索相应语音信息段
020B 9100006A LDS R16,0x6A
020D DF6A RCALL _Seek_Segment
(0137) Play(); //播放
(0138) }
020E CF8C RJMP _Play
(0139)
(0140) //****************************I2C驱动程序****************************//
(0141) void Set_SCL(uchar i) //定义MAX6959时钟线为PA^7
(0142) {if(i) PORTA |=0x80;
_Set_SCL:
i --> R16
020F 2300 TST R16
0210 F011 BEQ 0x0213
0211 9ADF SBI 0x1B,7
0212 C003 RJMP 0x0216
(0143) else PORTA &=0x7f;
0213 B38B IN R24,0x1B
0214 778F ANDI R24,0x7F
0215 BB8B OUT 0x1B,R24
(0144) }
0216 9508 RET
(0145)
(0146) void Set_SDA(uchar i) //定义MAX6959数据线为PA^6
(0147) {if(i) PORTA |=0x40;
_Set_SDA:
i --> R16
0217 2300 TST R16
0218 F011 BEQ 0x021B
0219 9ADE SBI 0x1B,6
021A C003 RJMP 0x021E
(0148) else PORTA &=0xbf;
021B B38B IN R24,0x1B
021C 7B8F ANDI R24,0xBF
021D BB8B OUT 0x1B,R24
(0149) }
021E 9508 RET
(0150)
(0151) void Start() //I2C总线的开始条件
(0152) {Set_SDA(1); //SDA=1;
_Start:
021F E001 LDI R16,1
0220 DFF6 RCALL _Set_SDA
(0153) Set_SCL(1); //SCL=1;
0221 E001 LDI R16,1
0222 DFEC RCALL _Set_SCL
(0154) delay(100); //等待时钟信号变高
0223 E604 LDI R16,0x64
0224 E010 LDI R17,0
0225 DF21 RCALL _delay
(0155) Set_SDA(0); //SDA=0;
0226 2700 CLR R16
0227 DFEF RCALL _Set_SDA
(0156) delay(100);
0228 E604 LDI R16,0x64
0229 E010 LDI R17,0
022A DF1C RCALL _delay
(0157) Set_SCL(0); // SCL=0;
022B 2700 CLR R16
(0158) }
022C CFE2 RJMP _Set_SCL
(0159)
(0160) void Stop() //I2C总线结束条件
(0161) {Set_SDA(0); //SDA=0;
_Stop:
022D 2700 CLR R16
022E DFE8 RCALL _Set_SDA
(0162) delay(100);
022F E604 LDI R16,0x64
0230 E010 LDI R17,0
0231 DF15 RCALL _delay
(0163) Set_SCL(1); //SCL=1;
0232 E001 LDI R16,1
0233 DFDB RCALL _Set_SCL
(0164) delay(100); //等待时钟信号变低
0234 E604 LDI R16,0x64
0235 E010 LDI R17,0
0236 DF10 RCALL _delay
(0165) Set_SDA(1); //SDA=1;
0237 E001 LDI R16,1
0238 DFDE RCALL _Set_SDA
(0166) delay(100);
0239 E604 LDI R16,0x64
023A E010 LDI R17,0
023B DF0B RCALL _delay
(0167) Set_SCL(0); //SCL=0;
023C 2700 CLR R16
(0168) }
023D CFD1 RJMP _Set_SCL
(0169)
(0170) void Ack() //I2C总线应答
(0171) {Set_SDA(0); //SDA=0;
_Ack:
023E 2700 CLR R16
023F DFD7 RCALL _Set_SDA
(0172) delay(50);
0240 E302 LDI R16,0x32
0241 E010 LDI R17,0
0242 DF04 RCALL _delay
(0173) Set_SCL(1); //SCL=1;
0243 E001 LDI R16,1
0244 DFCA RCALL _Set_SCL
(0174) delay(100);
0245 E604 LDI R16,0x64
0246 E010 LDI R17,0
0247 DEFF RCALL _delay
(0175) Set_SCL(0); //SCL=0;
0248 2700 CLR R16
0249 DFC5 RCALL _Set_SCL
(0176) delay(50);
024A E302 LDI R16,0x32
024B E010 LDI R17,0
024C DEFA RCALL _delay
(0177) Set_SDA(1); //SDA=1;
024D E001 LDI R16,1
(0178) }
024E CFC8 RJMP _Set_SDA
(0179)
(0180) void Nack() //I2C总线应答非
(0181) {Set_SDA(1); //SDA=1;
_Nack:
024F E001 LDI R16,1
0250 DFC6 RCALL _Set_SDA
(0182) delay(50);
0251 E302 LDI R16,0x32
0252 E010 LDI R17,0
0253 DEF3 RCALL _delay
(0183) Set_SCL(1); //SCL=1;
0254 E001 LDI R16,1
0255 DFB9 RCALL _Set_SCL
(0184) delay(100);
0256 E604 LDI R16,0x64
0257 E010 LDI R17,0
0258 DEEE RCALL _delay
(0185) Set_SCL(0); //SCL=0;
0259 2700 CLR R16
025A DFB4 RCALL _Set_SCL
(0186) delay(50);
025B E302 LDI R16,0x32
025C E010 LDI R17,0
025D DEE9 RCALL _delay
(0187) Set_SDA(0); //SDA=0;
025E 2700 CLR R16
(0188) }
025F CFB7 RJMP _Set_SDA
(0189)
(0190) void Check_Ack() //I2C总线应答检查
(0191) {Set_SDA(1); //SDA=1;
_Check_Ack:
0260 E001 LDI R16,1
0261 DFB5 RCALL _Set_SDA
(0192) Set_SCL(1); //SCL=1;
0262 E001 LDI R16,1
0263 DFAB RCALL _Set_SCL
(0193) Ack_Flag=0; //清除应答标志;
0264 2422 CLR R2
0265 922000B1 STS _Ack_Flag,R2
(0194) DDRA&=0xbf; //设置SDA为输入
0267 B38A IN R24,0x1A
0268 7B8F ANDI R24,0xBF
0269 BB8A OUT 0x1A,R24
(0195) if(!((PINA & 0x40)>>6))
026A B389 IN R24,0x19
026B 7480 ANDI R24,0x40
026C 9586 LSR R24
026D 9586 LSR R24
026E 9586 LSR R24
026F 9586 LSR R24
0270 9586 LSR R24
0271 9586 LSR R24
0272 2388 TST R24
0273 F449 BNE 0x027D
(0196) {delay(50);
0274 E302 LDI R16,0x32
0275 E010 LDI R17,0
0276 DED0 RCALL _delay
(0197) Set_SCL(0); //SCL=0;
0277 2700 CLR R16
0278 DF96 RCALL _Set_SCL
(0198) delay(100);}
0279 E604 LDI R16,0x64
027A E010 LDI R17,0
027B DECB RCALL _delay
027C C00B RJMP 0x0288
(0199) else
(0200) {Ack_Flag=1; //收到应答;
027D E081 LDI R24,1
027E 938000B1 STS _Ack_Flag,R24
(0201) delay(50);
0280 E302 LDI R16,0x32
0281 E010 LDI R17,0
0282 DEC4 RCALL _delay
(0202) Set_SCL(0); //SCL=0;
0283 2700 CLR R16
0284 DF8A RCALL _Set_SCL
(0203) delay(100);}
0285 E604 LDI R16,0x64
0286 E010 LDI R17,0
0287 DEBF RCALL _delay
(0204) DDRA |=0xff; //重新设置SDA为输出
0288 B38A IN R24,0x1A
0289 6F8F ORI R24,0xFF
028A BB8A OUT 0x1A,R24
(0205) }
028B 9508 RET
(0206)
(0207) void Write_Bit0() //写1bit数据:0
(0208) {Set_SDA(0); //SDA=0;
_Write_Bit0:
028C 2700 CLR R16
028D DF89 RCALL _Set_SDA
(0209) Set_SCL(1); //SCL=1;
028E E001 LDI R16,1
028F DF7F RCALL _Set_SCL
(0210) delay(100);
0290 E604 LDI R16,0x64
0291 E010 LDI R17,0
0292 DEB4 RCALL _delay
(0211) Set_SCL(0); //SCL=0;
0293 2700 CLR R16
(0212) }
0294 CF7A RJMP _Set_SCL
(0213)
(0214) void Write_Bit1() //写1bit数据:1
(0215) {Set_SDA(1); //SDA=1;
_Write_Bit1:
0295 E001 LDI R16,1
0296 DF80 RCALL _Set_SDA
(0216) Set_SCL(1); //SCL=1;
0297 E001 LDI R16,1
0298 DF76 RCALL _Set_SCL
(0217) delay(100);
0299 E604 LDI R16,0x64
029A E010 LDI R17,0
029B DEAB RCALL _delay
(0218) Set_SCL(0); //SCL=0;
029C 2700 CLR R16
029D DF71 RCALL _Set_SCL
(0219) Set_SDA(0); //SDA=0;
029E 2700 CLR R16
(0220) }
029F CF77 RJMP _Set_SDA
_Write_Byte:
i --> R20
Data --> R22
02A0 DCC6 RCALL push_gset2
02A1 2F60 MOV R22,R16
(0221)
(0222) void Write_Byte(uchar Data) //写一字节数据Data
(0223) {uchar i;
(0224) for(i=0;i<8;i++)
02A2 2744 CLR R20
02A3 C007 RJMP 0x02AB
(0225) {if(Data & 0x80) Write_Bit1(); //传输位从高位到低位,先传最高位
02A4 FF67 SBRS R22,7
02A5 C002 RJMP 0x02A8
02A6 DFEE RCALL _Write_Bit1
02A7 C001 RJMP 0x02A9
(0226) else Write_Bit0();
02A8 DFE3 RCALL _Write_Bit0
(0227) Data <<=1;} //数据左移
02A9 0F66 LSL R22
02AA 9543 INC R20
02AB 3048 CPI R20,0x8
02AC F3B8 BCS 0x02A4
(0228) }
02AD DC9C RCALL pop_gset2
02AE 9508 RET
_Read_Byte:
j --> R20
Read_Data --> R22
02AF DCB7 RCALL push_gset2
(0229)
(0230) uchar Read_Byte() //读一字节数据:返回值即读的数据
(0231) {uchar Read_Data=0xff; // Read_Data为读入的数据,初始值为0xff
02B0 EF6F LDI R22,0xFF
(0232) uchar j;
(0233) for (j=0;j<8;j++)
02B1 2744 CLR R20
02B2 C013 RJMP 0x02C6
(0234) {Set_SDA(1);
02B3 E001 LDI R16,1
02B4 DF62 RCALL _Set_SDA
(0235) Set_SCL(1);
02B5 E001 LDI R16,1
02B6 DF58 RCALL _Set_SCL
(0236) DDRA &=0xbf;
02B7 B38A IN R24,0x1A
02B8 7B8F ANDI R24,0xBF
02B9 BB8A OUT 0x1A,R24
(0237) if((PINA & 0x40)==0)
02BA 99CE SBIC 0x19,6
02BB C005 RJMP 0x02C1
(0238) {Read_Data <<=1;
02BC 0F66 LSL R22
(0239) Read_Data=(Read_Data & 0xfe);
02BD 7F6E ANDI R22,0xFE
(0240) Set_SCL(0);}
02BE 2700 CLR R16
02BF DF4F RCALL _Set_SCL
02C0 C004 RJMP 0x02C5
(0241) else
(0242) {Read_Data <<=1;
02C1 0F66 LSL R22
(0243) Read_Data =( Read_Data | 0x01);
02C2 6061 ORI R22,1
(0244) Set_SCL(0);}}
02C3 2700 CLR R16
02C4 DF4A RCALL _Set_SCL
02C5 9543 INC R20
02C6 3048 CPI R20,0x8
02C7 F358 BCS 0x02B3
(0245) DDRA |=0x40;
02C8 9AD6 SBI 0x1A,6
(0246) return(Read_Data);
02C9 2F06 MOV R16,R22
02CA DC7F RCALL pop_gset2
02CB 9508 RET
_Write_1byte:
Data --> R20
Address --> R22
Slave --> R10
02CC DC9D RCALL push_gset3
02CD 2F62 MOV R22,R18
02CE 2EA0 MOV R10,R16
02CF 814E LDD R20,Y+6
(0247) }
(0248)
(0249) //***************************写一字节数据****************************//
(0250) //向从地址为Slave的IIC器件的Address地址写一字节数据Data
(0251) void Write_1byte(uchar Slave,uchar Address,uchar Data)
(0252) {Start(); //开始
02D0 DF4E RCALL _Start
(0253) Write_Byte(Slave); //写I2C器件地址
02D1 2D0A MOV R16,R10
02D2 DFCD RCALL _Write_Byte
(0254) do Check_Ack(); //检查应答位
02D3 DF8C RCALL _Check_Ack
(0255) while(Ack_Flag==1);
02D4 918000B1 LDS R24,_Ack_Flag
02D6 3081 CPI R24,1
02D7 F3D9 BEQ 0x02D3
(0256) Write_Byte(Address); //送寄存器地址
02D8 2F06 MOV R16,R22
02D9 DFC6 RCALL _Write_Byte
(0257) do Check_Ack(); //检查应答位
02DA DF85 RCALL _Check_Ack
(0258) while(Ack_Flag==1);
02DB 918000B1 LDS R24,_Ack_Flag
02DD 3081 CPI R24,1
02DE F3D9 BEQ 0x02DA
(0259) Write_Byte(Data); //写入一字节数据
02DF 2F04 MOV R16,R20
02E0 DFBF RCALL _Write_Byte
(0260) do Check_Ack(); //检查应答位
02E1 DF7E RCALL _Check_Ack
(0261) while(Ack_Flag==1);
02E2 918000B1 LDS R24,_Ack_Flag
02E4 3081 CPI R24,1
02E5 F3D9 BEQ 0x02E1
(0262) Stop(); //停止
02E6 DF46 RCALL _Stop
(0263) }
02E7 DC64 RCALL pop_gset3
02E8 9508 RET
_Write_2byte:
Data1 --> R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -