📄 pcf8591.lst
字号:
(0342)
(0343) return I2C_CRR;
018C E001 LDI R16,1
018D 940E02F5 CALL pop_gset2
018F 9508 RET
_I2C_Read_:
i --> R20
num --> R22
pRdDat --> R10
rdDAdr --> Y+8
wordAdr --> R20
wrDAdr --> R12
0190 940E031A CALL push_gset4
0192 2F42 MOV R20,R18
0193 0168 MOVW R12,R16
0194 84AA LDD R10,Y+10
0195 84BB LDD R11,Y+11
0196 856C LDD R22,Y+12
(0344) }
(0345) /*--------------------------------------------------------------------
(0346) 函数名称:I2C读器件,读N个数据
(0347) 函数功能:
(0348) 注意事项:
(0349) 提示说明:
(0350) 输 入:wrDAdr: write device-address 写器件地址
(0351) wordAdr: word address 字地址
(0352) rdDAdr: read device-address 读器件地址
(0353) *pRdDat: p->read data 读取数据指针
(0354) num: number 读取数据个数
(0355) 返 回:
(0356) --------------------------------------------------------------------*/
(0357) bool I2C_Read_(uint16 wrDAdr,uint8 wordAdr,
(0358) uint8 rdDAdr,uint8 *pRdDat,uint8 num)
(0359) {
(0360) uint8 i;
(0361)
(0362) if( I2C_Start()==I2C_ERR )
0197 DF12 RCALL _I2C_Start
0198 2300 TST R16
0199 F411 BNE 0x019C
(0363) return I2C_ERR;
019A 2700 CLR R16
019B C032 RJMP 0x01CE
(0364)
(0365) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
019C 0186 MOVW R16,R12
019D DF34 RCALL _I2C_SendWrDAdr_
019E 2300 TST R16
019F F411 BNE 0x01A2
(0366) return I2C_ERR;
01A0 2700 CLR R16
01A1 C02C RJMP 0x01CE
(0367)
(0368) if( I2C_SendDat(wordAdr)==I2C_ERR )
01A2 2F04 MOV R16,R20
01A3 DF70 RCALL _I2C_SendDat
01A4 2300 TST R16
01A5 F411 BNE 0x01A8
(0369) return I2C_ERR;
01A6 2700 CLR R16
01A7 C026 RJMP 0x01CE
(0370)
(0371) if( I2C_Restart()==I2C_ERR )
01A8 DF0E RCALL _I2C_Restart
01A9 2300 TST R16
01AA F411 BNE 0x01AD
(0372) return I2C_ERR;
01AB 2700 CLR R16
01AC C021 RJMP 0x01CE
(0373)
(0374) if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )
01AD 8508 LDD R16,Y+8
01AE DF3D RCALL _I2C_SendRdDAdr
01AF 2300 TST R16
01B0 F411 BNE 0x01B3
(0375) return I2C_ERR;
01B1 2700 CLR R16
01B2 C01B RJMP 0x01CE
(0376)
(0377) for(i=0;i<num-1;i++)
01B3 2744 CLR R20
01B4 C00A RJMP 0x01BF
(0378) if( I2C_RcvAckDat(pRdDat+i)==I2C_ERR )
01B5 2F04 MOV R16,R20
01B6 2711 CLR R17
01B7 0D0A ADD R16,R10
01B8 1D1B ADC R17,R11
01B9 DF78 RCALL _I2C_RcvAckDat
01BA 2300 TST R16
01BB F411 BNE 0x01BE
(0379) return I2C_ERR;
01BC 2700 CLR R16
01BD C010 RJMP 0x01CE
01BE 9543 INC R20
01BF 2F86 MOV R24,R22
01C0 5081 SUBI R24,1
01C1 1748 CP R20,R24
01C2 F390 BCS 0x01B5
(0380)
(0381) if( I2C_RcvNAckDat(pRdDat+i)==I2C_ERR )
01C3 2F04 MOV R16,R20
01C4 2711 CLR R17
01C5 0D0A ADD R16,R10
01C6 1D1B ADC R17,R11
01C7 DF5A RCALL _I2C_RcvNAckDat
01C8 2300 TST R16
01C9 F411 BNE 0x01CC
(0382) return I2C_ERR;
01CA 2700 CLR R16
01CB C002 RJMP 0x01CE
(0383)
(0384) I2C_Stop();
01CC E984 LDI R24,0x94
01CD BF86 OUT 0x36,R24
(0385) }
01CE 940E02F8 CALL pop_gset4
01D0 9508 RET
_delay50us:
j --> R20
t --> R16
01D1 940E02FB CALL push_gset1
FILE: D:\ICC_H\Hardware.H
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
(0004) 目 的: 建立AVR的硬件提取库函数,增加各类补丁,方便移植
(0005)
(0006) 目标系统: 基于AVR单片机
(0007)
(0008) 应用软件: ICCAVR
(0009)
(0010) 版 本: Version 1.0
(0011)
(0012) 圆版时间: 2005-06-25
(0013)
(0014) 开发人员: SEE(中文名不告诉你~怕你骂我)
(0015)
(0016) 说 明: 若用于商业用途,请保留此段文字或注明代码来源
(0017)
(0018) 深 圳 微 雪 电 子 保 留 所 有 的 版 权
(0019) *********************************************************************/
(0020)
(0021) /*01010101010101010101010101010101010101010101010101010101010101010101
(0022) ----------------------------------------------------------------------
(0023) 版本更新记录:
(0024)
(0025) ----------------------------------------------------------------------
(0026) 入口参数说明:
(0027)
(0028) ----------------------------------------------------------------------
(0029) 待定参数说明:
(0030)
(0031) ----------------------------------------------------------------------
(0032) 对外变量说明:
(0033)
(0034) ----------------------------------------------------------------------
(0035) 对外函数说明:
(0036)
(0037) ----------------------------------------------------------------------
(0038) 10101010101010101010101010101010101010101010101010101010101010101010*/
(0039)
(0040) #ifndef Hardware_H
(0041) #define Hardware_H
(0042)
(0043) #include <math.h>
(0044) #include <string.h>
(0045) #include <stdio.h>
(0046) #include <macros.h>
(0047) #include <eeprom.h>
(0048) //#include <wdt.h>
(0049) #include "D:\ICC_H\I2C.H" //i2c即AVR的"twi"
(0050)
(0051) /* hard configs */
(0052) #ifndef flash
(0053) #define flash const
(0054) #endif
(0055)
(0056) #ifndef code
(0057) #define code const
(0058) #endif
(0059)
(0060) #ifndef NOP
(0061) #define NOP() asm("nop")
(0062) #endif
(0063)
(0064) /* io configs */
(0065) #define sbi(io,bit) ( io |= (1<<bit) ) //example: sbi(PORTA,0);sbi(DDRA,0);
(0066) #define cbi(io,bit) ( io &= ~(1<<bit) ) //example: cbi(PORTA,0);cbi(DDRA,0);
(0067) #define gbi(pin ,bit) ( pin & (1<<bit) ) //example: gbi(PINA,0);
(0068)
(0069) /* interrupt configs */
(0070) #define DIS_INT asm("sei")
(0071) #define EN_INT asm("cli")
(0072)
(0073) /* wdt configs */
(0074) #define WDT() asm("wdr")
(0075)
(0076) /* bit operation */
(0077) //#ifndef BIT
(0078) //#define BIT(x) ( 1<<(x) )
(0079) //#endif
(0080)
(0081) /* USART configs for 4 Mhz crystal */
(0082) //#define BAUD9600 25
(0083) //#define BAUD19000 12
(0084) //#define UART_TRAN_ON() UCR |= 0x08
(0085) //#define UART_TRAN_OFF() UCR &= ~0x08
(0086) //#define UART_RCV_ON() UCR |= 0x10
(0087) //#define UART_RCV_OFF() UCR &= ~0x10
(0088)
(0089) /*--------------------------------------------------------------------
(0090) 函数全称:50us 延时
(0091) 函数功能:当然是 50us延时 啦
(0092) 注意事项:基于7.3728M晶振,稍微有点误差
(0093) 提示说明:调用Delay50us(20),得到1ms延时
(0094) 输 入:
(0095) 返 回:无
(0096) --------------------------------------------------------------------*/
(0097) void delay50us(sint16 t)
(0098) {
(0099) uint8 j;
(0100) for(;t>0;t--)
01D3 C007 RJMP 0x01DB
(0101) for(j=0;j<70;j++)
01D4 2744 CLR R20
01D5 C001 RJMP 0x01D7
01D6 9543 INC R20
01D7 3446 CPI R20,0x46
01D8 F3E8 BCS 0x01D6
01D9 5001 SUBI R16,1
01DA 4010 SBCI R17,0
01DB 2422 CLR R2
01DC 2433 CLR R3
01DD 1620 CP R2,R16
01DE 0631 CPC R3,R17
01DF F3A4 BLT 0x01D4
(0102) ;
(0103) }
01E0 940E02FE CALL pop_gset1
01E2 9508 RET
_delay50ms:
i --> R20
t --> R16
01E3 940E02FB CALL push_gset1
(0104) /*--------------------------------------------------------------------
(0105) 函数全称:50ms 延时
(0106) 函数功能:当然是 50ms延时 啦
(0107) 注意事项:基于7.3728M晶振,稍微有点误差
(0108) 提示说明:调用delay50ms(20),得到1s延时
(0109) 输 入:
(0110) 返 回:无
(0111) --------------------------------------------------------------------*/
(0112) void delay50ms(sint16 t)
(0113) {
(0114) uint16 i;
(0115) for(;t>0;t--)
01E5 C00B RJMP 0x01F1
(0116) for(i=0;i<52642;i++)
01E6 2744 CLR R20
01E7 2755 CLR R21
01E8 C002 RJMP 0x01EB
01E9 5F4F SUBI R20,0xFF
01EA 4F5F SBCI R21,0xFF
01EB 3A42 CPI R20,0xA2
01EC ECED LDI R30,0xCD
01ED 075E CPC R21,R30
01EE F3D0 BCS 0x01E9
01EF 5001 SUBI R16,1
01F0 4010 SBCI R17,0
01F1 2422 CLR R2
01F2 2433 CLR R3
01F3 1620 CP R2,R16
01F4 0631 CPC R3,R17
01F5 F384 BLT 0x01E6
(0117) ;
(0118) }
01F6 940E02FE CALL pop_gset1
01F8 9508 RET
_PCF8591_getAD:
pRdDat --> Y+8
chan --> R20
mode --> R22
01F9 940E0312 CALL push_gset2
01FB 2F42 MOV R20,R18
01FC 2F60 MOV R22,R16
01FD 9724 SBIW R28,4
FILE: D:\ICC_H\PCF8591.H
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
(0004) 目 的: 建立方便的PCF8591操作子程序
(0005)
(0006) 目标系统: 基于任何兼容C51的微处理器
(0007)
(0008) 应用软件: Keil C
(0009)
(0010) 版 本: Version 1.0
(0011)
(0012) 圆版时间: 2004-11-26
(0013)
(0014) 开发人员: SEE(中文名不告诉你~怕你骂我)
(0015)
(0016) 说 明: 若用于商业用途,请保留此段文字或注明代码来源
(0017)
(0018) 深 圳 微 雪 电 子 保 留 所 有 的 版 权
(0019) *********************************************************************/
(0020)
(0021) /*01010101010101010101010101010101010101010101010101010101010101010101
(0022) ----------------------------------------------------------------------
(0023) 版本更新记录:
(0024)
(0025) ----------------------------------------------------------------------
(0026) 入口参数说明:
(0027) sbit I2C_SCL=P3^1;
(0028) sbit I2C_SDA=P3^0;
(0029) #define WR_DADR 0x90 //器件地址:A2 A1 A0 = 0 0 0
(0030) #define RD_DADR 0x91 //器件地址:A2 A1 A0 = 0 0 0
(0031)
(0032) ----------------------------------------------------------------------
(0033) 待定参数说明:
(0034)
(0035) ----------------------------------------------------------------------
(0036) 对外变量说明:
(0037)
(0038) ----------------------------------------------------------------------
(0039) 对外函数说明:
(0040)
(0041) ----------------------------------------------------------------------
(0042) 10101010101010101010101010101010101010101010101010101010101010101010*/
(0043)
(0044) #ifndef PCF8591_H
(0045) #define PCF8591_H
(0046)
(0047) #include "D:\ICC_H\CmmICC.H"
(0048) //sbit I2C_SCL=P3^1;
(0049) //sbit I2C_SDA=P3^0;
(0050) #include "D:\ICC_H\I2C.H"
(0051)
(0052) //器件地址:A0 A1 A2 = 0 0 0
(0053) #ifndef WR_DADR
(0054) #define WR_DADR 0x90 //write device-address
(0055) #endif
(0056) #ifndef RD_DADR
(0057) #define RD_DADR 0x91 //read device-address
(0058) #endif
(0059)
(0060) #define MODE0 0x00 //Channel0 = AIN0;
(0061) //Channel1 = AIN1;
(0062) //Channel2 = AIN2;
(0063) //Channel3 = AIN3;
(0064) #define MODE1 0x10 //Channel0 = AIN3-AIN0;
(0065) //Channel1 = AIN3-AIN1
(0066) //Channel2 = AIN3-AIN2;
(0067) #define MODE2 0x20 //Channel0 = AIN0;
(0068) //Channel1 = AIN1;
(0069) //Channel2 = AIN3-AIN2;
(0070) #define MODE3 0x30 //Channel0 = AIN1-AIN0;
(0071) //Channel1 = AIN3-AIN2;
(0072)
(0073) #define CHNL0 0 //Using Channel0
(0074) #define CHNL1 1 //Using Channel1
(0075) #define CHNL2 2 //Using Channel2
(0076) #define CHNL3 3 //Using Channel3
(0077)
(0078) #define DAouputEn 0x40 //0x50 or 0x60 or 0x70 is also ok!
(0079)
(0080) /*--------------------------------------------------------------------
(0081) 函数全称:
(0082) 函数功能:
(0083) 注意事项:
(0084) 提示说明:
(0085) 输 入:
(0086) 返 回:00H~FFH
(0087) --------------------------------------------------------------------*/
(0088) void PCF8591_getAD(uint8 mode,uint8 chan,uint8 *pRdDat)
(0089) {
(0090) I2C_Read(WR_DADR,mode|chan,RD_DADR,pRdDat);
01FE 8408 LDD R0,Y+8
01FF 8419 LDD R1,Y+9
0200 821B STD Y+3,R1
0201 820A STD Y+2,R0
0202 E981 LDI R24,0x91
0203 8388 STD Y+0,R24
0204 2F26 MOV R18,R22
0205 2B24 OR R18,R20
0206 E900 LDI R16,0x90
0207 E010 LDI R17,0
0208 DF5A RCALL _I2C_Read
(0091) }
0209 9624 ADIW R28,4
020A 940E02F5 CALL pop_gset2
020C 9508 RET
_PCF8591_setDA:
val --> R20
020D 940E02FB CALL push_gset1
020F 2F40 MOV R20,R16
0210 9721 SBIW R28,1
(0092) /*--------------------------------------------------------------------
(0093) 函数全称:
(0094) 函数功能:
(0095) 注意事项:
(0096) 提示说明:
(0097) 输 入:00H~FFH
(0098) 返 回:
(0099) --------------------------------------------------------------------*/
(0100) void PCF8591_setDA(uint8 val)
(0101) {
(0102) I2C_Write(WR_DADR,DAouputEn,val);
0211 8348 STD Y+0,R20
0212 E420 LDI R18,0x40
0213 E900 LDI R16,0x90
0214 E010 LDI R17,0
0215 DF2C RCALL _I2C_Write
(0103) }
0216 9621 ADIW R28,1
0217 940E02FE CALL pop_gset1
0219 9508 RET
FILE: E:\ProductPro\M16SD\ICCAVR\PCF8591\PCF8591\PCF8591.C
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -