📄 wx_mn.lst
字号:
_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 + -