📄 i2c抢答器_从机程序.lst
字号:
00D7 1FF9 ADC R31,R25
00D8 8020 LDD R2,Z+0
00D9 922000BB STS 0xBB,R2
(0208) TWISendCounter++;
00DB 91800101 LDS R24,TWISendCounter
00DD 5F8F SUBI R24,0xFF
00DE 93800101 STS TWISendCounter,R24
(0209) }
00E0 C023 RJMP 0x0104
(0210) else
(0211) {
(0212) TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //时间发送完成,停止总线
00E1 918000BC LDS R24,0xBC
00E3 6180 ORI R24,0x10
00E4 938000BC STS 0xBC,R24
(0213) TWIProcess = TWIProcessOver;
00E6 E081 LDI R24,1
00E7 93800100 STS TWIProcess,R24
(0214) }
(0215) break;
00E9 C01A RJMP 0x0104
(0216) }
(0217)
(0218) case GCAddRACK : //收到广播地址,ACK已发
(0219) {
(0220) TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //空闲总线
00EA 918000BC LDS R24,0xBC
00EC 6180 ORI R24,0x10
00ED 938000BC STS 0xBC,R24
(0221) TIMERSTART; //启动计时
00EF E084 LDI R24,4
00F0 93800081 STS 0x81,R24
(0222) break;
00F2 C011 RJMP 0x0104
(0223) }
(0224)
(0225) case ArbiLost : //仲裁失败
(0226) {
(0227) TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //恢复从机状态
00F3 918000BC LDS R24,0xBC
00F5 6180 ORI R24,0x10
00F6 938000BC STS 0xBC,R24
(0228) TWIProcess = TWIPrecessHan;
00F8 E381 LDI R24,0x31
00F9 93800100 STS TWIProcess,R24
(0229) break;
00FB C008 RJMP 0x0104
(0230) }
(0231)
(0232) default :
(0233) {
(0234) TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //出现错误状态,总线恢复空闲状态
00FC 918000BC LDS R24,0xBC
00FE 6180 ORI R24,0x10
00FF 938000BC STS 0xBC,R24
(0235) TWIProcess = TWIProcessERR; //当前TWI操作任务遇不明原因终止
0101 E281 LDI R24,0x21
0102 93800100 STS TWIProcess,R24
(0236) } //在操作的最后,我们并没有再次设置TWEN位,用意是提醒大家编程细心,"意外"清除TWEN位本来就是不对的
(0237)
(0238) }
(0239)
(0240) TWCR |= BIT(TWINT);
0104 918000BC LDS R24,0xBC
0106 6880 ORI R24,0x80
0107 938000BC STS 0xBC,R24
0109 9508 RET
FILE: D:\实例17_I2C抢答器_从机程序\System.c
(0001) /*********************************************************/
(0002) /* */
(0003) /* 实例17 I2C抢答器 从机程序 */
(0004) /* */
(0005) /* 程序设计 江海波 */
(0006) /* */
(0007) /* 编写时间 : 2007-8 版本 : V1.0 */
(0008) /* */
(0009) /* 提示 : 代码受版权保护,示例程序用于工程应谨慎 */
(0010) /* */
(0011) /* E-mail : soundman@sohu.com */
(0012) /*-------------------------------------------------------*/
(0013) /* 硬件环境: */
(0014) /* */
(0015) /* 实验电路板,ATmega48单片机,CPU时钟1MHz */
(0016) /* ------------------------------------------------------*/
(0017) /* 软件环境: */
(0018) /* */
(0019) /* ICCAVR 6.31A */
(0020) /* ------------------------------------------------------*/
(0021) /* 最后修改时间: */
(0022) /* */
(0023) /*-------------------------------------------------------*/
(0024) /* 历史版本纪录: */
(0025) /* */
(0026) /*********************************************************/
(0027)
(0028) /********************
(0029) * 头 文 件 配 置 区 *
(0030) ********************/
(0031) # include "PF_Config.h"
(0032)
(0033) /********************
(0034) * 系 统 宏 定 义 *
(0035) ********************/
(0036)
(0037) /*------------------*
(0038) * 常 数 宏 定 义 *
(0039) *------------------*/
(0040)
(0041) /*------------------*
(0042) * 动 作 宏 定 义 *
(0043) *------------------*/
(0044)
(0045) /********************
(0046) * 模块结构体定义区 *
(0047) ********************/
(0048)
(0049) /********************
(0050) * 模块函数声明区 *
(0051) ********************/
(0052)
(0053) /********************
(0054) * 模块变量声明区 *
(0055) ********************/
(0056)
(0057) /***********************************************************
(0058) * 函数说明:主函数 *
(0059) * 输入: 无 *
(0060) * 输出: 无 *
(0061) * 调用函数:System_INIT() *
(0062) ***********************************************************/
(0063) void main(void)
(0064) {
(0065) System_INIT(); //代码初始化
_main:
010A DF5D RCALL _System_INIT
(0066)
(0067) Time[0] = 0xB0;
010B EB80 LDI R24,0xB0
010C 93800102 STS Time,R24
010E C02B RJMP 0x013A
(0068)
(0069) while(1)
(0070) {
(0071) if(TCCR1B != 0)
010F 90200081 LDS R2,0x81
0111 2022 TST R2
0112 F139 BEQ 0x013A
(0072) {
(0073) if((PINB&0x01) == 0x00)
0113 9918 SBIC 0x03,0
0114 C025 RJMP 0x013A
(0074) {
(0075) TIMERSTOP;
0115 2422 CLR R2
0116 92200081 STS 0x81,R2
(0076) Time[0] = TCNT1H;
0118 90200085 LDS R2,0x85
011A 92200102 STS Time,R2
(0077) Time[1] = TCNT1L;
011C 90200084 LDS R2,0x84
011E 92200103 STS Time+1,R2
(0078) TWCR |= (1<<TWSTA); //启动总线
0120 918000BC LDS R24,0xBC
0122 6280 ORI R24,0x20
0123 938000BC STS 0xBC,R24
(0079) TWIProcess = TWIInProcess;
0125 2422 CLR R2
0126 92200100 STS TWIProcess,R2
0128 C00D RJMP 0x0136
(0080) while(TWIProcess != TWIProcessOver)
(0081) {
(0082) if (TWIProcess == TWIPrecessHan)
0129 91800100 LDS R24,TWIProcess
012B 3381 CPI R24,0x31
012C F429 BNE 0x0132
(0083) TWCR |= (1<<TWSTA); //再次尝试竞争总线
012D 918000BC LDS R24,0xBC
012F 6280 ORI R24,0x20
0130 938000BC STS 0xBC,R24
(0084) if (TWIProcess == TWIProcessERR)
FILE: <library>
0132 91800100 LDS R24,TWIProcess
0134 3281 CPI R24,0x21
0135 F401 BNE 0x0136
0136 91800100 LDS R24,TWIProcess
0138 3081 CPI R24,1
0139 F779 BNE 0x0129
013A CFD4 RJMP 0x010F
013B 9508 RET
push_gset5:
013C 92FA ST R15,-Y
013D 92EA ST R14,-Y
push_gset4:
013E 92DA ST R13,-Y
013F 92CA ST R12,-Y
push_gset3:
0140 92BA ST R11,-Y
0141 92AA ST R10,-Y
push_gset2:
0142 937A ST R23,-Y
0143 936A ST R22,-Y
push_gset1:
0144 935A ST R21,-Y
0145 934A ST R20,-Y
0146 9508 RET
pop_gset1:
0147 E0E1 LDI R30,1
pop:
0148 9149 LD R20,Y+
0149 9159 LD R21,Y+
014A FDE0 SBRC R30,0
014B 9508 RET
014C 9169 LD R22,Y+
014D 9179 LD R23,Y+
014E FDE1 SBRC R30,1
014F 9508 RET
0150 90A9 LD R10,Y+
0151 90B9 LD R11,Y+
0152 FDE2 SBRC R30,2
0153 9508 RET
0154 90C9 LD R12,Y+
0155 90D9 LD R13,Y+
0156 FDE3 SBRC R30,3
0157 9508 RET
0158 90E9 LD R14,Y+
0159 90F9 LD R15,Y+
015A 9508 RET
push_lset:
015B 93FA ST R31,-Y
015C 93EA ST R30,-Y
015D 93BA ST R27,-Y
015E 93AA ST R26,-Y
015F 939A ST R25,-Y
0160 938A ST R24,-Y
0161 933A ST R19,-Y
0162 932A ST R18,-Y
0163 931A ST R17,-Y
0164 930A ST R16,-Y
0165 929A ST R9,-Y
0166 928A ST R8,-Y
0167 927A ST R7,-Y
0168 926A ST R6,-Y
0169 925A ST R5,-Y
016A 924A ST R4,-Y
016B 923A ST R3,-Y
016C 922A ST R2,-Y
016D 921A ST R1,-Y
016E 920A ST R0,-Y
016F B60F IN R0,0x3F
0170 920A ST R0,-Y
0171 9508 RET
pop_lset:
0172 9009 LD R0,Y+
0173 BE0F OUT 0x3F,R0
0174 9009 LD R0,Y+
0175 9019 LD R1,Y+
0176 9029 LD R2,Y+
0177 9039 LD R3,Y+
0178 9049 LD R4,Y+
0179 9059 LD R5,Y+
017A 9069 LD R6,Y+
017B 9079 LD R7,Y+
017C 9089 LD R8,Y+
017D 9099 LD R9,Y+
017E 9109 LD R16,Y+
017F 9119 LD R17,Y+
0180 9129 LD R18,Y+
0181 9139 LD R19,Y+
0182 9189 LD R24,Y+
0183 9199 LD R25,Y+
0184 91A9 LD R26,Y+
0185 91B9 LD R27,Y+
0186 91E9 LD R30,Y+
0187 91F9 LD R31,Y+
0188 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -