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

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

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