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

📄 wx_mn.lst

📁 nrf905无线收发模块利用模拟spi通信的程序 经此程序可转成串口通信
💻 LST
📖 第 1 页 / 共 5 页
字号:
_TWI_write:
  n_tmp                --> R14
  arr                  --> R20
  n                    --> R22
  addr                 --> R10
  devadd               --> R12
    0250 940E0547  CALL	push_gset5
    0252 2EA2      MOV	R10,R18
    0253 2EC0      MOV	R12,R16
    0254 9724      SBIW	R28,4
    0255 856E      LDD	R22,14+Y
    0256 8948      LDD	R20,16+Y
    0257 8959      LDD	R21,17+Y
(0121) 
(0122) /*
(0123) 函数:TWI_page_write()
(0124) 功能:I2C总线综合发送函数,向从机发送多个字节的数据
(0125) 参数:
(0126) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0127) 	addr:从机的子地址
(0128) 	*arr:要发送的数据
(0129) 	   n:数据的字节数
(0130) 返回:
(0131) 	1:发送成功
(0132) 	0:在发送过程中出现异常
(0133) 说明:
(0134) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0135) 	当从机没有子地址时,参数addr任意
(0136) */
(0137) uchar TWI_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
(0138) {
(0139)     uchar n_tmp;
(0140) 	n_tmp=Page_size-(uchar)(addr&Page_mask);
    0258 2D8A      MOV	R24,R10
    0259 2799      CLR	R25
    025A 7087      ANDI	R24,7
    025B 7090      ANDI	R25,0
    025C E098      LDI	R25,0x8
    025D 2EE9      MOV	R14,R25
    025E 1AE8      SUB	R14,R24
(0141) 	if((n>n_tmp)&&(n_tmp!=0))
    025F 16E6      CP	R14,R22
    0260 F4E0      BCC	0x027D
    0261 20EE      TST	R14
    0262 F0D1      BEQ	0x027D
(0142) 	 {
(0143) 	   TWI_page_write(devadd,addr,n_tmp,arr);//
    0263 834A      STD	R20,2+Y
    0264 835B      STD	R21,3+Y
    0265 82E8      STD	R14,0+Y
    0266 2D2A      MOV	R18,R10
    0267 2D0C      MOV	R16,R12
    0268 DFCA      RCALL	_TWI_page_write
(0144) 	   addr+=n_tmp;
    0269 0CAE      ADD	R10,R14
(0145) 	   n-=n_tmp;
    026A 196E      SUB	R22,R14
(0146) 	   arr+=n_tmp;
    026B 2C2E      MOV	R2,R14
    026C 2433      CLR	R3
    026D 0D42      ADD	R20,R2
    026E 1D53      ADC	R21,R3
(0147) 	 }
    026F C00D      RJMP	0x027D
(0148) 	while(n>=Page_size)
(0149) 	 {
(0150) 	   TWI_page_write(devadd,addr,Page_size,arr);//
    0270 834A      STD	R20,2+Y
    0271 835B      STD	R21,3+Y
    0272 E088      LDI	R24,0x8
    0273 8388      STD	R24,0+Y
    0274 2D2A      MOV	R18,R10
    0275 2D0C      MOV	R16,R12
    0276 DFBC      RCALL	_TWI_page_write
(0151) 	   addr+=Page_size;
    0277 2D8A      MOV	R24,R10
    0278 5F88      SUBI	R24,0xF8
    0279 2EA8      MOV	R10,R24
(0152) 	   n-=Page_size;
    027A 5068      SUBI	R22,0x8
(0153) 	   arr+=Page_size;
    027B 5F48      SUBI	R20,0xF8
    027C 4F5F      SBCI	R21,0xFF
    027D 3068      CPI	R22,0x8
    027E F788      BCC	0x0270
(0154) 	 }
(0155) 	if(n!=0)
    027F 2366      TST	R22
    0280 F031      BEQ	0x0287
(0156) 	   TWI_page_write(devadd,addr,n,arr);//
    0281 834A      STD	R20,2+Y
    0282 835B      STD	R21,3+Y
    0283 8368      STD	R22,0+Y
    0284 2D2A      MOV	R18,R10
    0285 2D0C      MOV	R16,R12
    0286 DFAC      RCALL	_TWI_page_write
(0157) }
    0287 9624      ADIW	R28,4
    0288 940E0554  CALL	pop_gset5
    028A 9508      RET
_TWI_read:
  i                    --> R20
  arr                  --> R22
  n                    --> R10
  addr                 --> R12
  devadd               --> R20
    028B 940E0543  CALL	push_gset4
    028D 2EC2      MOV	R12,R18
    028E 2F40      MOV	R20,R16
    028F 84A8      LDD	R10,8+Y
    0290 856A      LDD	R22,10+Y
    0291 857B      LDD	R23,11+Y
(0158) 
(0159) /*
(0160) 函数:TWI_read()
(0161) 功能:I2C总线综合接收函数,从从机接收多个字节的数据
(0162) 参数:
(0163) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0164) 	addr:从机的子地址
(0165) 	*arr:要发送的数据
(0166) 	   n:数据的字节数
(0167) 返回:
(0168) 	1:接收成功
(0169) 	0:在接收过程中出现异常
(0170) 说明:
(0171) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0172) 	当从机没有子地址时,参数addr任意
(0173) */
(0174) uchar TWI_read(uchar devadd,uchar addr,uchar n,uchar *arr)
(0175) {
(0176)     uchar i;
(0177) 	TWI_start();
    0292 DF6D      RCALL	_TWI_start
(0178) 	TWI_writeB(devadd);
    0293 2F04      MOV	R16,R20
    0294 DF78      RCALL	_TWI_writeB
(0179) 	TWI_writeB(addr);
    0295 2D0C      MOV	R16,R12
    0296 DF76      RCALL	_TWI_writeB
(0180) 	TWI_start();
    0297 DF68      RCALL	_TWI_start
(0181) 	TWI_writeB(devadd|1);
    0298 2F04      MOV	R16,R20
    0299 6001      ORI	R16,1
    029A DF72      RCALL	_TWI_writeB
(0182) 	for(i=1;i<=n-1;i++)
    029B E041      LDI	R20,1
    029C C007      RJMP	0x02A4
(0183) 	 {
(0184) 	  *arr= TWI_readB(1);
    029D E001      LDI	R16,1
    029E DF84      RCALL	_TWI_readB
    029F 01FB      MOVW	R30,R22
    02A0 8300      STD	R16,0+Z
(0185) 	   arr++;
    02A1 5F6F      SUBI	R22,0xFF
    02A2 4F7F      SBCI	R23,0xFF
    02A3 9543      INC	R20
    02A4 2D8A      MOV	R24,R10
    02A5 5081      SUBI	R24,1
    02A6 1784      CP	R24,R20
    02A7 F7A8      BCC	0x029D
(0186) 	 }
(0187) 	  *arr= TWI_readB(0);
    02A8 2700      CLR	R16
    02A9 DF79      RCALL	_TWI_readB
    02AA 01FB      MOVW	R30,R22
    02AB 8300      STD	R16,0+Z
(0188) 	  TWI_stop();
    02AC DF5C      RCALL	_TWI_stop
(0189) }
    02AD 940E0551  CALL	pop_gset4
    02AF 9508      RET
_ZLG7290_WriteReg:
  dat                  --> Y+6
  dat                  --> Y+6
  RegAddr              --> R20
    02B0 933A      ST	R19,-Y
    02B1 932A      ST	R18,-Y
    02B2 940E0524  CALL	push_gset1
    02B4 2F40      MOV	R20,R16
    02B5 9724      SBIW	R28,4
FILE: E:\PQ-1A\我的AVR\新建文件夹\无线模拟\zlg7290.c
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) //#include <stdio.h>
(0005) #include "TWI.C"
(0006) #include "zlg7290.h"
(0007) 
(0008) #define uchar unsigned char
(0009) #define uint unsigned int
(0010) 
(0011) 
(0012) /*
(0013) 函数:ZLG7290_WriteReg()
(0014) 功能:向ZLG7290的某个内部寄存器写入数据
(0015) 参数:
(0016) 	RegAddr:ZLG7290的内部寄存器地址
(0017) 	dat:要写入的数据
(0018) 返回:
(0019) 	1:正常
(0020) 	0:访问ZLG7290时出现异常
(0021) */
(0022) void ZLG7290_WriteReg(uchar RegAddr, uchar dat)
(0023) {
(0024)   TWI_write(ZLG7290_I2C_ADDR,RegAddr,1,&dat);
    02B6 01CE      MOVW	R24,R28
    02B7 9606      ADIW	R24,6
    02B8 838A      STD	R24,2+Y
    02B9 839B      STD	R25,3+Y
    02BA E081      LDI	R24,1
    02BB 8388      STD	R24,0+Y
    02BC 2F24      MOV	R18,R20
    02BD E700      LDI	R16,0x70
    02BE DF91      RCALL	_TWI_write
(0025) }
    02BF 9624      ADIW	R28,4
    02C0 940E0527  CALL	pop_gset1
    02C2 9622      ADIW	R28,2
    02C3 9508      RET
_ZLG7290_ReadReg:
  dat                  --> R22
  RegAddr              --> R20
    02C4 940E053B  CALL	push_gset2
    02C6 01B9      MOVW	R22,R18
    02C7 2F40      MOV	R20,R16
    02C8 9724      SBIW	R28,4
(0026) 
(0027) /*
(0028) 函数:ZLG7290_ReadReg()
(0029) 功能:从ZLG7290的某个内部寄存器读出数据
(0030) 参数:
(0031) 	RegAddr:ZLG7290的内部寄存器地址
(0032) 	*dat:保存读出的数据
(0033) 返回:
(0034) 	1:正常
(0035) 	0:访问ZLG7290时出现异常
(0036) */
(0037) void ZLG7290_ReadReg(uchar RegAddr, uchar *dat)
(0038) {
(0039)    TWI_read(ZLG7290_I2C_ADDR,RegAddr,1,dat);
    02C9 836A      STD	R22,2+Y
    02CA 837B      STD	R23,3+Y
    02CB E081      LDI	R24,1
    02CC 8388      STD	R24,0+Y
    02CD 2F24      MOV	R18,R20
    02CE E700      LDI	R16,0x70
    02CF DFBB      RCALL	_TWI_read
(0040) }
    02D0 9624      ADIW	R28,4
    02D1 940E054B  CALL	pop_gset2
    02D3 9508      RET
_ZLG7290_cmd:
  buf                  --> Y+4
  cmd1                 --> R20
  cmd0                 --> R22
    02D4 940E053B  CALL	push_gset2
    02D6 2F42      MOV	R20,R18
    02D7 2F60      MOV	R22,R16
    02D8 9726      SBIW	R28,6
(0041) 
(0042) /*
(0043) 函数:ZLG7290_cmd()
(0044) 功能:向ZLG7290发送控制命令
(0045) 参数:
(0046) 	cmd0:写入CmdBuf0寄存器的命令字(第1字节)
(0047) 	cmd1:写入CmdBuf1寄存器的命令字(第2字节)
(0048) 返回:
(0049) 	1:正常
(0050) 	0:访问ZLG7290时出现异常
(0051) */
(0052) void ZLG7290_cmd(uchar cmd0, uchar cmd1)
(0053) {
(0054) 	uchar buf[2];
(0055) 	buf[0] = cmd0;
    02D9 836C      STD	R22,4+Y
(0056) 	buf[1] = cmd1;
    02DA 834D      STD	R20,5+Y
(0057) 	TWI_write(ZLG7290_I2C_ADDR,ZLG7290_CmdBuf,2,buf);
    02DB 01CE      MOVW	R24,R28
    02DC 9604      ADIW	R24,4
    02DD 838A      STD	R24,2+Y
    02DE 839B      STD	R25,3+Y
    02DF E082      LDI	R24,2
    02E0 8388      STD	R24,0+Y
    02E1 E027      LDI	R18,7
    02E2 E700      LDI	R16,0x70
    02E3 DF6C      RCALL	_TWI_write
(0058) }
    02E4 9626      ADIW	R28,6
    02E5 940E054B  CALL	pop_gset2
    02E7 9508      RET
_ZLG7290_SegOnOff:
  cmd                  --> R20
  b                    --> R22
  seg                  --> R20
    02E8 940E053B  CALL	push_gset2
    02EA 2F62      MOV	R22,R18
    02EB 2F40      MOV	R20,R16
(0059) 
(0060) /*
(0061) 函数:ZLG7290_SegOnOff()
(0062) 功能:段寻址,单独点亮或熄灭数码管(或LED)中的某一段
(0063) 参数:
(0064) 	seg:取值0~63,表示数码管(或LED)的段号
(0065) 	b:0表示熄灭,1表示点亮
(0066) 返回:
(0067) 	1:正常
(0068) 	0:访问ZLG7290时出现异常
(0069) 说明:
(0070) 	在每一位数码管中,段号顺序按照“a,b,c,d,e,f,g,dp”进行
(0071) */
(0072) void ZLG7290_SegOnOff(uchar seg, uchar b)
(0073) {
(0074) 	uchar cmd;
(0075) 	cmd = seg & 0x3F;
    02EC 734F      ANDI	R20,0x3F
(0076) 	if ( b ) cmd |= 0x80;
    02ED 2366      TST	R22
    02EE F009      BEQ	0x02F0
    02EF 6840      ORI	R20,0x80
(0077)     ZLG7290_cmd(0x01,cmd);
    02F0 2F24      MOV	R18,R20
    02F1 E001      LDI	R16,1
    02F2 DFE1      RCALL	_ZLG7290_cmd
(0078) }
    02F3 940E054B  CALL	pop_gset2
    02F5 9508      RET
_ZLG7290_Download:
  cmd1                 --> R22
  cmd0                 --> R20
  dat                  --> Y+8
  f                    --> Y+6
  dp                   --> R10
  addr                 --> R20
    02F6 940E053F  CALL	push_gset3
    02F8 2EA2      MOV	R10,R18
    02F9 2F40      MOV	R20,R16
(0079) /*
(0080) 函数:ZLG7290_Download()
(0081) 功能:下载数据并译码
(0082) 参数:
(0083) 	addr:取值0~7,显示缓存DpRam0~DpRam7的编号
(0084) 	dp:是否点亮该位的小数点,0-熄灭,1-点亮
(0085) 	flash:控制该位是否闪烁,0-不闪烁,1-闪烁
(0086) 	dat:取值0~31,表示要显示的数据
(0087) 返回:
(0088) 	1:正常
(0089) 	0:访问ZLG7290时出现异常
(0090) 说明:
(0091) 	显示数据具体的译码方式请参见ZLG7290的数据手册
(0092) */
(0093) void ZLG7290_Download(uchar addr, uchar dp, uchar f, uchar dat)
(0094) {
(0095) 	uchar cmd0;
(0096) 	uchar cmd1;
(0097) 	cmd0 = addr & 0x0F;
    02FA 704F      ANDI	R20,0xF
(0098) 	cmd0 |= 0x60;
    02FB 6640      ORI	R20,0x60
(0099) 	cmd1 = dat & 0x1F;
    02FC 8568      LDD	R22,8+Y
    02FD 716F      ANDI	R22,0x1F
(0100) 	if ( dp==1 ) cmd1 |= 0x80;
    02FE 2D8A      MOV	R24,R10
    02FF 3081      CPI	R24,1
    0300 F409      BNE	0x0302
    0301 6860      ORI	R22,0x80
(0101) 	if ( f==1 ) cmd1 |= 0x40;
    0302 818E      LDD	R24,6+Y
    0303 3081      CPI	R24,1
    0304 F409      BNE	0x0306
    0305 6460      ORI	R22,0x40
(0102) 	ZLG7290_cmd(cmd0,cmd1);
    0306 2F26      MOV	R18,R22
    0307 2F04      MOV	R16,R20
    0308 DFCB      RCALL	_ZLG7290_cmd
(0103) }
    0309 940E054E  CALL	pop_gset3
    030B 9508      RET
FILE: E:\PQ-1A\我的AVR\新建文件夹\无线模拟\zlg7290_avr.c
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) //#include <stdio.h>			//标准输入输出头文件
(0005) #include "zlg7290.c"
(0006) 
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009) #pragma interrupt_handler extint0:9
(0010) //#pragma interrupt_handler miao:15
(0011) 
(0012) uint FlagINT = 0,flag=0;
(0013) 
(0014) /*
(0015) 函数:interrupt_init()
(0016) 功能:ZLG7290键盘中断服务初始化程序
(0017) */
(0018) void interrupt_init(void)
(0019) {
(0020)  SEI();		//使能全局中断
_interrupt_init:
    030C 9478      BSET	7
(0021)  EIMSK=0x80;  //使能外部中断7
    030D E880      LDI	R24,0x80
    030E BF89      OUT	P39,R24
(0022)  EICRB=0x80;		//外部中断7采用下降沿触发
    030F BF8A      OUT	P3A,R24
(0023)  DDRE&=~0x80;		    //配置中断管脚为输入
    0310 9817      CBI	P02,7
(0024)  PORTE|=BIT(PE7);	//使能中断管脚的上拉
    0311 9A1F      SBI	P03,7
(0025) }
    0312 9508      RET
_extint0:
    0313 938A      ST	R24,-Y
    0314 939A      ST	R25,-Y
    0315 B78F      IN	R24,P3F
    0316 938A      ST	R24,-Y
(0026) /*
(0027) 函数:extint0()
(0028) 功能:ZLG7290键盘中断服务程序
(0029) 说明:中断触发方式选择负边沿触发,因此不必等待中断请求信号恢复为高电平
(0030) */
(0031) void extint0(void)
(0032) {
(0033)    FlagINT = 1;
    0317 E081      LDI	R24,1
    0318 E090      LDI	R25,0
    0319 9390011A  STS	R25,0x11A
    031B 93800119  STS	R24,0x119
(0034) }
    031D 9189      LD	R24,Y+

⌨️ 快捷键说明

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