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

📄 ex_support.s

📁 《深入浅出AVR单片机——从ATmega48/88/168开始》的实例程序源代码
💻 S
字号:
	.module EX_Support.c
	.area data(ram, con, rel)
_TWIProcess::
	.blkb 1
	.area idata
	.byte 1
	.area data(ram, con, rel)
	.dbfile D:\实例17_I2C抢答器_从机程序\EX_Support.c
	.dbsym e TWIProcess _TWIProcess c
	.area text(rom, con, rel)
	.dbfile D:\实例17_I2C抢答器_从机程序\EX_Support.c
	.dbfunc s Driver_INIT _Driver_INIT fV
	.even
_Driver_INIT:
	.dbline -1
	.dbline 105
; /***********************************************************
; *   函数库说明:底层硬件初始化驱动函数库                   *
; *   版本:                                                 *
; *   作者:                                                 *
; *   创建日期:                                             *
; * -------------------------------------------------------- *
; *  [硬件说明]                                              *
; *   处理器:                                               *
; *   系统时钟:                                             *
; * -------------------------------------------------------- *
; *  [支 持 库]                                              *
; *   支持库名称:HD_Support.h                               *
; *   需要版本:  -----                                      *
; *   支持库说明:底层硬件初始化声明库                       *
; *                                                          *
; *   支持库名称:EX_Support.h                               *
; *   需要版本:  -----                                      *
; *   支持库说明:底层硬件初始化驱动声明库                   *
; *                                                          *
; *   支持库名称:PF_Config.h                                *
; *   需要版本:  -----                                      *
; *   支持库说明:硬件平台配置声明库                         *
; * -------------------------------------------------------- *
; *  [版本更新]                                              *
; *   修改:                                                 *
; *   修改日期:                                             *
; *   版本:                                                 *
; * -------------------------------------------------------- *
; *  [版本历史]                                              *
; * -------------------------------------------------------- *
; *  [使用说明]                                              *
; ***********************************************************/
; 
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "PF_Config.h"
; # include "HD_Support.h"
; # include "EX_Support.h"
; 
; 
; /********************
; *   系 统 宏 定 义  *
; ********************/
; 
; /*------------------*
; *   常 数 宏 定 义  *
; *------------------*/
; 
; #define SSend           0x08            //启动位已发送
; #define RSSend          0x10            //复启动位已发送
; #define SLAWSendACK     0x18            //SLA+W已发送,收到ACK
; #define SLAWSendNAK     0x20            //SLA+W已发送,收到NAK
; #define SLARSendACK     0x40            //SLA+R已发送,收到ACK
; #define SLARSendNAK     0x48            //SLA+R已发送,收到ACK
; #define TDataACK        0x28            //DATA已发送,收到ACK
; #define TDataNAK        0x30            //DATA已发送,收到NAK
; #define RDataACK        0x50            //DATA已收到,ACK已发送
; #define RDataNAK        0x58            //DATA已收到,NAK已发送
; #define GCAddRACK       0x70            //收到广播地址,ACK已发
; #define ArbiLost        0x38            //仲裁失败
; 
; #define TWIInProcess    0x00            //TWI操作中
; #define TWIProcessOver  0x01            //TWI操作成功完成
; #define TWIProcessNAK   0x11            //TWI操作中无法接收到主机应答
; #define TWIProcessERR   0x21            //TWI操作遇到未知错误而终止
; #define TWIPrecessHan   0x31            //TWI操作挂起
; 
; /*------------------*
; *   动 作 宏 定 义  *
; *------------------*/
; 
; /********************
; *  模块结构体定义区 *
; ********************/
; 
; /********************
; *   函 数 声 明 区  *
; ********************/
; void System_INIT(void);
; void Insert_Timer1_OVF_ISR_Code(void);
; 
; /********************
; *   模块函数声明区  *
; ********************/
; static void Driver_INIT(void);
; 
; /********************
; *   模块变量声明区  *
; ********************/
; 
; /********************
; *   全局变量声明区  *
; ********************/
; unsigned char Time[2];
; unsigned char TWIProcess = TWIProcessOver;
; 
; /***********************************************************
; *   函数说明:软件驱动初始化函数                           *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; static void Driver_INIT(void)
; {
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e System_INIT _System_INIT fV
	.even
_System_INIT::
	.dbline -1
	.dbline 116
;     //*在这里插入你的各类软件驱动初始化代码*//
; }
; 
; /***********************************************************
; *   函数说明:系统初始化函数                               *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:Device_INIT() Driver_INIT()                  *
; ***********************************************************/
; void System_INIT(void)
; {
	.dbline 117
;     CLI();
	cli
	.dbline 119
;     
;     Device_INIT();
	rcall _Device_INIT
	.dbline 120
;     Driver_INIT();
	rcall _Driver_INIT
	.dbline 124
;     
;     //*在这里插入你的系统环境变量初始化代码*//
;     
;     SEI();
	sei
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Delay_ms _Delay_ms fV
;              n -> R20
;           Time -> R16,R17
	.even
_Delay_ms::
	rcall push_gset1
	.dbline -1
	.dbline 134
; }
; 
; /***********************************************************
; *   函数说明:毫秒级延时函数                               *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; void Delay_ms(unsigned int Time)
; {
	.dbline 135
;     unsigned char n=0;
	clr R20
	rjmp L5
L4:
	.dbline 137
;     while(Time>0)
;     {
	.dbline 138
;         for (n=1;n<187;n++)
	ldi R20,1
	rjmp L10
L7:
	.dbline 139
	.dbline 140
	nop
	.dbline 141
L8:
	.dbline 138
	inc R20
L10:
	.dbline 138
	cpi R20,187
	brlo L7
	.dbline 142
	subi R16,1
	sbci R17,0
	.dbline 143
L5:
	.dbline 136
	cpi R16,0
	cpc R16,R17
	brne L4
X0:
	.dbline -2
L3:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r n 20 c
	.dbsym r Time 16 i
	.dbend
	.dbfunc e Beep _Beep fV
;           Time -> R20,R21
	.even
_Beep::
	rcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 153
;         {
;             NOP();
;         }
;         Time--;
;     }
; }
; 
; /***********************************************************
; *   函数说明:蜂鸣器鸣叫函数                               *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; void Beep (unsigned int Time)
; {
	.dbline 154
;     PORTB |= 0x02;
	sbi 0x5,1
	.dbline 155
;     Delay_ms(Time);
	movw R16,R20
	rcall _Delay_ms
	.dbline 156
;     PORTB &= 0xFD;
	in R24,0x5
	andi R24,253
	out 0x5,R24
	.dbline -2
L11:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Time 20 i
	.dbend
	.dbfunc e Insert_Timer1_OVF_ISR_Code _Insert_Timer1_OVF_ISR_Code fV
	.even
_Insert_Timer1_OVF_ISR_Code::
	.dbline -1
	.dbline 166
; }
; 
; /***********************************************************
; *   函数说明:定时器0中断处理程序代码插入函数              *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; void Insert_Timer1_OVF_ISR_Code(void)
; {
	.dbline 167
;     TCNT1H = 0xB3;
	ldi R24,179
	sts 133,R24
	.dbline 168
;     TCNT1L = 0xB5;
	ldi R24,181
	sts 132,R24
	.dbline 169
;     Beep(10);
	ldi R16,10
	ldi R17,0
	rcall _Beep
	.dbline -2
L12:
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\实例17_I2C抢答器_从机程序\EX_Support.c
L14:
	.blkb 1
	.area text(rom, con, rel)
	.dbfile D:\实例17_I2C抢答器_从机程序\EX_Support.c
	.dbfunc e Insert_TWI_ISR_Code _Insert_TWI_ISR_Code fV
	.dbsym s TWISendCounter L14 c
;      TWIStatus -> R16
	.even
_Insert_TWI_ISR_Code::
	.dbline -1
	.dbline 179
; }
; 
; /***********************************************************
; *   函数说明:TWI事件中断处理程序代码插入函数              *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; void Insert_TWI_ISR_Code(void)
; {
	.dbline 183
;     unsigned char TWIStatus;
;     static unsigned char TWISendCounter;
; 
;     TWIStatus = TWSR&0xF8;
	lds R16,185
	andi R16,248
	.dbline 184
;     UDR0 = TWIStatus;
	sts 198,R16
	.dbline 186
; 
;     TWCR &= ~(BIT(TWINT)|BIT(TWSTA)|BIT(TWSTO));
	lds R24,188
	andi R24,79
	sts 188,R24
	.dbline 188
; 
;     switch (TWIStatus)
	clr R17
	cpi R16,40
	ldi R30,0
	cpc R17,R30
	breq L20
	ldi R24,40
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlt L26
L25:
	cpi R16,8
	ldi R30,0
	cpc R17,R30
	breq L18
	cpi R16,8
	ldi R30,0
	cpc R17,R30
	brge X2
	rjmp L15
X2:
L27:
	cpi R16,24
	ldi R30,0
	cpc R17,R30
	breq L19
	rjmp L15
L26:
	cpi R16,56
	ldi R30,0
	cpc R17,R30
	brne X3
	rjmp L24
X3:
	cpi R16,56
	ldi R30,0
	cpc R17,R30
	brge X4
	rjmp L15
X4:
L28:
	cpi R16,112
	ldi R30,0
	cpc R17,R30
	breq L23
	rjmp L15
X1:
	.dbline 189
;     {
L18:
	.dbline 191
;         case SSend :                //启动位已发送
;         {
	.dbline 192
;             TWDR = 0xF0;            //向主机传送时间
	ldi R24,240
	sts 187,R24
	.dbline 193
;             TWISendCounter = 0;
	clr R2
	sts L14,R2
	.dbline 194
;             break;
	rjmp L16
L19:
	.dbline 198
;         }
; 
;         case SLAWSendACK :          //SLA+W已发送,收到ACK
;         {
	.dbline 199
;             TWDR = 0xA0;            //发送从机编号
	ldi R24,160
	sts 187,R24
	.dbline 200
;             break;
	rjmp L16
L20:
	.dbline 204
;         }
;         
;         case TDataACK :
;         {
	.dbline 205
;             if (TWISendCounter < 2)
	lds R24,L14
	cpi R24,2
	brsh L21
	.dbline 206
;             {
	.dbline 207
;                 TWDR = Time[TWISendCounter];
	ldi R24,<_Time
	ldi R25,>_Time
	lds R30,L14
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 187,R2
	.dbline 208
;                 TWISendCounter++;
	lds R24,L14
	subi R24,255    ; addi 1
	sts L14,R24
	.dbline 209
;             }
	rjmp L16
L21:
	.dbline 211
;             else
;             {
	.dbline 212
;                 TWCR |= BIT(TWSTO)&(~BIT(TWINT));   //时间发送完成,停止总线
	lds R24,188
	ori R24,16
	sts 188,R24
	.dbline 213
;                 TWIProcess = TWIProcessOver;
	ldi R24,1
	sts _TWIProcess,R24
	.dbline 214
;             }
	.dbline 215
;             break;
	rjmp L16
L23:
	.dbline 219
;         }
; 
;         case GCAddRACK :            //收到广播地址,ACK已发
;         {
	.dbline 220
;             TWCR |= BIT(TWSTO)&(~BIT(TWINT));  //空闲总线
	lds R24,188
	ori R24,16
	sts 188,R24
	.dbline 221
;             TIMERSTART;                        //启动计时
	ldi R24,4
	sts 129,R24
	.dbline 222
;             break;
	rjmp L16
L24:
	.dbline 226
;         }
;         
;         case ArbiLost :             //仲裁失败
;         {
	.dbline 227
;             TWCR |= BIT(TWSTO)&(~BIT(TWINT));   //恢复从机状态
	lds R24,188
	ori R24,16
	sts 188,R24
	.dbline 228
;             TWIProcess = TWIPrecessHan;
	ldi R24,49
	sts _TWIProcess,R24
	.dbline 229
;             break;
	rjmp L16
L15:
	.dbline 233
;         }
; 
;         default :
;         {
	.dbline 234
;             TWCR |= BIT(TWSTO)&(~BIT(TWINT));   //出现错误状态,总线恢复空闲状态
	lds R24,188
	ori R24,16
	sts 188,R24
	.dbline 235
;             TWIProcess = TWIProcessERR;         //当前TWI操作任务遇不明原因终止
	ldi R24,33
	sts _TWIProcess,R24
	.dbline 236
;         }                          //在操作的最后,我们并没有再次设置TWEN位,用意是提醒大家编程细心,"意外"清除TWEN位本来就是不对的
	.dbline 238
; 
;     }
L16:
	.dbline 240
; 
;     TWCR |= BIT(TWINT);
	lds R24,188
	ori R24,128
	sts 188,R24
	.dbline -2
L13:
	.dbline 0 ; func end
	ret
	.dbsym r TWIStatus 16 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\实例17_I2C抢答器_从机程序\EX_Support.c
_Time::
	.blkb 2
	.dbsym e Time _Time A[2:2]c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -