📄 ps2simplesoft.lst
字号:
__start:
__text_start:
00A2 E5CF LDI R28,0x5F
00A3 E0D4 LDI R29,4
00A4 BFCD OUT 0x3D,R28
00A5 BFDE OUT 0x3E,R29
00A6 51C0 SUBI R28,0x10
00A7 40D0 SBCI R29,0
00A8 EA0A LDI R16,0xAA
00A9 8308 STD Y+0,R16
00AA 2400 CLR R0
00AB E6E4 LDI R30,0x64
00AC E0F0 LDI R31,0
00AD E010 LDI R17,0
00AE 36EB CPI R30,0x6B
00AF 07F1 CPC R31,R17
00B0 F011 BEQ 0x00B3
00B1 9201 ST R0,Z+
00B2 CFFB RJMP 0x00AE
00B3 8300 STD Z+0,R16
00B4 E4E0 LDI R30,0x40
00B5 E0F1 LDI R31,1
00B6 E6A0 LDI R26,0x60
00B7 E0B0 LDI R27,0
00B8 E011 LDI R17,1
00B9 34E4 CPI R30,0x44
00BA 07F1 CPC R31,R17
00BB F021 BEQ 0x00C0
00BC 95C8 LPM
00BD 9631 ADIW R30,1
00BE 920D ST R0,X+
00BF CFF9 RJMP 0x00B9
00C0 940E032B CALL _main
_exit:
00C2 CFFF RJMP _exit
_speaData:
y --> Y+4
j --> Y+0
i --> R10
len --> R12
dat --> Y+16
00C3 940E033A CALL push_arg4
00C5 940E0405 CALL push_gset4
00C7 9728 SBIW R28,0x8
00C8 88CC LDD R12,Y+20
FILE: D:\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 uint8;
(0057) typedef unsigned int uint16;
(0058) typedef unsigned long uint32;
(0059) typedef signed char sint8;
(0060) typedef signed int sint16;
(0061) typedef signed long sint32;
(0062) typedef signed char int8;
(0063) typedef signed int int16;
(0064) typedef signed long int32;
(0065)
(0066) /* 下面写法一般不推荐 */
(0067) //typedef unsigned char ubyte;
(0068) //typedef unsigned int uword;
(0069) //typedef unsigned long udword;
(0070) //typedef signed char sbyte;
(0071) //typedef signed int sword;
(0072) //typedef signed long sdword;
(0073)
(0074) /* 一般程序定义的默认值 */
(0075) //#define NULL 0
(0076) //#define EOF -1
(0077) //#define TRUE 1
(0078) //#define FALSE 0
(0079) //#define YES 1
(0080) //#define NO 0
(0081) //#define ON 1
(0082) //#define OFF 0
(0083) //#define ENABLE 1
(0084) //#define DISABLE 0
(0085) //#define CRR 1
(0086) //#define ERR 0
(0087) //#define RIGHT 1
(0088) //#define WRONG 0
(0089) //#define SUCCESS 1
(0090) //#define FAILURE 0
(0091) //#define PI 3.1415926 //3.1415926535897932
(0092)
(0093) /* 如果你手头上的RAM实在很紧,不如尝试下面的define~ */
(0094) //#define _CALLOC(a) ( (a *)calloc(n,sizeof(a)) )
(0095) //#define _MALLOC(a) ( (a *)malloc(sizeof(a)) )
(0096) //#define _MIN(a,b) ( (a) < (b) ? (a) : (b) )
(0097) //#define _MAX(a,b) ( (a) > (b) ? (a) : (b) )
(0098) //#define _EXCHANGE(a,b) { int t; t=a; a=b; b=t; }
(0099) //#define _TOLOWER(c) ( (c)+32 )
(0100) //#define _TOUPPER(c) ( (c)-32 )
(0101)
(0102) //#ifndef BIT
(0103) //#define BIT(x) ( 1<<(x) )
(0104) //#endif
(0105)
(0106) /*--------------------------------------------------------------------
(0107) 函数全称:数据拆字
(0108) 函数功能:自己看~
(0109) 注意事项:D<=999999,C<=6
(0110) 提示说明:调用speaData(12,2),得到dataElem[0]=2,dataElem[1]=1
(0111) 输 入:
(0112) 返 回:无
(0113) --------------------------------------------------------------------*/
(0114) uint8 dataElem[6];
(0115) void speaData(uint32 dat,sint8 len)
(0116) {
(0117) uint8 i;
(0118) uint32 j,y;
(0119) for(i=0,j=1;i<len;i++)
00C9 24AA CLR R10
00CA E041 LDI R20,1
00CB E050 LDI R21,0
00CC E060 LDI R22,0
00CD E070 LDI R23,0
00CE 01FE MOVW R30,R28
00CF 8340 STD Z+0,R20
00D0 8351 STD Z+1,R21
00D1 8362 STD Z+2,R22
00D2 8373 STD Z+3,R23
00D3 C046 RJMP 0x011A
(0120) {
(0121) y=dat/j;
00D4 01FE MOVW R30,R28
00D5 8020 LDD R2,Z+0
00D6 8031 LDD R3,Z+1
00D7 8042 LDD R4,Z+2
00D8 8053 LDD R5,Z+3
00D9 01FE MOVW R30,R28
00DA 8860 LDD R6,Z+16
00DB 8871 LDD R7,Z+17
00DC 8882 LDD R8,Z+18
00DD 8893 LDD R9,Z+19
00DE 925A ST R5,-Y
00DF 924A ST R4,-Y
00E0 923A ST R3,-Y
00E1 922A ST R2,-Y
00E2 0183 MOVW R16,R6
00E3 0194 MOVW R18,R8
00E4 940E033F CALL div32u
00E6 01FE MOVW R30,R28
00E7 8304 STD Z+4,R16
00E8 8315 STD Z+5,R17
00E9 8326 STD Z+6,R18
00EA 8337 STD Z+7,R19
(0122) dataElem[i]=y%10;
00EB E04A LDI R20,0xA
00EC E050 LDI R21,0
00ED E060 LDI R22,0
00EE E070 LDI R23,0
00EF 01FE MOVW R30,R28
00F0 8024 LDD R2,Z+4
00F1 8035 LDD R3,Z+5
00F2 8046 LDD R4,Z+6
00F3 8057 LDD R5,Z+7
00F4 937A ST R23,-Y
00F5 936A ST R22,-Y
00F6 935A ST R21,-Y
00F7 934A ST R20,-Y
00F8 0181 MOVW R16,R2
00F9 0192 MOVW R18,R4
00FA 940E0341 CALL mod32u
00FC E685 LDI R24,0x65
00FD E090 LDI R25,0
00FE 2DEA MOV R30,R10
00FF 27FF CLR R31
0100 0FE8 ADD R30,R24
0101 1FF9 ADC R31,R25
0102 8300 STD Z+0,R16
(0123) j*=10;
0103 01FE MOVW R30,R28
0104 8020 LDD R2,Z+0
0105 8031 LDD R3,Z+1
0106 8042 LDD R4,Z+2
0107 8053 LDD R5,Z+3
0108 E04A LDI R20,0xA
0109 E050 LDI R21,0
010A E060 LDI R22,0
010B E070 LDI R23,0
010C 925A ST R5,-Y
010D 924A ST R4,-Y
010E 923A ST R3,-Y
010F 922A ST R2,-Y
0110 018A MOVW R16,R20
0111 019B MOVW R18,R22
0112 940E03B0 CALL empy32s
0114 01FE MOVW R30,R28
0115 8300 STD Z+0,R16
0116 8311 STD Z+1,R17
0117 8322 STD Z+2,R18
0118 8333 STD Z+3,R19
0119 94A3 INC R10
011A 14AC CP R10,R12
011B F408 BCC 0x011D
011C CFB7 RJMP 0x00D4
(0124) }
(0125) }
011D 9628 ADIW R28,0x8
011E 940E03E3 CALL pop_gset4
0120 9624 ADIW R28,4
0121 9508 RET
FILE: D:\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)
(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:
0122 EA84 LDI R24,0xA4
0123 BF86 OUT 0x36,R24
(0128) I2CWaitAck();
0124 B626 IN R2,0x36
0125 FE27 SBRS R2,7
0126 CFFD RJMP 0x0124
(0129) if( I2CChkAck()!=I2C_START )
0127 B181 IN R24,0x01
0128 7F88 ANDI R24,0xF8
0129 3088 CPI R24,0x8
012A F011 BEQ 0x012D
(0130) return I2C_ERR;
012B 2700 CLR R16
012C C001 RJMP 0x012E
(0131) return I2C_CRR;
012D E001 LDI R16,1
012E 9508 RET
(0132) }
(0133) /*--------------------------------------------------------------------
(0134) 函数名称:I2C ReStart
(0135) 函数功能:
(0136) 注意事项:
(0137) 提示说明:
(0138) 输 入:
(0139) 返 回:
(0140) --------------------------------------------------------------------*/
(0141) bool I2C_Restart()
(0142) {
(0143) I2CStart();
_I2C_Restart:
012F EA84 LDI R24,0xA4
0130 BF86 OUT 0x36,R24
(0144) I2CWaitAck();
0131 B626 IN R2,0x36
0132 FE27 SBRS R2,7
0133 CFFD RJMP 0x0131
(0145) if( I2CChkAck()!=I2C_RESTART )
0134 B181 IN R24,0x01
0135 7F88 ANDI R24,0xF8
0136 3180 CPI R24,0x10
0137 F011 BEQ 0x013A
(0146) return I2C_ERR;
0138 2700 CLR R16
0139 C001 RJMP 0x013B
(0147) return I2C_CRR;
013A E001 LDI R16,1
013B 9508 RET
(0148) }
(0149) /*--------------------------------------------------------------------
(0150) 函数名称:发送 7位 器件写地址: XXXX XXX0
(0151) 函数功能:
(0152) 注意事项:
(0153) 提示说明:
(0154) 输 入:
(0155) 返 回:
(0156) --------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -