📄 i2c抢答器_主机程序.lst
字号:
(0223) * 输入: 无 *
(0224) * 输出: 无 *
(0225) * 调用函数:无 *
(0226) ***********************************************************/
(0227) void Insert_Twi_Isr_Code(void)
(0228) {
(0229) unsigned char TWIStatus;
(0230)
(0231) TWIStatus = TWSR&0xF8;
_Insert_Twi_Isr_Code:
TWIStatus --> R16
00DA 910000B9 LDS R16,0xB9
00DC 7F08 ANDI R16,0xF8
(0232)
(0233) TWCR &= ~(BIT(TWINT)|BIT(TWSTA)|BIT(TWSTO));
00DD 918000BC LDS R24,0xBC
00DF 748F ANDI R24,0x4F
00E0 938000BC STS 0xBC,R24
(0234)
(0235) switch (TWIStatus)
00E2 2711 CLR R17
00E3 3108 CPI R16,0x18
00E4 E0E0 LDI R30,0
00E5 071E CPC R17,R30
00E6 F0D9 BEQ 0x0102
00E7 E188 LDI R24,0x18
00E8 E090 LDI R25,0
00E9 1780 CP R24,R16
00EA 0791 CPC R25,R17
00EB F02C BLT 0x00F1
00EC 3008 CPI R16,0x8
00ED E0E0 LDI R30,0
00EE 071E CPC R17,R30
00EF F071 BEQ 0x00FE
00F0 C031 RJMP 0x0122
00F1 3600 CPI R16,0x60
00F2 E0E0 LDI R30,0
00F3 071E CPC R17,R30
00F4 F1A9 BEQ 0x012A
00F5 3600 CPI R16,0x60
00F6 E0E0 LDI R30,0
00F7 071E CPC R17,R30
00F8 F14C BLT 0x0122
00F9 3800 CPI R16,0x80
00FA E0E0 LDI R30,0
00FB 071E CPC R17,R30
00FC F0A1 BEQ 0x0111
00FD C024 RJMP 0x0122
(0236) {
(0237) case SSend : //启动位已发送
(0238) {
(0239) TWDR = 0x00; //发送广播地址,写方向
00FE 2422 CLR R2
00FF 922000BB STS 0xBB,R2
(0240) break;
0101 C028 RJMP 0x012A
(0241) }
(0242)
(0243) case SLAWSendACK : //SLA+W已发送,收到ACK
(0244) {
(0245) p = &RecArr[0];
0102 E183 LDI R24,0x13
0103 E091 LDI R25,1
0104 93900101 STS p+1,R25
0106 93800100 STS p,R24
(0246) TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //广播地址+W发送完成,发送停止信号
0108 918000BC LDS R24,0xBC
010A 6180 ORI R24,0x10
010B 938000BC STS 0xBC,R24
(0247) TWIProcess = TWIProcessOver;
010D E081 LDI R24,1
010E 93800106 STS TWIProcess,R24
(0248) break;
0110 C019 RJMP 0x012A
(0249) }
(0250)
(0251) case SLAWRecACK :
(0252) {
(0253) break;
(0254) }
(0255)
(0256) case SRDataACK :
(0257) {
(0258) *p = TWDR;
0111 902000BB LDS R2,0xBB
0113 91E00100 LDS R30,p
0115 91F00101 LDS R31,p+1
0117 8220 STD Z+0,R2
(0259) p++;
0118 91800100 LDS R24,p
011A 91900101 LDS R25,p+1
011C 9601 ADIW R24,1
011D 93900101 STS p+1,R25
011F 93800100 STS p,R24
(0260) break;
0121 C008 RJMP 0x012A
(0261) }
(0262)
(0263) default :
(0264) {
(0265) TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //出现错误状态,总线恢复空闲状态
0122 918000BC LDS R24,0xBC
0124 6180 ORI R24,0x10
0125 938000BC STS 0xBC,R24
(0266) TWIProcess = TWIProcessERR; //当前TWI操作任务遇不明原因终止
0127 E281 LDI R24,0x21
0128 93800106 STS TWIProcess,R24
(0267) } //在操作的最后,我们并没有再次设置TWEN位,用意是提醒大家编程细心,"意外"清除TWEN位本来就是不对的
(0268)
(0269) }
(0270)
(0271) TWCR |= BIT(TWINT);
012A 918000BC LDS R24,0xBC
012C 6880 ORI R24,0x80
012D 938000BC STS 0xBC,R24
012F 9508 RET
(0272) }
(0273)
(0274) /***********************************************************
(0275) * 函数说明:虚拟端口刷新函数 *
(0276) * 输入: 无 *
(0277) * 输出: 无 *
(0278) * 调用函数:无 *
(0279) ***********************************************************/
(0280) void Port_refresh (void)
(0281) {
(0282) unsigned char i;
(0283)
(0284) SS_Low; //模拟#SS的下跳沿
_Port_refresh:
i --> R16
0130 982A CBI 0x05,2
(0285)
(0286) for (i=0; i<ExtPortNum; i++)
0131 2700 CLR R16
0132 C00C RJMP 0x013F
(0287) {
(0288) SPDR = PortBuffer[i]; //刷新虚拟端口的一个字节
0133 E088 LDI R24,0x8
0134 E091 LDI R25,1
0135 2FE0 MOV R30,R16
0136 27FF CLR R31
0137 0FE8 ADD R30,R24
0138 1FF9 ADC R31,R25
0139 8020 LDD R2,Z+0
013A BC2E OUT 0x2E,R2
(0289) while(!(SPSR&(1<<SPIF))); //等待通讯完成
013B B42D IN R2,0x2D
013C FE27 SBRS R2,7
013D CFFD RJMP 0x013B
013E 9503 INC R16
013F 3003 CPI R16,3
0140 F390 BCS 0x0133
(0290) }
(0291)
(0292) SS_High; //模拟#SS的上跳沿
0141 9A2A SBI 0x05,2
0142 9508 RET
_LEDDisplay:
LocalTime --> R20
0143 D103 RCALL push_gset1
(0293) }
(0294)
(0295) /***********************************************************
(0296) * 函数说明:显示驱动函数 *
(0297) * 输入: 无 *
(0298) * 输出: 无 *
(0299) * 调用函数:无 *
(0300) ***********************************************************/
(0301) void LEDDisplay(void)
(0302) {
(0303) static unsigned char ScanStatu = 0; //扫描状态标志,扫描程序内部使用
(0304) unsigned char LocalTime; //函数内部使用的时标
(0305)
(0306) LocalTime = g_wSystemTimer%20;
0144 E124 LDI R18,0x14
0145 E030 LDI R19,0
0146 91000102 LDS R16,g_wSystemTimer
0148 91100103 LDS R17,g_wSystemTimer+1
014A D0D8 RCALL mod16u
014B 2F40 MOV R20,R16
(0307)
(0308) if (LocalTime > 16)
014C E180 LDI R24,0x10
014D 1780 CP R24,R16
014E F408 BCC 0x0150
(0309) return;
014F C017 RJMP 0x0167
(0310) else
(0311) {
(0312) LocalTime >>= 1;
0150 9546 LSR R20
(0313) ScanPort = (~(1<<LocalTime));
0151 E001 LDI R16,1
0152 2F14 MOV R17,R20
0153 D138 RCALL lsl8
0154 2E20 MOV R2,R16
0155 9420 COM R2
0156 9220010A STS PortBuffer+2,R2
(0314) SegPort = (DisTab[LEDDisBuffer[LocalTime]]);
0158 E08B LDI R24,0xB
0159 E091 LDI R25,1
015A 2FE4 MOV R30,R20
015B 27FF CLR R31
015C 0FE8 ADD R30,R24
015D 1FF9 ADC R31,R25
015E 81E0 LDD R30,Z+0
015F 27FF CLR R31
0160 E384 LDI R24,0x34
0161 E090 LDI R25,0
0162 0FE8 ADD R30,R24
0163 1FF9 ADC R31,R25
0164 91E4 LPM R30,0(Z)
0165 93E00109 STS PortBuffer+1,R30
(0315) }
0167 D0E2 RCALL pop_gset1
0168 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) * 调用函数:无 *
(0062) ***********************************************************/
(0063) void winner (void)
(0064) {
(0065) unsigned int a,b;
(0066) a = ((((unsigned int)RecArr[1])<<4)|((unsigned int)RecArr[2]));
_winner:
b --> R16
a --> R18
0169 90200115 LDS R2,RecArr+2
016B 2433 CLR R3
016C 91200114 LDS R18,RecArr+1
016E 2733 CLR R19
016F 0F22 LSL R18
0170 1F33 ROL R19
0171 0F22 LSL R18
0172 1F33 ROL R19
0173 0F22 LSL R18
0174 1F33 ROL R19
0175 0F22 LSL R18
0176 1F33 ROL R19
0177 2922 OR R18,R2
0178 2933 OR R19,R3
(0067) b = ((((unsigned int)RecArr[4])<<4)|((unsigned int)RecArr[5]));
0179 90200118 LDS R2,0x118
017B 2433 CLR R3
017C 91000117 LDS R16,0x117
017E 2711 CLR R17
017F 0F00 LSL R16
0180 1F11 ROL R17
0181 0F00 LSL R16
0182 1F11 ROL R17
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -