📄 i2c抢答器_从机程序.lst
字号:
(0042) /********************
(0043) * 系 统 宏 定 义 *
(0044) ********************/
(0045)
(0046) /*------------------*
(0047) * 常 数 宏 定 义 *
(0048) *------------------*/
(0049)
(0050) #define SSend 0x08 //启动位已发送
(0051) #define RSSend 0x10 //复启动位已发送
(0052) #define SLAWSendACK 0x18 //SLA+W已发送,收到ACK
(0053) #define SLAWSendNAK 0x20 //SLA+W已发送,收到NAK
(0054) #define SLARSendACK 0x40 //SLA+R已发送,收到ACK
(0055) #define SLARSendNAK 0x48 //SLA+R已发送,收到ACK
(0056) #define TDataACK 0x28 //DATA已发送,收到ACK
(0057) #define TDataNAK 0x30 //DATA已发送,收到NAK
(0058) #define RDataACK 0x50 //DATA已收到,ACK已发送
(0059) #define RDataNAK 0x58 //DATA已收到,NAK已发送
(0060) #define GCAddRACK 0x70 //收到广播地址,ACK已发
(0061) #define ArbiLost 0x38 //仲裁失败
(0062)
(0063) #define TWIInProcess 0x00 //TWI操作中
(0064) #define TWIProcessOver 0x01 //TWI操作成功完成
(0065) #define TWIProcessNAK 0x11 //TWI操作中无法接收到主机应答
(0066) #define TWIProcessERR 0x21 //TWI操作遇到未知错误而终止
(0067) #define TWIPrecessHan 0x31 //TWI操作挂起
(0068)
(0069) /*------------------*
(0070) * 动 作 宏 定 义 *
(0071) *------------------*/
(0072)
(0073) /********************
(0074) * 模块结构体定义区 *
(0075) ********************/
(0076)
(0077) /********************
(0078) * 函 数 声 明 区 *
(0079) ********************/
(0080) void System_INIT(void);
(0081) void Insert_Timer1_OVF_ISR_Code(void);
(0082)
(0083) /********************
(0084) * 模块函数声明区 *
(0085) ********************/
(0086) static void Driver_INIT(void);
(0087)
(0088) /********************
(0089) * 模块变量声明区 *
(0090) ********************/
(0091)
(0092) /********************
(0093) * 全局变量声明区 *
(0094) ********************/
(0095) unsigned char Time[2];
(0096) unsigned char TWIProcess = TWIProcessOver;
(0097)
(0098) /***********************************************************
(0099) * 函数说明:软件驱动初始化函数 *
(0100) * 输入: 无 *
(0101) * 输出: 无 *
(0102) * 调用函数:无 *
(0103) ***********************************************************/
(0104) static void Driver_INIT(void)
(0105) {
_Driver_INIT:
0067 9508 RET
(0106) //*在这里插入你的各类软件驱动初始化代码*//
(0107) }
(0108)
(0109) /***********************************************************
(0110) * 函数说明:系统初始化函数 *
(0111) * 输入: 无 *
(0112) * 输出: 无 *
(0113) * 调用函数:Device_INIT() Driver_INIT() *
(0114) ***********************************************************/
(0115) void System_INIT(void)
(0116) {
(0117) CLI();
_System_INIT:
0068 94F8 BCLR 7
(0118)
(0119) Device_INIT();
0069 DFD1 RCALL _Device_INIT
(0120) Driver_INIT();
006A DFFC RCALL _Driver_INIT
(0121)
(0122) //*在这里插入你的系统环境变量初始化代码*//
(0123)
(0124) SEI();
006B 9478 BSET 7
006C 9508 RET
_Delay_ms:
n --> R20
Time --> R16
006D D0D6 RCALL push_gset1
(0125) }
(0126)
(0127) /***********************************************************
(0128) * 函数说明:毫秒级延时函数 *
(0129) * 输入: 无 *
(0130) * 输出: 无 *
(0131) * 调用函数:无 *
(0132) ***********************************************************/
(0133) void Delay_ms(unsigned int Time)
(0134) {
(0135) unsigned char n=0;
006E 2744 CLR R20
006F C008 RJMP 0x0078
(0136) while(Time>0)
(0137) {
(0138) for (n=1;n<187;n++)
0070 E041 LDI R20,1
0071 C002 RJMP 0x0074
(0139) {
(0140) NOP();
0072 0000 NOP
0073 9543 INC R20
0074 3B4B CPI R20,0xBB
0075 F3E0 BCS 0x0072
(0141) }
(0142) Time--;
0076 5001 SUBI R16,1
0077 4010 SBCI R17,0
0078 3000 CPI R16,0
0079 0701 CPC R16,R17
007A F7A9 BNE 0x0070
007B D0CB RCALL pop_gset1
007C 9508 RET
_Beep:
Time --> R20
007D D0C6 RCALL push_gset1
007E 01A8 MOVW R20,R16
(0143) }
(0144) }
(0145)
(0146) /***********************************************************
(0147) * 函数说明:蜂鸣器鸣叫函数 *
(0148) * 输入: 无 *
(0149) * 输出: 无 *
(0150) * 调用函数:无 *
(0151) ***********************************************************/
(0152) void Beep (unsigned int Time)
(0153) {
(0154) PORTB |= 0x02;
007F 9A29 SBI 0x05,1
(0155) Delay_ms(Time);
0080 018A MOVW R16,R20
0081 DFEB RCALL _Delay_ms
(0156) PORTB &= 0xFD;
0082 B185 IN R24,0x05
0083 7F8D ANDI R24,0xFD
0084 B985 OUT 0x05,R24
0085 D0C1 RCALL pop_gset1
0086 9508 RET
(0157) }
(0158)
(0159) /***********************************************************
(0160) * 函数说明:定时器0中断处理程序代码插入函数 *
(0161) * 输入: 无 *
(0162) * 输出: 无 *
(0163) * 调用函数:无 *
(0164) ***********************************************************/
(0165) void Insert_Timer1_OVF_ISR_Code(void)
(0166) {
(0167) TCNT1H = 0xB3;
_Insert_Timer1_OVF_ISR_Code:
0087 EB83 LDI R24,0xB3
0088 93800085 STS 0x85,R24
(0168) TCNT1L = 0xB5;
008A EB85 LDI R24,0xB5
008B 93800084 STS 0x84,R24
(0169) Beep(10);
008D E00A LDI R16,0xA
008E E010 LDI R17,0
008F DFED RCALL _Beep
0090 9508 RET
(0170) }
(0171)
(0172) /***********************************************************
(0173) * 函数说明:TWI事件中断处理程序代码插入函数 *
(0174) * 输入: 无 *
(0175) * 输出: 无 *
(0176) * 调用函数:无 *
(0177) ***********************************************************/
(0178) void Insert_TWI_ISR_Code(void)
(0179) {
(0180) unsigned char TWIStatus;
(0181) static unsigned char TWISendCounter;
(0182)
(0183) TWIStatus = TWSR&0xF8;
_Insert_TWI_ISR_Code:
TWIStatus --> R16
0091 910000B9 LDS R16,0xB9
0093 7F08 ANDI R16,0xF8
(0184) UDR0 = TWIStatus;
0094 930000C6 STS 0xC6,R16
(0185)
(0186) TWCR &= ~(BIT(TWINT)|BIT(TWSTA)|BIT(TWSTO));
0096 918000BC LDS R24,0xBC
0098 748F ANDI R24,0x4F
0099 938000BC STS 0xBC,R24
(0187)
(0188) switch (TWIStatus)
009B 2711 CLR R17
009C 3208 CPI R16,0x28
009D E0E0 LDI R30,0
009E 071E CPC R17,R30
009F F169 BEQ 0x00CD
00A0 E288 LDI R24,0x28
00A1 E090 LDI R25,0
00A2 1780 CP R24,R16
00A3 0791 CPC R25,R17
00A4 F074 BLT 0x00B3
00A5 3008 CPI R16,0x8
00A6 E0E0 LDI R30,0
00A7 071E CPC R17,R30
00A8 F0C9 BEQ 0x00C2
00A9 3008 CPI R16,0x8
00AA E0E0 LDI R30,0
00AB 071E CPC R17,R30
00AC F40C BGE 0x00AE
00AD C04E RJMP 0x00FC
00AE 3108 CPI R16,0x18
00AF E0E0 LDI R30,0
00B0 071E CPC R17,R30
00B1 F0B9 BEQ 0x00C9
00B2 C049 RJMP 0x00FC
00B3 3308 CPI R16,0x38
00B4 E0E0 LDI R30,0
00B5 071E CPC R17,R30
00B6 F409 BNE 0x00B8
00B7 C03B RJMP 0x00F3
00B8 3308 CPI R16,0x38
00B9 E0E0 LDI R30,0
00BA 071E CPC R17,R30
00BB F40C BGE 0x00BD
00BC C03F RJMP 0x00FC
00BD 3700 CPI R16,0x70
00BE E0E0 LDI R30,0
00BF 071E CPC R17,R30
00C0 F149 BEQ 0x00EA
00C1 C03A RJMP 0x00FC
(0189) {
(0190) case SSend : //启动位已发送
(0191) {
(0192) TWDR = 0xF0; //向主机传送时间
00C2 EF80 LDI R24,0xF0
00C3 938000BB STS 0xBB,R24
(0193) TWISendCounter = 0;
00C5 2422 CLR R2
00C6 92200101 STS TWISendCounter,R2
(0194) break;
00C8 C03B RJMP 0x0104
(0195) }
(0196)
(0197) case SLAWSendACK : //SLA+W已发送,收到ACK
(0198) {
(0199) TWDR = 0xA0; //发送从机编号
00C9 EA80 LDI R24,0xA0
00CA 938000BB STS 0xBB,R24
(0200) break;
00CC C037 RJMP 0x0104
(0201) }
(0202)
(0203) case TDataACK :
(0204) {
(0205) if (TWISendCounter < 2)
00CD 91800101 LDS R24,TWISendCounter
00CF 3082 CPI R24,2
00D0 F480 BCC 0x00E1
(0206) {
(0207) TWDR = Time[TWISendCounter];
00D1 E082 LDI R24,2
00D2 E091 LDI R25,1
00D3 91E00101 LDS R30,TWISendCounter
00D5 27FF CLR R31
00D6 0FE8 ADD R30,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -