📄 m16i2c.lst
字号:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E01F8 CALL _main
_exit:
004A CFFF RJMP _exit
_ChangeIntToHex:
dec --> R20
004B 940E0253 CALL push_gset1
004D 01A8 MOVW R20,R16
FILE: F:\job\M16学习板\I2C读写24C02(实验十)\..\ICC_H\SOFTWARE.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 Software_H
(0041) #define Software_H
(0042)
(0043) #include <math.h>
(0044) #include <string.h>
(0045)
(0046) /* 兼容一般程序员的常用写法 */
(0047) typedef unsigned char uchar;
(0048) typedef unsigned int uint;
(0049) typedef unsigned long ulong;
(0050) typedef signed char schar;
(0051) typedef signed int sint;
(0052) typedef signed long slong;
(0053)
(0054) /* 为方便移植,建议使用下面写法 */
(0055) typedef unsigned char bool;
(0056) typedef unsigned char bit;
(0057) typedef unsigned char uint8;
(0058) typedef unsigned int uint16;
(0059) typedef unsigned long uint32;
(0060) typedef signed char sint8;
(0061) typedef signed int sint16;
(0062) typedef signed long sint32;
(0063) typedef signed char int8;
(0064) typedef signed int int16;
(0065) typedef signed long int32;
(0066) //typedef const code;
(0067)
(0068) /* 一般程序定义的默认值 */
(0069) #define NULL 0
(0070) #define EOF -1
(0071) #define TRUE 1
(0072) #define FALSE 0
(0073) #define ON 1
(0074) #define OFF 0
(0075) #define ENABLE 1
(0076) #define DISABLE 0
(0077) #define CRR 1
(0078) #define ERR 0
(0079) #define RIGHT 1
(0080) #define WRONG 0
(0081) #define SUCCESS 1
(0082) #define FAILURE 0
(0083) //#define PI 3.1415926 //3.1415926535897932
(0084)
(0085) /* 如果你手头上的RAM实在很紧,不如尝试下面的define~ */
(0086) //#define _CALLOC(a) ( (a *)calloc(n,sizeof(a)) )
(0087) //#define _MALLOC(a) ( (a *)malloc(sizeof(a)) )
(0088) //#define _MIN(a,b) ( (a) < (b) ? (a) : (b) )
(0089) //#define _MAX(a,b) ( (a) > (b) ? (a) : (b) )
(0090) //#define _EXCHANGE(a,b) { int t; t=a; a=b; b=t; }
(0091) //#define _TOLOWER(c) ( (c)+32 )
(0092) //#define _TOUPPER(c) ( (c)-32 )
(0093)
(0094) //#ifndef BIT
(0095) //#define BIT(x) ( 1<<(x) )
(0096) //#endif
(0097)
(0098) /*--------------------------------------------------------------------
(0099) 函数全称:数据拆字
(0100) 函数功能:自己看~
(0101) 注意事项:D<=999999,C<=6
(0102) 提示说明:调用speaData(12,2),得到dataElem[0]=2,dataElem[1]=1
(0103) 输 入:
(0104) 返 回:无
(0105) --------------------------------------------------------------------
(0106) uint8 dataElem[6];
(0107) void speaData(uint32 dat,sint8 len)
(0108) {
(0109) uint8 i;
(0110) uint32 j,y;
(0111) for(i=0,j=1;i<len;i++)
(0112) {
(0113) y=dat/j;
(0114) dataElem[i]=y%10;
(0115) j*=10;
(0116) }
(0117) }
(0118) /*--------------------------------------------------------------------
(0119) 函数全称:十进制强制转换为十六进制
(0120) 函数功能:
(0121) 注意事项:
(0122) 提示说明:调用changeIntToHex(33),return 0x33
(0123) 输 入:
(0124) 返 回:
(0125) --------------------------------------------------------------------*/
(0126) #define changeIntToHex(dec) ( ( ((dec)/10) <<4 ) + ((dec)%10) )
(0127) /*--------------------------------------------------------------------
(0128) 函数全称:十进制强制转换为十六进制
(0129) 函数功能:
(0130) 注意事项:
(0131) 提示说明:调用changeIntToHex(33),return 0x33
(0132) 输 入:
(0133) 返 回:
(0134) --------------------------------------------------------------------*/
(0135) void ChangeIntToHex( uchar *dec)
(0136) {
(0137) *dec = (((*dec)/10) <<4 )|((*dec)%10) ;
004E 01FA MOVW R30,R20
004F 8020 LDD R2,Z+0
0050 2433 CLR R3
0051 E01A LDI R17,0xA
0052 2D02 MOV R16,R2
0053 940E022D CALL mod8u
0055 2E40 MOV R4,R16
0056 E01A LDI R17,0xA
0057 2D02 MOV R16,R2
0058 940E022F CALL div8u
005A 2F80 MOV R24,R16
005B 708F ANDI R24,0xF
005C 9582 SWAP R24
005D 2984 OR R24,R4
005E 01FA MOVW R30,R20
005F 8380 STD Z+0,R24
0060 940E0256 CALL pop_gset1
0062 9508 RET
(0138) }
(0139) /*--------------------------------------------------------------------
(0140) 函数全称:十进制化为十六进制,并以十进制格式返回
(0141) 函数功能:
(0142) 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳
(0143) 提示说明:调用converseIntToHex(33),return 21
(0144) 输 入:
(0145) 返 回:
(0146) --------------------------------------------------------------------/
(0147) #define converseIntToHex(dec) ( ( ((dec)>>4) *10 ) + ((dec)%16) )
(0148) /*--------------------------------------------------------------------
(0149) 函数全称:十六进制强制转换为十进制
(0150) 函数功能:
(0151) 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳
(0152) 提示说明:调用changeHexToInt(0x33),return 33
(0153) 输 入:
(0154) 返 回:
(0155) --------------------------------------------------------------------*/
(0156) #define changeHexToInt(hex) ( ( ((hex)>>4) *10 ) + ((hex)%16) )
(0157) /*--------------------------------------------------------------------
(0158) 函数全称:十六进制强制转换为十进制
(0159) 函数功能:
(0160) 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳
(0161) 提示说明:调用changeHexToInt(0x33),return 33
(0162) 输 入:
(0163) 返 回:
(0164) --------------------------------------------------------------------*/
(0165) void ChangeHexToInt(uchar *hex)
(0166) {
(0167) *hex = (((*hex)>>4) *10 ) + ((*hex)&0x0f);
_ChangeHexToInt:
hex --> R16
0063 01F8 MOVW R30,R16
0064 8020 LDD R2,Z+0
0065 2433 CLR R3
0066 2D82 MOV R24,R2
0067 9582 SWAP R24
0068 708F ANDI R24,0xF
0069 E09A LDI R25,0xA
006A 9F98 MUL R25,R24
006B 2D82 MOV R24,R2
006C 708F ANDI R24,0xF
006D 2C20 MOV R2,R0
006E 0E28 ADD R2,R24
006F 8220 STD Z+0,R2
0070 9508 RET
(0168) }
(0169) /*--------------------------------------------------------------------
(0170) 函数全称:十六进制化为十进制,,并以十六进制格式返回
(0171) 函数功能:
(0172) 注意事项:
(0173) 提示说明:调用converseHexToInt(0x33),return 0x51
(0174) 输 入:
(0175) 返 回:
(0176) --------------------------------------------------------------------*/
(0177) #define converseHexToInt(hex) ( ( ((hex)/10) <<4 ) + ((hex)%10) )
(0178)
(0179) void Delay(void)
(0180) {
(0181) uchar i;
(0182) i = 200;
_Delay:
i --> R16
0071 EC08 LDI R16,0xC8
(0183) while(i--);
0072 2E20 MOV R2,R16
0073 2433 CLR R3
0074 5001 SUBI R16,1
0075 2022 TST R2
0076 F7D9 BNE 0x0072
0077 9508 RET
FILE: F:\job\M16学习板\I2C读写24C02(实验十)\..\ICC_H\I2C.H
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
(0004) 目 的: 建立I2C操作库
(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 I2C_H
(0041) #define I2C_H
(0042) #include "..\ICC_H\software.h"
(0043) /* TWSR values (not bits) */
(0044) /* Master */
(0045) #define I2C_START 0x08
(0046) #define I2C_RESTART 0x10
(0047)
(0048) /* Master Transmitter */
(0049) #define I2C_MT_SLA_ACK 0x18
(0050) #define I2C_MT_SLA_NACK 0x20
(0051) #define I2C_MT_DATA_ACK 0x28
(0052) #define I2C_MT_DATA_NACK 0x30
(0053) #define I2C_MT_ARB_LOST 0x38
(0054)
(0055) /* Master Receiver */
(0056) #define I2C_MR_ARB_LOST 0x38
(0057) #define I2C_MR_SLA_ACK 0x40
(0058) #define I2C_MR_SLA_NACK 0x48
(0059) #define I2C_MR_DATA_ACK 0x50
(0060) #define I2C_MR_DATA_NACK 0x58
(0061)
(0062) /* Slave Transmitter */
(0063) #define I2C_ST_SLA_ACK 0xA8
(0064) #define I2C_ST_ARB_LOST_SLA_ACK 0xB0
(0065) #define I2C_ST_DATA_ACK 0xB8
(0066) #define I2C_ST_DATA_NACK 0xC0
(0067) #define I2C_ST_LAST_DATA 0xC8
(0068)
(0069) /* Slave Receiver */
(0070) #define I2C_SR_SLA_ACK 0x60
(0071) #define I2C_SR_ARB_LOST_SLA_ACK 0x68
(0072) #define I2C_SR_GCALL_ACK 0x70
(0073) #define I2C_SR_ARB_LOST_GCALL_ACK 0x78
(0074) #define I2C_SR_DATA_ACK 0x80
(0075) #define I2C_SR_DATA_NACK 0x88
(0076) #define I2C_SR_GCALL_DATA_ACK 0x90
(0077) #define I2C_SR_GCALL_DATA_NACK 0x98
(0078) #define I2C_SR_STOP 0xA0
(0079)
(0080) /* Misc */
(0081) #define I2C_NO_INFO 0xF8
(0082) #define I2C_BUS_ERROR 0x00
(0083)
(0084) /*
(0085) * The lower 3 bits of TWSR are reserved on the ATmega163.
(0086) * The 2 LSB carry the prescaler bits on the newer ATmegas.
(0087) */
(0088) #define I2C_STATUS_MASK (_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3))
(0089) #define I2C_STATUS (TWSR & I2C_STATUS_MASK)
(0090)
(0091) /*
(0092) * R/~W bit in SLA+R/W address field.
(0093) */
(0094) #define I2C_READ 1
(0095) #define I2C_WRITE 0
(0096)
(0097) #define I2CStart() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0098) #define I2CStop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0099) #define I2CWaitAck() {while(!(TWCR&(1<<TWINT)));}
(0100) #define I2CChkAck() (TWSR&0xf8) //check ack
(0101) #define I2CSendAck() (TWCR|=(1<<TWEA))
(0102) #define I2CSendNoAck() (TWCR&=~(1<<TWEA))
(0103) #define I2CSendByte(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
(0104) #define I2CRcvNckByte() (TWCR=(1<<TWINT)|(1<<TWEN))
(0105) #define I2CRcvAckByte() (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA))
(0106)
(0107) /* For Program */
(0108) #define I2C_Stop() I2CStop()
(0109) #define I2C_SendAck() I2CSendAck()
(0110) #define I2C_SendNoAck() I2CSendNoAck()
(0111) #define I2C_WaitAck() I2CWaitAck()
(0112)
(0113) /* I2C Config */
(0114) #define I2C_ERR 0
(0115) #define I2C_CRR 1
(0116)
(0117) /*--------------------------------------------------------------------
(0118) 函数名称:I2C Start
(0119) 函数功能:
(0120) 注意事项:
(0121) 提示说明:
(0122) 输 入:
(0123) 返 回:
(0124) --------------------------------------------------------------------*/
(0125) bool I2C_Start()
(0126) {
(0127) I2CStart();
_I2C_Start:
0078 EA84 LDI R24,0xA4
0079 BF86 OUT 0x36,R24
(0128) I2CWaitAck();
007A B626 IN R2,0x36
007B FE27 SBRS R2,7
007C CFFD RJMP 0x007A
(0129) if( I2CChkAck()!=I2C_START )
007D B181 IN R24,0x01
007E 7F88 ANDI R24,0xF8
007F 3088 CPI R24,0x8
0080 F011 BEQ 0x0083
(0130) return I2C_ERR;
0081 2700 CLR R16
0082 C001 RJMP 0x0084
(0131) return I2C_CRR;
0083 E001 LDI R16,1
0084 9508 RET
(0132) }
(0133) /*--------------------------------------------------------------------
(0134) 函数名称:I2C ReStart
(0135) 函数功能:
(0136) 注意事项:
(0137) 提示说明:
(0138) 输 入:
(0139) 返 回:
(0140) --------------------------------------------------------------------*/
(0141) bool I2C_Restart()
(0142) {
(0143) I2CStart();
_I2C_Restart:
0085 EA84 LDI R24,0xA4
0086 BF86 OUT 0x36,R24
(0144) I2CWaitAck();
0087 B626 IN R2,0x36
0088 FE27 SBRS R2,7
0089 CFFD RJMP 0x0087
(0145) if( I2CChkAck()!=I2C_RESTART )
008A B181 IN R24,0x01
008B 7F88 ANDI R24,0xF8
008C 3180 CPI R24,0x10
008D F011 BEQ 0x0090
(0146) return I2C_ERR;
008E 2700 CLR R16
008F C001 RJMP 0x0091
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -