📄 main.lst
字号:
(0076) }
(0077) /*************************************************************************
(0078) ** 函数名称: i2cstop(void)
(0079) ** 功能描述: i2c停止
(0080) ** 输 入:
(0081) ** 输出 :
(0082) ** 全局变量: 无
(0083) ** 调用模块:
(0084) ** 说明:
(0085) ** 注意:
(0086) **************************************************************************/
(0087) void i2cstop(void)
(0088) {
(0089) TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
_i2cstop:
01A7 E984 LDI R24,0x94
01A8 93800074 STS 0x74,R24
01AA 9508 RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\delay.c
(0001) /************************************************
(0002) 文件:delay.c
(0003) 用途:延时函数
(0004) 注意:系统时钟8M
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009)
(0010) void delay_1us(void) //1us延时函数
(0011) {
(0012) asm("nop");
_delay_1us:
01AB 0000 NOP
01AC 9508 RET
_delay_nus:
i --> R20
n --> R22
01AD 940E04DF CALL push_gset2
01AF 01B8 MOVW R22,R16
(0013) }
(0014)
(0015) void delay_nus(unsigned int n) //N us延时函数
(0016) {
(0017) unsigned int i=0;
01B0 2744 CLR R20
01B1 2755 CLR R21
(0018) for (i=0;i<n;i++)
01B2 C003 RJMP 0x01B6
(0019) delay_1us();
01B3 DFF7 RCALL _delay_1us
01B4 5F4F SUBI R20,0xFF
01B5 4F5F SBCI R21,0xFF
01B6 1746 CP R20,R22
01B7 0757 CPC R21,R23
01B8 F3D0 BCS 0x01B3
01B9 940E04D0 CALL pop_gset2
01BB 9508 RET
(0020) }
(0021)
(0022) void delay_1ms(void) //1ms延时函数
(0023) {
(0024) unsigned int i;
(0025) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
01BC 2700 CLR R16
01BD 2711 CLR R17
01BE C002 RJMP 0x01C1
01BF 5F0F SUBI R16,0xFF
01C0 4F1F SBCI R17,0xFF
01C1 3704 CPI R16,0x74
01C2 E0E4 LDI R30,4
01C3 071E CPC R17,R30
01C4 F3D0 BCS 0x01BF
01C5 9508 RET
_delay_nms:
i --> R20
n --> R22
01C6 940E04DF CALL push_gset2
01C8 01B8 MOVW R22,R16
(0026) }
(0027)
(0028) void delay_nms(unsigned int n) //N ms延时函数
(0029) {
(0030) unsigned int i=0;
01C9 2744 CLR R20
01CA 2755 CLR R21
(0031) for (i=0;i<n;i++)
01CB C003 RJMP 0x01CF
(0032) delay_1ms();
01CC DFEF RCALL _delay_1ms
01CD 5F4F SUBI R20,0xFF
01CE 4F5F SBCI R21,0xFF
01CF 1746 CP R20,R22
01D0 0757 CPC R21,R23
01D1 F3D0 BCS 0x01CC
01D2 940E04D0 CALL pop_gset2
01D4 9508 RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\PCF8563.c
(0001) /************************************************
(0002) 文件:PCF8563.h
(0003) 用途:PCF8563函数头文件
(0004) 注意:系统时钟8M
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) unsigned char syserr;
(0011) unsigned char *week_list[7]={
(0012) " Sunday ",
(0013) " Monday ",
(0014) " Tuesday ",
(0015) "Wednesday",
(0016) "Thursday ",
(0017) " Friday ",
(0018) "Saturday "
(0019) };
(0020) unsigned char write_buff[8],read_buff[8],time_tmp[]="00:00:00",data_tmp[]="2008.01.01",*week_tmp;
(0021) unsigned char time[7]={
(0022) 0x40/*秒*/,
(0023) 0x59/*分*/,
(0024) 0x23/*时*/,
(0025) 0x29/*天*/,
(0026) 0x05/*星期*/,
(0027) 0x02/*月/世纪*/,
(0028) 0x08/*年*/
(0029) };
(0030) /*************************************************************************
(0031) ** 函数名称: clear(unsigned char *p,unsigned char num)
(0032) ** 功能描述: 清除指定区域指定长度的数据
(0033) ** 输 入: unsigned char *p :起始地址 unsigned char num :零数据长度
(0034) ** 输出 :
(0035) ** 全局变量:
(0036) ** 调用模块:
(0037) ** 说明:
(0038) ** 注意:
(0039) **************************************************************************/
(0040) void clear(unsigned char *p,unsigned char num)
(0041) {
(0042) for(;num>0;num--)
_clear:
num --> R18
p --> R16
01D5 C006 RJMP 0x01DC
(0043) {
(0044) *p=0;
01D6 2422 CLR R2
01D7 01F8 MOVW R30,R16
01D8 8220 STD Z+0,R2
(0045) p++;
01D9 5F0F SUBI R16,0xFF
01DA 4F1F SBCI R17,0xFF
01DB 952A DEC R18
01DC 2422 CLR R2
01DD 1622 CP R2,R18
01DE F3B8 BCS 0x01D6
01DF 9508 RET
_PCF8536_wt:
t --> R10
data --> R20
add --> R22
01E0 940E04DD CALL push_gset3
01E2 2F42 MOV R20,R18
01E3 01B8 MOVW R22,R16
(0046) }
(0047) }
(0048) /*************************************************************************
(0049) ** 函数名称: PCF8536_wt(unsigned int add,unsigned char data)
(0050) ** 功能描述: 向PCF8563指定地址写入一条数据
(0051) ** 输 入: unsigned int add :高八位为器件地址,低八位为内部寄存器地址
(0052) unsigned char data :需要写入的数据
(0053) ** 输出 :
(0054) ** 全局变量:
(0055) ** 调用模块:
(0056) ** 说明:
(0057) ** 注意:
(0058) **************************************************************************/
(0059) void PCF8536_wt(unsigned int add,unsigned char data)
(0060) {
(0061) unsigned char t;
(0062) t=add>>8;
01E4 015B MOVW R10,R22
01E5 2CAB MOV R10,R11
01E6 24BB CLR R11
(0063) t<<=1;
01E7 0CAA LSL R10
(0064) i2cstart();
01E8 940E0187 CALL _i2cstart
(0065) if(i2cwt(W_ADD_COM+t)==SLAW)
01EA 2D0A MOV R16,R10
01EB 550E SUBI R16,0x5E
01EC 940E018F CALL _i2cwt
01EE 3108 CPI R16,0x18
01EF F439 BNE 0x01F7
(0066) {
(0067) i2cwt(add);
01F0 2F06 MOV R16,R22
01F1 940E018F CALL _i2cwt
(0068) i2cwt(data);
01F3 2F04 MOV R16,R20
01F4 940E018F CALL _i2cwt
(0069) }
01F6 C003 RJMP 0x01FA
(0070) else syserr=ERR_SLAW;
01F7 E081 LDI R24,1
01F8 938001AD STS syserr,R24
(0071) i2cstop();
01FA 940E01A7 CALL _i2cstop
01FC 940E04D3 CALL pop_gset3
01FE 9508 RET
_PCF8536_wt_p:
t --> R12
num --> R20
p --> R22
add --> R10
01FF 940E04DB CALL push_gset4
0201 01B9 MOVW R22,R18
0202 0158 MOVW R10,R16
0203 8548 LDD R20,Y+8
(0072) }
(0073) /*************************************************************************
(0074) ** 函数名称: PCF8536_wt_p(unsigned int add,unsigned char *p,unsigned char num)
(0075) ** 功能描述: 向PCF8563地址连续的寄存器写入系列数据
(0076) ** 输 入: unsigned int add :高八位为器件地址,低八位为内部寄存器地址
(0077) unsigned char *p :需要写入的数据域的起始地址
(0078) unsigned char num :写入数据的个数
(0079) ** 输出 :
(0080) ** 全局变量:
(0081) ** 调用模块:
(0082) ** 说明:写入数据区域为地址连续的寄存器
(0083) ** 注意:
(0084) **************************************************************************/
(0085) void PCF8536_wt_p(unsigned int add,unsigned char *p,unsigned char num)
(0086) {
(0087) unsigned char t;
(0088) t=add>>8;
0204 0165 MOVW R12,R10
0205 2CCD MOV R12,R13
0206 24DD CLR R13
(0089) t<<=1;
0207 0CCC LSL R12
(0090) i2cstart();
0208 940E0187 CALL _i2cstart
(0091) if(i2cwt(W_ADD_COM+t)==SLAW)
020A 2D0C MOV R16,R12
020B 550E SUBI R16,0x5E
020C 940E018F CALL _i2cwt
020E 3108 CPI R16,0x18
020F F481 BNE 0x0220
(0092) {
(0093) i2cwt(add);
0210 2D0A MOV R16,R10
0211 940E018F CALL _i2cwt
(0094) for(;num>0;num--)
0213 C008 RJMP 0x021C
(0095) {
(0096) i2cwt(*p);
0214 01FB MOVW R30,R22
0215 8100 LDD R16,Z+0
0216 940E018F CALL _i2cwt
(0097) p++;
0218 5F6F SUBI R22,0xFF
0219 4F7F SBCI R23,0xFF
(0098) _NOP();
021A 0000 NOP
021B 954A DEC R20
021C 2422 CLR R2
021D 1624 CP R2,R20
021E F3A8 BCS 0x0214
(0099) }
(0100) }
021F C003 RJMP 0x0223
(0101) else syserr=ERR_SLAW;
0220 E081 LDI R24,1
0221 938001AD STS syserr,R24
(0102) i2cstop();
0223 940E01A7 CALL _i2cstop
0225 940E04D6 CALL pop_gset4
0227 9508 RET
_PCF8536_rd:
t --> R12
num --> R20
p --> R22
add --> R10
0228 940E04DB CALL push_gset4
022A 01B9 MOVW R22,R18
022B 0158 MOVW R10,R16
022C 8548 LDD R20,Y+8
(0103) }
(0104) /*************************************************************************
(0105) ** 函数名称: PCF8536_rd(unsigned int add,unsigned char *p,unsigned char num)
(0106) ** 功能描述: 读PCF8563
(0107) ** 输 入: unsigned int add :高八位为器件地址,低八位为内部寄存器地址
(0108) unsigned char *p :读出的数据存放地址的起始地址
(0109) unsigned char num :读出数据的个数
(0110) ** 输出 :
(0111) ** 全局变量:
(0112) ** 调用模块:
(0113) ** 说明:
(0114) ** 注意:
(0115) **************************************************************************/
(0116) void PCF8536_rd(unsigned int add,unsigned char *p,unsigned char num)
(0117) {
(0118) unsigned char t;
(0119) t=add>>8;
022D 0165 MOVW R12,R10
022E 2CCD MOV R12,R13
022F 24DD CLR R13
(0120) t<<=1;
0230 0CCC LSL R12
(0121) i2cstart();
0231 940E0187 CALL _i2cstart
(0122) if(i2cwt(W_ADD_COM+t)==SLAW)
0233 2D0C MOV R16,R12
0234 550E SUBI R16,0x5E
0235 940E018F CALL _i2cwt
0237 3108 CPI R16,0x18
0238 F421 BNE 0x023D
(0123) {
(0124) i2cwt(add);
0239 2D0A MOV R16,R10
023A 940E018F CALL _i2cwt
(0125) }
023C C003 RJMP 0x0240
(0126) else syserr=ERR_SLAW;
023D E081 LDI R24,1
023E 938001AD STS syserr,R24
(0127)
(0128) i2cstart();
0240 940E0187 CALL _i2cstart
(0129) if(i2cwt(R_ADD_COM+t)==SLAW)
0242 2D0C MOV R16,R12
0243 550D SUBI R16,0x5D
0244 940E018F CALL _i2cwt
0246 3108 CPI R16,0x18
0247 F421 BNE 0x024C
(0130) {
(0131) i2cwt(add);
0248 2D0A MOV R16,R10
0249 940E018F CALL _i2cwt
(0132) }
024B C00B RJMP 0x0257
(0133) else syserr=ERR_SLAW;
024C E081 LDI R24,1
024D 938001AD STS syserr,R24
(0134)
(0135) for(;num>0;num--)
024F C007 RJMP 0x0257
(0136) {
(0137) *p=i2crd();
0250 940E019D CALL _i2crd
0252 01FB MOVW R30,R22
0253 8300 STD Z+0,R16
(0138) p++;
0254 5F6F SUBI R22,0xFF
0255 4F7F SBCI R23,0xFF
0256 954A DEC R20
0257 2422 CLR R2
0258 1624 CP R2,R20
0259 F3B0 BCS 0x0250
025A 940E04D6 CALL pop_gset4
025C 9508 RET
(0139) }
(0140) }
(0141) /*************************************************************************
(0142) ** 函数名称: PCF8563_init(void)
(0143) ** 功能描述: PCF8563初始化
(0144) ** 输 入:
(0145) ** 输出 :
(0146) ** 全局变量:
(0147) ** 调用模块:
(0148) ** 说明:
(0149) ** 注意:
(0150) **************************************************************************/
(0151) void PCF8563_init(void)
(0152) {
(0153) clear(write_buff,8);
_PCF8563_init:
025D E028 LDI R18,0x8
025E EB08 LDI R16,0xB8
025F E011 LDI R17,1
0260 DF74 RCALL _clear
(0154) clear(read_buff,8);
0261 E028 LDI R18,0x8
0262 EB00 LDI R16,0xB0
0263 E011 LDI R17,1
0264 DF70 RCALL _clear
(0155)
(0156) PCF8536_wt(0x00,0x20);//写寄存器1,停止计时
0265 E220 LDI R18,0x20
0266 2700 CLR R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -