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

📄 iic.s

📁 实现机于通讯芯片的电话接听 拨出 以及来电振领提示
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module iic.c
	.area vector(rom, abs)
	.org 34
	rjmp _TWI_ISR
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Rooger\桌面\GSM_PHONE\iic.c
	.dbfunc e TWI_ISR _TWI_ISR fV
	.even
_TWI_ISR::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R17
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 22
; /************************************iic.c**************************
; *iic.c负责同上层软件之间的通讯
; *iic在NPI中处于两种工作方式 从机接收模式以及从机发送模式
; *从机接收模式 在通讯过程中 应答主机请求 并将数据保存到相应数组以便主程序判断
; *从机发送模式 通过pwr拉高请求主机接收数据 然后根据主机应答发送数据
; ********************************************************************/
; #include <iom8v.h>
; #include <macros.h>
; #include "iic.h"
; #include "define.h"
; 
; extern uchar buf[15]; //pc同i2c交互数据存放处
; extern uchar cmd;//i2c数据缓存
; extern uchar cmd_num;//i2c数据计数
; extern uchar flag; //
; extern uchar *data;
; extern uchar j;
; extern uchar req_flag,start_flag,vision_flag,cmd_flag;
; //*****************************************************************************/
; #pragma interrupt_handler TWI_ISR:18
; void TWI_ISR(void)
; { 
	.dbline 24
;         //TWI被控接收器模式中断处理
;         switch (TestAck()) 
	in R16,0x1
	clr R17
	andi R16,248
	andi R17,0
	cpi R16,144
	ldi R30,0
	cpc R17,R30
	brne X1
	rjmp L27
X1:
	ldi R24,144
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brge X2
	rjmp L52
X2:
L51:
	cpi R16,112
	ldi R30,0
	cpc R17,R30
	brne X3
	rjmp L7
X3:
	ldi R24,112
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlt L54
L53:
	cpi R16,96
	ldi R30,0
	cpc R17,R30
	brne X4
	rjmp L5
X4:
	cpi R16,96
	ldi R30,0
	cpc R17,R30
	brge X5
	rjmp L2
X5:
L55:
	cpi R16,104
	ldi R30,0
	cpc R17,R30
	brne X6
	rjmp L6
X6:
	rjmp L2
L54:
	cpi R16,128
	ldi R30,0
	cpc R17,R30
	brne X7
	rjmp L9
X7:
	ldi R24,128
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlt L57
L56:
	cpi R16,120
	ldi R30,0
	cpc R17,R30
	brne X8
	rjmp L8
X8:
	rjmp L2
L57:
	cpi R16,136
	ldi R30,0
	cpc R17,R30
	brne X9
	rjmp L18
X9:
	rjmp L2
L52:
	cpi R16,176
	ldi R30,0
	cpc R17,R30
	brne X10
	rjmp L46
X10:
	ldi R24,176
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlt L59
L58:
	cpi R16,160
	ldi R30,0
	cpc R17,R30
	brne X11
	rjmp L50
X11:
	ldi R24,160
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlt L61
L60:
	cpi R16,152
	ldi R30,0
	cpc R17,R30
	brne X12
	rjmp L36
X12:
	rjmp L2
L61:
	cpi R16,168
	ldi R30,0
	cpc R17,R30
	brne X13
	rjmp L45
X13:
	rjmp L2
L59:
	cpi R16,192
	ldi R30,0
	cpc R17,R30
	brne X14
	rjmp L48
X14:
	ldi R24,192
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlt L63
L62:
	cpi R16,184
	ldi R30,0
	cpc R17,R30
	brne X15
	rjmp L47
X15:
	rjmp L2
L63:
	cpi R16,200
	ldi R30,0
	cpc R17,R30
	brne X16
	rjmp L49
X16:
	rjmp L2
X0:
	.dbline 25
;         { 
L5:
	.dbline 28
; 		        //从机接收
;                 case SR_SLA_ACK:   //SR_SLA_ACK=0x60; SLA+W已经被接收ACK 已返回
;                 {
	.dbline 29
;                         Twi_ACK();
	ldi R24,197
	out 0x36,R24
	.dbline 30
; 						break;
	rjmp L3
L6:
	.dbline 33
;                 } 
;                 case MT_SR_SLA_ACK://MT_SR_SLA_ACK=0x68;SLA+R/W 作为主机的仲裁失败;自己的SLA+W 已经被接收,ACK 已返回
;                 { 
	.dbline 34
;                         Twi_ACK();
	ldi R24,197
	out 0x36,R24
	.dbline 35
;                         break; 
	rjmp L3
L7:
	.dbline 38
;                 }    
;                 case SR_ALL_ACK://SR_ALL_ACK=0x70;接收到广播地址,ACK 已返回
;                 {
	.dbline 39
;                         Twi_ACK(); 
	ldi R24,197
	out 0x36,R24
	.dbline 40
;                         break;
	rjmp L3
L8:
	.dbline 43
;                 } 
;                 case MT_SR_ALL_ACK://MT_SR_ALL_ACK=0x78;SLA+R/W 作为主机的仲裁失败;接收到广播地址,ACK 已返回
;                 {    
	.dbline 44
; 				        Twi_ACK(); 
	ldi R24,197
	out 0x36,R24
	.dbline 45
;                         break;   
	rjmp L3
L9:
	.dbline 48
;                 } 
;                 case SR_DATA_ACK://SR_DATA_ACK=0X80;以前以自己的 SLA+W 被寻址;数据已经被接收,ACK 已返回
;                 {
	.dbline 49
; 				        cmd=TWDR;
	in R2,0x3
	sts _cmd,R2
	.dbline 50
; 						buf[cmd_num]=cmd;
	ldi R24,<_buf
	ldi R25,>_buf
	lds R30,_cmd_num
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 51
; 						cmd_num++;
	lds R24,_cmd_num
	subi R24,255    ; addi 1
	sts _cmd_num,R24
	.dbline 52
; 						if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
	lds R2,_cmd
	tst R2
	brne L10
	cpi R24,2
	brne L10
	.dbline 53
; 						{  
	.dbline 54
; 						  PWRON;
	in R24,0x18
	andi R24,223
	out 0x18,R24
	.dbline 55
; 						  req_flag=1;
	ldi R24,1
	sts _req_flag,R24
	.dbline 56
; 						  start_flag=0;
	clr R2
	sts _start_flag,R2
	.dbline 57
; 						  vision_flag=0;
	sts _vision_flag,R2
	.dbline 58
; 						  cmd_flag=0;
	sts _cmd_flag,R2
	.dbline 59
; 						  cmd_num=0;
	sts _cmd_num,R2
	.dbline 60
; 						}
L10:
	.dbline 61
; 						if(cmd==0x0f) //接收到握手结束位 置标记
	lds R24,_cmd
	cpi R24,15
	brne L12
	.dbline 62
; 						{
	.dbline 63
; 						  start_flag=1;
	ldi R24,1
	sts _start_flag,R24
	.dbline 64
; 						  PWRON;
	in R24,0x18
	andi R24,223
	out 0x18,R24
	.dbline 65
; 						}
L12:
	.dbline 66
; 						if(cmd==0x05 && cmd_num==2)
	lds R24,_cmd
	cpi R24,5
	brne L14
	lds R24,_cmd_num
	cpi R24,2
	brne L14
	.dbline 67
; 						{
	.dbline 68
; 						  vision_flag=1;
	ldi R24,1
	sts _vision_flag,R24
	.dbline 69
; 						}
L14:
	.dbline 70
; 				        Twi_ACK();
	ldi R24,197
	out 0x36,R24
	.dbline 71
; 						if(cmd==0xff) //接受到主机发送数据结束位 置标记
	lds R24,_cmd
	cpi R24,255
	breq X17
	rjmp L3
X17:
	.dbline 72
; 						{
	.dbline 73
; 						   cmd_flag=1;
	ldi R24,1
	sts _cmd_flag,R24
	.dbline 74
; 						}
	.dbline 75
;                         break;
	rjmp L3
L18:
	.dbline 78
;                 }        
;         		case SR_DATA_NOACK://SR_DATA_NOACK=0x88;以前以自己的 SLA+W 被寻址;数据已经被接收,NOT ACK 已返回
;                 {  
	.dbline 79
;                         cmd=TWDR;
	in R2,0x3
	sts _cmd,R2
	.dbline 80
; 						buf[cmd_num]=cmd;
	ldi R24,<_buf
	ldi R25,>_buf
	lds R30,_cmd_num
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 81
; 						cmd_num++;
	lds R24,_cmd_num
	subi R24,255    ; addi 1
	sts _cmd_num,R24
	.dbline 82
; 						if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
	lds R2,_cmd
	tst R2
	brne L19
	cpi R24,2
	brne L19
	.dbline 83
; 						{  
	.dbline 84
; 						  req_flag=1;
	ldi R24,1
	sts _req_flag,R24
	.dbline 85
; 						  start_flag=0;
	clr R2
	sts _start_flag,R2
	.dbline 86
; 						  vision_flag=0;
	sts _vision_flag,R2
	.dbline 87
; 						  cmd_flag=0;
	sts _cmd_flag,R2
	.dbline 88
; 						  PWRON;
	in R24,0x18
	andi R24,223
	out 0x18,R24
	.dbline 89
; 						  cmd_num=0;
	sts _cmd_num,R2
	.dbline 90
; 						}
L19:
	.dbline 91
; 						if(cmd==0x0f) //接收到握手结束位 置标记
	lds R24,_cmd
	cpi R24,15
	brne L21
	.dbline 92
; 						{
	.dbline 93
; 						  start_flag=1;
	ldi R24,1
	sts _start_flag,R24
	.dbline 94
; 						  PWRON;
	in R24,0x18
	andi R24,223
	out 0x18,R24

⌨️ 快捷键说明

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