⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c抢答器_从机程序.lst

📁 《深入浅出AVR单片机——从ATmega48/88/168开始》的实例程序源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -