📄 sendrcvself.lst
字号:
__start:
__text_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 36E6 CPI R30,0x66
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 940E014C CALL _main
_exit:
004A CFFF RJMP _exit
_delay50us:
j --> R20
t --> R16
004B 940E021D CALL push_gset1
FILE: E:\ICCAVR_H\CmmICC.H
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
(0004) 目 的: 建立ICCAVR的底层库函数,增加各类补丁,方便系统程序移植
(0005)
(0006) 目标系统: 基于任何兼容C51的微处理器
(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) uint8 dataElem[6];
(0034) ----------------------------------------------------------------------
(0035) 对外函数说明:
(0036) void delay50us(uint16 t); //50us延时
(0037) void delay50ms(uint16 t); //50ms延时
(0038) void speaData(ulong D,uint8 C); //数据拆字
(0039) uint8 changeDToH(uint8 dec); //十进制强制转换为十六进制
(0040) uint8 converseDToH(uint8 dec); //十进制化为十六进制
(0041) uint8 changeHToD(uint8 hex); //十六进制强制转换为十进制
(0042) uint8 converseHToD(uint8 hex); //十六进制化为十进制
(0043) ----------------------------------------------------------------------
(0044) 10101010101010101010101010101010101010101010101010101010101010101010*/
(0045)
(0046) #ifndef CmmICC_H
(0047) #define CmmICC_H
(0048)
(0049) #include <stdio.h>
(0050) #include <math.h>
(0051) #include <string.h>
(0052) #include <macros.h>
(0053) #include <eeprom.h>
(0054)
(0055) /* 兼容一般程序员的常用写法 */
(0056) typedef unsigned char uchar;
(0057) typedef unsigned int uint;
(0058) typedef unsigned long ulong;
(0059) typedef signed char schar;
(0060) typedef signed int sint;
(0061) typedef signed long slong;
(0062)
(0063) /* 为方便移植,建议使用下面写法 */
(0064) typedef unsigned char bool;
(0065) typedef unsigned char uint8;
(0066) typedef unsigned int uint16;
(0067) typedef unsigned long uint32;
(0068) typedef signed char sint8;
(0069) typedef signed int sint16;
(0070) typedef signed long sint32;
(0071) //typedef signed char int8;
(0072) //typedef signed int int16;
(0073) //typedef signed long int32;
(0074)
(0075) /* 下面写法一般不推荐 */
(0076) //typedef unsigned char ubyte;
(0077) //typedef unsigned int uword;
(0078) //typedef unsigned long udword;
(0079) //typedef signed char sbyte;
(0080) //typedef signed int sword;
(0081) //typedef signed long sdword;
(0082)
(0083) /* 各程序员一般定义的默认值 */
(0084) //#define TRUE 1
(0085) //#define FALSE 0
(0086) //#define YES 1
(0087) //#define NO 0
(0088) //#define ON 1
(0089) //#define OFF 0
(0090) //#define ENABLE 1
(0091) //#define DISABLE 0
(0092) //#define CRR 1
(0093) //#define ERR 0
(0094) //#define RIGHT 1
(0095) //#define WRONG 0
(0096) //#define SUCCESS 1
(0097) //#define FAILURE 0
(0098)
(0099) /* 为减少常用操作需要使用的RAM,可考虑使用下面的define */
(0100) //#define _CALLOC(a) ((a *)calloc(n,sizeof(a)))
(0101) //#define _MALLOC(a) ((a *)malloc(sizeof(a)))
(0102) //
(0103) //#define _MIN(a,b) ((a) < (b) ? (a) : (b))
(0104) //#define _MAX(a,b) ((a) > (b) ? (a) : (b))
(0105) //
(0106) //#define _EXCHANGE(a,b) {int t; t=a; a=b; b=t;}
(0107)
(0108) /*--------------------------------------------------------------------
(0109) 函数全称:50us 延时
(0110) 函数功能:
(0111) 注意事项:基于7.3728M晶振,i<70
(0112) 提示说明:调用Delay50us(20),得到1ms延时
(0113) 输 入:
(0114) 返 回:无
(0115) --------------------------------------------------------------------*/
(0116) void delay50us(sint16 t)
(0117) {
(0118) uint8 j;
(0119) for(;t>0;t--)
004D C007 RJMP 0x0055
(0120) for(j=0;j<70;j++)
004E 2744 CLR R20
004F C001 RJMP 0x0051
0050 9543 INC R20
0051 3446 CPI R20,0x46
0052 F3E8 BCS 0x0050
0053 5001 SUBI R16,1
0054 4010 SBCI R17,0
0055 2422 CLR R2
0056 2433 CLR R3
0057 1620 CP R2,R16
0058 0631 CPC R3,R17
0059 F3A4 BLT 0x004E
(0121) ;
(0122) }
005A 940E0220 CALL pop_gset1
005C 9508 RET
_delay50ms:
i --> R20
t --> R16
005D 940E021D CALL push_gset1
(0123) /*--------------------------------------------------------------------
(0124) 函数全称:50ms 延时
(0125) 函数功能:
(0126) 注意事项:基于7.3728M晶振,i<52642
(0127) 提示说明:调用delay50ms(20),得到1s延时
(0128) 输 入:
(0129) 返 回:无
(0130) --------------------------------------------------------------------*/
(0131) void delay50ms(sint16 t)
(0132) {
(0133) uint16 i;
(0134) for(;t>0;t--)
005F C00B RJMP 0x006B
(0135) for(i=0;i<52642;i++)
0060 2744 CLR R20
0061 2755 CLR R21
0062 C002 RJMP 0x0065
0063 5F4F SUBI R20,0xFF
0064 4F5F SBCI R21,0xFF
0065 3A42 CPI R20,0xA2
0066 ECED LDI R30,0xCD
0067 075E CPC R21,R30
0068 F3D0 BCS 0x0063
0069 5001 SUBI R16,1
006A 4010 SBCI R17,0
006B 2422 CLR R2
006C 2433 CLR R3
006D 1620 CP R2,R16
006E 0631 CPC R3,R17
006F F384 BLT 0x0060
(0136) ;
(0137) }
0070 940E0220 CALL pop_gset1
0072 9508 RET
_speaData:
y --> Y+4
j --> Y+0
i --> R10
C --> R12
D --> Y+16
0073 940E015C CALL push_arg4
0075 940E023C CALL push_gset4
0077 9728 SBIW R28,0x8
0078 88CC LDD R12,Y+20
(0138) /*--------------------------------------------------------------------
(0139) 函数全称:拆字
(0140) 函数功能:
(0141) 注意事项:D<=999999,C<=6
(0142) 提示说明:调用speaData(12,2),得到dataElem[0]=2、dataElem[0]=1
(0143) 输 入:
(0144) 返 回:无
(0145) --------------------------------------------------------------------*/
(0146) uint8 dataElem[6];
(0147) void speaData(ulong D,uint8 C)
(0148) {
(0149) uint8 i;
(0150) ulong j,y;
(0151) for(i=0,j=1;i<C;i++)
0079 24AA CLR R10
007A E041 LDI R20,1
007B E050 LDI R21,0
007C E060 LDI R22,0
007D E070 LDI R23,0
007E 01FE MOVW R30,R28
007F 8340 STD Z+0,R20
0080 8351 STD Z+1,R21
0081 8362 STD Z+2,R22
0082 8373 STD Z+3,R23
0083 C046 RJMP 0x00CA
(0152) {
(0153) y=D/j;
0084 01FE MOVW R30,R28
0085 8020 LDD R2,Z+0
0086 8031 LDD R3,Z+1
0087 8042 LDD R4,Z+2
0088 8053 LDD R5,Z+3
0089 01FE MOVW R30,R28
008A 8860 LDD R6,Z+16
008B 8871 LDD R7,Z+17
008C 8882 LDD R8,Z+18
008D 8893 LDD R9,Z+19
008E 925A ST R5,-Y
008F 924A ST R4,-Y
0090 923A ST R3,-Y
0091 922A ST R2,-Y
0092 0183 MOVW R16,R6
0093 0194 MOVW R18,R8
0094 940E0161 CALL div32u
0096 01FE MOVW R30,R28
0097 8304 STD Z+4,R16
0098 8315 STD Z+5,R17
0099 8326 STD Z+6,R18
009A 8337 STD Z+7,R19
(0154) dataElem[i]=y%10;
009B E04A LDI R20,0xA
009C E050 LDI R21,0
009D E060 LDI R22,0
009E E070 LDI R23,0
009F 01FE MOVW R30,R28
00A0 8024 LDD R2,Z+4
00A1 8035 LDD R3,Z+5
00A2 8046 LDD R4,Z+6
00A3 8057 LDD R5,Z+7
00A4 937A ST R23,-Y
00A5 936A ST R22,-Y
00A6 935A ST R21,-Y
00A7 934A ST R20,-Y
00A8 0181 MOVW R16,R2
00A9 0192 MOVW R18,R4
00AA 940E0163 CALL mod32u
00AC E680 LDI R24,0x60
00AD E090 LDI R25,0
00AE 2DEA MOV R30,R10
00AF 27FF CLR R31
00B0 0FE8 ADD R30,R24
00B1 1FF9 ADC R31,R25
00B2 8300 STD Z+0,R16
(0155) j*=10;
00B3 01FE MOVW R30,R28
00B4 8020 LDD R2,Z+0
00B5 8031 LDD R3,Z+1
00B6 8042 LDD R4,Z+2
00B7 8053 LDD R5,Z+3
00B8 E04A LDI R20,0xA
00B9 E050 LDI R21,0
00BA E060 LDI R22,0
00BB E070 LDI R23,0
00BC 925A ST R5,-Y
00BD 924A ST R4,-Y
00BE 923A ST R3,-Y
00BF 922A ST R2,-Y
00C0 018A MOVW R16,R20
00C1 019B MOVW R18,R22
00C2 940E01EA CALL empy32u
00C4 01FE MOVW R30,R28
00C5 8300 STD Z+0,R16
00C6 8311 STD Z+1,R17
00C7 8322 STD Z+2,R18
00C8 8333 STD Z+3,R19
00C9 94A3 INC R10
00CA 14AC CP R10,R12
00CB F408 BCC 0x00CD
00CC CFB7 RJMP 0x0084
(0156) }
(0157) }
00CD 9628 ADIW R28,0x8
00CE 940E021A CALL pop_gset4
00D0 9624 ADIW R28,4
00D1 9508 RET
_changeDToH:
hex --> R20
t --> Y+0
dec --> R20
00D2 940E021D CALL push_gset1
00D4 2F40 MOV R20,R16
00D5 9722 SBIW R28,2
(0158) /*--------------------------------------------------------------------
(0159) 函数全称:十进制强制转换为十六进制
(0160) 函数功能:
(0161) 注意事项:无
(0162) 提示说明:调用changeDToH(33),return 0x33
(0163) 输 入:
(0164) 返 回:uint8 hex
(0165) --------------------------------------------------------------------*/
(0166) uint8 changeDToH(uint8 dec)
(0167) {
(0168) uint8 hex;
(0169) uint8 t[2];
(0170) t[1]=dec/10;
00D6 E01A LDI R17,0xA
00D7 2F04 MOV R16,R20
00D8 940E01D4 CALL div8u
00DA 8309 STD Y+1,R16
(0171) t[0]=dec%10;
00DB E01A LDI R17,0xA
00DC 2F04 MOV R16,R20
00DD 940E01D2 CALL mod8u
00DF 8308 STD Y+0,R16
(0172) hex=t[1]*16+t[0];
00E0 8029 LDD R2,Y+1
00E1 E180 LDI R24,0x10
00E2 9D82 MUL R24,R2
00E3 2D40 MOV R20,R0
00E4 0F40 ADD R20,R16
(0173) return hex;
00E5 2F04 MOV R16,R20
00E6 9622 ADIW R28,2
00E7 940E0220 CALL pop_gset1
00E9 9508 RET
_converseDToH:
hex --> R20
t --> Y+0
dec --> R20
00EA 940E021D CALL push_gset1
00EC 2F40 MOV R20,R16
00ED 9722 SBIW R28,2
(0174) }
(0175) /*--------------------------------------------------------------------
(0176) 函数全称:十进制化为十六进制
(0177) 函数功能:
(0178) 注意事项:无
(0179) 提示说明:调用converseDToH(33),return 21
(0180) 输 入:
(0181) 返 回:uint8 hex
(0182) --------------------------------------------------------------------*/
(0183) uint8 converseDToH(uint8 dec)
(0184) {
(0185) uint8 hex;
(0186) uint8 t[2];
(0187) t[1]=dec/16;
00EE 2F84 MOV R24,R20
00EF 9582 SWAP R24
00F0 708F ANDI R24,0xF
00F1 8389 STD Y+1,R24
(0188) t[0]=dec%16;
00F2 E110 LDI R17,0x10
00F3 2F04 MOV R16,R20
00F4 940E01D2 CALL mod8u
00F6 8308 STD Y+0,R16
(0189) hex=t[1]*16+t[0];
00F7 8029 LDD R2,Y+1
00F8 E180 LDI R24,0x10
00F9 9D82 MUL R24,R2
00FA 2D40 MOV R20,R0
00FB 0F40 ADD R20,R16
(0190) return hex;
00FC 2F04 MOV R16,R20
00FD 9622 ADIW R28,2
00FE 940E0220 CALL pop_gset1
0100 9508 RET
_changeHToD:
dec --> R20
t --> Y+0
hex --> R20
0101 940E021D CALL push_gset1
0103 2F40 MOV R20,R16
0104 9722 SBIW R28,2
(0191) }
(0192) /*--------------------------------------------------------------------
(0193) 函数全称:十六进制强制转换为十进制
(0194) 函数功能:
(0195) 注意事项:无
(0196) 提示说明:调用changeHToD(0x33),return 33
(0197) 输 入:
(0198) 返 回:uint8 dec
(0199) --------------------------------------------------------------------*/
(0200) uint8 changeHToD(uint8 hex)
(0201) {
(0202) uint8 dec;
(0203) uint8 t[2];
(0204) t[1]=hex/16;
0105 2F84 MOV R24,R20
0106 9582 SWAP R24
0107 708F ANDI R24,0xF
0108 8389 STD Y+1,R24
(0205) t[0]=hex%16;
0109 E110 LDI R17,0x10
010A 2F04 MOV R16,R20
010B 940E01D2 CALL mod8u
010D 8308 STD Y+0,R16
(0206) dec=t[1]*10+t[0];
010E 8029 LDD R2,Y+1
010F E08A LDI R24,0xA
0110 9D82 MUL R24,R2
0111 2D40 MOV R20,R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -