📄 canmonitor.lst
字号:
__start:
__text_start:
56 E5CF LDI R28,0x5F
57 E0D4 LDI R29,4
58 BFCD OUT 0x3D,R28
59 BFDE OUT 0x3E,R29
5A 51C0 SUBI R28,0x10
5B 40D0 SBCI R29,0
5C EA0A LDI R16,0xAA
5D 8308 STD Y+0,R16
5E 2400 CLR R0
5F EAEA LDI R30,0xAA
60 E0F0 LDI R31,0
61 E010 LDI R17,0
62 3CE8 CPI R30,0xC8
63 07F1 CPC R31,R17
64 F011 BEQ 0x0067
65 9201 ST R0,Z+
66 CFFB RJMP 0x0062
67 8300 STD Z+0,R16
68 E6E2 LDI R30,0x62
69 E0F0 LDI R31,0
6A E6A0 LDI R26,0x60
6B E0B0 LDI R27,0
6C E010 LDI R17,0
6D E000 LDI R16,0
6E BF0B OUT 0x3B,R16
6F 3AEC CPI R30,0xAC
70 07F1 CPC R31,R17
71 F021 BEQ 0x0076
72 95C8 LPM
73 9631 ADIW R30,1
74 920D ST R0,X+
75 CFF9 RJMP 0x006F
76 940E 053F CALL _main
_exit:
78 CFFF RJMP _exit
_shortdelay:
tt --> Y,+0
79 931A ST R17,-Y
7A 930A ST R16,-Y
FILE: E:\li\liliang\can-232\CAN-232\delay.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 系统时钟:16M
(0004) -----------------------------------------------------------------------*/
(0005) /*======================================
(0006) 微秒级精确延时函数,晶振16M:
(0007) Delay = 0.0625 *((tt*4-1)+9)微秒
(0008) 其中9包括了调用方的 r16 赋值 1t
(0009) rcall 3t nop 1t ret 4t
(0010) brne指令在当判断条件不成立时是单周期
(0011) 最后一次判断只有1个周期,补一个nop
(0012) 简化计算 = 0.5tt + 1 (us)
(0013) ======================================*/
(0014) void shortdelay(unsigned char tt)
(0015) {
(0016) asm("_L2: subi R16,1"); // 1t
7B 5001 SUBI R16,1
(0017) asm(" nop") ; // 1t
7C 0000 NOP
(0018) asm(" brne _L2"); // 2t/1t
7D F7E9 BNE 0x007B
(0019) asm(" nop"); // 1t
7E 0000 NOP
(0020) asm(" ret"); // 4t
7F 9508 RET
80 9622 ADIW R28,2
81 9508 RET
(0021) }
(0022)
(0023) //#define delay_us() shortdelay(2)
(0024) void delay_us(void) //1us延时函数
(0025) {
(0026) shortdelay(2);
_delay_us:
82 E002 LDI R16,2
83 DFF5 RCALL _shortdelay
84 9508 RET
_delay_nus:
i --> R10
n --> R12
85 940E 0671 CALL push_xgset003C
87 0168 MOVW R12,R16
(0027) }
(0028)
(0029) void delay_nus(unsigned int n) //N us延时函数
(0030) {
(0031) unsigned int i=0;
88 24AA CLR R10
89 24BB CLR R11
(0032) for (i=0;i<n;i++)
8A C004 RJMP 0x008F
(0033) delay_us();
8B DFF6 RCALL _delay_us
8C 01C5 MOVW R24,R10
8D 9601 ADIW R24,1
8E 015C MOVW R10,R24
8F 14AC CP R10,R12
90 04BD CPC R11,R13
91 F3C8 BCS 0x008B
92 940C 065F JMP pop_xgset003C
(0034) }
(0035)
(0036) void delay_ms(void) //1ms延时函数
(0037) {
(0038) unsigned int i;
(0039) for (i=0;i<1140;i++);
_delay_ms:
i --> R16
94 2700 CLR R16
95 2711 CLR R17
96 C002 RJMP 0x0099
97 5F0F SUBI R16,0xFF
98 4F1F SBCI R17,0xFF
99 3704 CPI R16,0x74
9A E0E4 LDI R30,4
9B 071E CPC R17,R30
9C F3D0 BCS 0x0097
9D 9508 RET
_delay_nms:
i --> R10
n --> R12
9E 940E 0671 CALL push_xgset003C
A0 0168 MOVW R12,R16
(0040) }
(0041)
(0042) void delay_nms(unsigned int n) //N ms延时函数
(0043) {
(0044) unsigned int i=0;
A1 24AA CLR R10
A2 24BB CLR R11
(0045) for (i=0;i<n;i++)
A3 C004 RJMP 0x00A8
(0046) delay_ms();
A4 DFEF RCALL _delay_ms
A5 01C5 MOVW R24,R10
A6 9601 ADIW R24,1
A7 015C MOVW R10,R24
A8 14AC CP R10,R12
A9 04BD CPC R11,R13
AA F3C8 BCS 0x00A4
AB 940C 065F JMP pop_xgset003C
FILE: E:\li\liliang\can-232\CAN-232\rprint.c
(0001) /********************************************************************
(0002) * 版本说明:1.0 *
(0003) * 作者: andylee *
(0004) * 日期: 2006年10月 *
(0005) * 平台: mega16 16M *
(0006) * 说明: 通用的显示驱动功能函数库 *
(0007) ********************************************************************/
(0008) #include "rprint.h"
(0009) #define RPRINTF_FLOAT
(0010) //-----------------------------------------------------------------------------
(0011) #ifdef RPRINTF_COMPLEX
(0012) static unsigned char buf[128];
(0013) #endif
(0014) //-----------------------------------------------------------------------------
(0015) #define pgm_read_byte(char_ptr) *(const char *) char_ptr
(0016) #define READMEMBYTE(a,char_ptr) ((a)?(pgm_read_byte(char_ptr)):(*char_ptr))
(0017) //-----------------------------------------------------------------------------
(0018) static char HexChars[] = "0123456789ABCDEF";
(0019) //const static char HexChars[]="123456789ABCDEF";
(0020)
(0021) // function pointer to single character output routine
(0022) static void (*rputchar)(unsigned char c);
(0023) //-----------------------------------------------------------------------------
(0024)
(0025) //******************************************************************************
(0026) // *** rprintf initialization ***
(0027) //*****************************************************************************
(0028) //=============================================================================
(0029) void rprintfInit(void (*putchar_func)(unsigned char c))
(0030) //=============================================================================
(0031) {
(0032) rputchar = putchar_func;
_rprintfInit:
putchar_func --> R16
AD 9310 00C7 STS rprint.c:rputchar+1,R17
AF 9300 00C6 STS rprint.c:rputchar,R16
B1 9508 RET
_rprintfChar:
c --> R10
B2 92AA ST R10,-Y
B3 2EA0 MOV R10,R16
(0033) }
(0034)
(0035) //==============================================================================
(0036) void rprintfChar(unsigned char c)
(0037) //==============================================================================
(0038) {
(0039) // send character
(0040) rputchar(c);
B4 2D0A MOV R16,R10
B5 91E0 00C6 LDS R30,rprint.c:rputchar
B7 91F0 00C7 LDS R31,rprint.c:rputchar+1
B9 940E 0676 CALL xicall
BB 90A9 LD R10,Y+
BC 9508 RET
_rprintfStr:
str --> R10
BD 92AA ST R10,-Y
BE 92BA ST R11,-Y
BF 0158 MOVW R10,R16
(0041) }
(0042)
(0043) //=============================================================================
(0044) void rprintfStr(char str[])
(0045) //=============================================================================
(0046) {
(0047) // send a string stored in RAM
(0048) // check to make sure we have a good pointer
(0049) if (!str) return;
C0 20AA TST R10
C1 F439 BNE 0x00C9
C2 20BB TST R11
C3 F429 BNE 0x00C9
C4 C008 RJMP 0x00CD
(0050)
(0051) // print the string until a null-terminator
(0052) while (*str)
(0053) rprintfChar(*str++);
C5 01F5 MOVW R30,R10
C6 9101 LD R16,Z+
C7 015F MOVW R10,R30
C8 DFE9 RCALL _rprintfChar
C9 01F5 MOVW R30,R10
CA 8020 LDD R2,Z+0
CB 2022 TST R2
CC F7C1 BNE 0x00C5
CD 90B9 LD R11,Y+
CE 90A9 LD R10,Y+
CF 9508 RET
_rprintfStrLen:
i --> R10
len --> Y,+6
start --> R14
str --> R12
D0 940E 066F CALL push_xgset00FC
D2 0179 MOVW R14,R18
D3 0168 MOVW R12,R16
(0054) }
(0055)
(0056) //=============================================================================
(0057) void rprintfStrLen(char str[], unsigned int start, unsigned int len)
(0058) //=============================================================================
(0059) {
(0060) register int i=0;
D4 24AA CLR R10
D5 24BB CLR R11
(0061)
(0062) // check to make sure we have a good pointer
(0063) if (!str) return;
D6 20CC TST R12
D7 F419 BNE 0x00DB
D8 20DD TST R13
D9 F409 BNE 0x00DB
DA C021 RJMP 0x00FC
(0064) // spin through characters up to requested start
(0065) // keep going as long as there's no null
(0066) while((i++<start) && (*str++));
DB 0115 MOVW R2,R10
DC 01C1 MOVW R24,R2
DD 9601 ADIW R24,1
DE 015C MOVW R10,R24
DF 142E CP R2,R14
E0 043F CPC R3,R15
E1 F428 BCC 0x00E7
E2 01F6 MOVW R30,R12
E3 9021 LD R2,Z+
E4 016F MOVW R12,R30
E5 2022 TST R2
E6 F7A1 BNE 0x00DB
(0067)
(0068) // then print exactly len characters
(0069) for(i=0; i<len; i++)
E7 24AA CLR R10
E8 24BB CLR R11
E9 C00D RJMP 0x00F7
(0070) {
(0071) // print data out of the string as long as we haven't reached a null yet
(0072) // at the null, start printing spaces
(0073) if(*str)
EA 01F6 MOVW R30,R12
EB 8020 LDD R2,Z+0
EC 2022 TST R2
ED F021 BEQ 0x00F2
(0074) rprintfChar(*str++);
EE 9101 LD R16,Z+
EF 016F MOVW R12,R30
F0 DFC1 RCALL _rprintfChar
F1 C002 RJMP 0x00F4
(0075) else
(0076) rprintfChar(' ');
F2 E200 LDI R16,0x20
F3 DFBE RCALL _rprintfChar
F4 01C5 MOVW R24,R10
F5 9601 ADIW R24,1
F6 015C MOVW R10,R24
F7 800E LDD R0,Y+6
F8 801F LDD R1,Y+7
F9 14A0 CP R10,R0
FA 04B1 CPC R11,R1
FB F370 BCS 0x00EA
FC 940C 0664 JMP pop_xgset00FC
_rprintfProgStr:
c --> R12
str --> R10
FE 940E 0671 CALL push_xgset003C
100 0158 MOVW R10,R16
(0077) }
(0078)
(0079) }
(0080)
(0081) //*****************************************************************************
(0082) // *** rprintfProgStr ***
(0083) // prints a null-terminated string stored in program ROM
(0084) //*****************************************************************************
(0085) //=============================================================================
(0086) void rprintfProgStr(const char *str)
(0087) //=============================================================================
(0088) {
(0089) // print a string stored in program memory
(0090) register char c;
(0091)
(0092) // check to make sure we have a good pointer
(0093) if (!str) return;
101 20AA TST R10
102 F429 BNE 0x0108
103 20BB TST R11
104 F419 BNE 0x0108
105 C00B RJMP 0x0111
(0094)
(0095) // print the string until the null-terminator
(0096) while((c =*str++))
(0097) rprintfChar(c);
106 2D0C MOV R16,R12
107 DFAA RCALL _rprintfChar
108 0115 MOVW R2,R10
109 01C1 MOVW R24,R2
10A 9601 ADIW R24,1
10B 015C MOVW R10,R24
10C 01F1 MOVW R30,R2
10D 9024 LPM R2,1(Z)
10E 2CC2 MOV R12,R2
10F 20CC TST R12
110 F7A9 BNE 0x0106
111 940C 065F JMP pop_xgset003C
(0098) }
(0099)
(0100) //******************************************************************************
(0101) // *** rprintfCRLF ***
(0102) // prints carriage return and line feed
(0103) //******************************************************************************
(0104) //==============================================================================
(0105) void rprintfCRLF(void)
(0106) //==============================================================================
(0107) {
(0108) // print CR/LF
(0109) rprintfChar('\r');
_rprintfCRLF:
113 E00D LDI R16,0xD
114 DF9D RCALL _rprintfChar
(0110) rprintfChar('\n');
115 E00A LDI R16,0xA
116 DF9B RCALL _rprintfChar
117 9508 RET
_rprintfu04:
data --> R10
118 92AA ST R10,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -