⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lss

📁 CH375官方有了51单片机控制打印机的代码
💻 LSS
📖 第 1 页 / 共 5 页
字号:

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         00000076  00800100  00000e42  00000ed6  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  1 .text         00000e42  00000000  00000000  00000094  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .bss          0000004b  00800176  00800176  00000f4c  2**0
                  ALLOC
  3 .stab         00000408  00000000  00000000  00000f4c  2**2
                  CONTENTS, READONLY, DEBUGGING
  4 .stabstr      00000084  00000000  00000000  00001354  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_aranges 00000020  00000000  00000000  000013d8  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_pubnames 000001f6  00000000  00000000  000013f8  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_info   00000c75  00000000  00000000  000015ee  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_abbrev 000002c5  00000000  00000000  00002263  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_line   000007d7  00000000  00000000  00002528  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_frame  00000180  00000000  00000000  00002cff  2**0
                  CONTENTS, READONLY, DEBUGGING
 11 .debug_str    000002cc  00000000  00000000  00002e7f  2**0
                  CONTENTS, READONLY, DEBUGGING
 12 .debug_loc    000004d0  00000000  00000000  0000314b  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 46 00 	jmp	0x8c	; 0x8c <__ctors_end>
   4:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
   8:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
   c:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  10:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  14:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  18:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  1c:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  20:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  24:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  28:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  2c:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  30:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  34:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  38:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  3c:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  40:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  44:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  48:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  4c:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  50:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  54:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  58:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  5c:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  60:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  64:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  68:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  6c:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  70:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  74:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  78:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  7c:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  80:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  84:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>
  88:	0c 94 63 00 	jmp	0xc6	; 0xc6 <__bad_interrupt>

0000008c <__ctors_end>:
  8c:	11 24       	eor	r1, r1
  8e:	1f be       	out	0x3f, r1	; 63
  90:	cf ef       	ldi	r28, 0xFF	; 255
  92:	d0 e1       	ldi	r29, 0x10	; 16
  94:	de bf       	out	0x3e, r29	; 62
  96:	cd bf       	out	0x3d, r28	; 61

00000098 <__do_copy_data>:
  98:	11 e0       	ldi	r17, 0x01	; 1
  9a:	a0 e0       	ldi	r26, 0x00	; 0
  9c:	b1 e0       	ldi	r27, 0x01	; 1
  9e:	e2 e4       	ldi	r30, 0x42	; 66
  a0:	fe e0       	ldi	r31, 0x0E	; 14
  a2:	00 e0       	ldi	r16, 0x00	; 0
  a4:	0b bf       	out	0x3b, r16	; 59
  a6:	02 c0       	rjmp	.+4      	; 0xac <__do_copy_data+0x14>
  a8:	07 90       	elpm	r0, Z+
  aa:	0d 92       	st	X+, r0
  ac:	a6 37       	cpi	r26, 0x76	; 118
  ae:	b1 07       	cpc	r27, r17
  b0:	d9 f7       	brne	.-10     	; 0xa8 <__do_copy_data+0x10>

000000b2 <__do_clear_bss>:
  b2:	11 e0       	ldi	r17, 0x01	; 1
  b4:	a6 e7       	ldi	r26, 0x76	; 118
  b6:	b1 e0       	ldi	r27, 0x01	; 1
  b8:	01 c0       	rjmp	.+2      	; 0xbc <.do_clear_bss_start>

000000ba <.do_clear_bss_loop>:
  ba:	1d 92       	st	X+, r1

000000bc <.do_clear_bss_start>:
  bc:	a1 3c       	cpi	r26, 0xC1	; 193
  be:	b1 07       	cpc	r27, r17
  c0:	e1 f7       	brne	.-8      	; 0xba <.do_clear_bss_loop>
  c2:	0c 94 27 03 	jmp	0x64e	; 0x64e <main>

000000c6 <__bad_interrupt>:
  c6:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

000000ca <xWriteCH375Cmd>:
}
*/

// 基本操作 
void xWriteCH375Cmd( unsigned char cmd ) {  // 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 
  ca:	93 e0       	ldi	r25, 0x03	; 3
  cc:	29 2f       	mov	r18, r25
  ce:	2a 95       	dec	r18
  d0:	f1 f7       	brne	.-4      	; 0xce <xWriteCH375Cmd+0x4>
	delay1us( );
	delay1us( );  // 至少延时1uS 
	*(volatile unsigned char *)CH375_CMD_PORT_ADDR = cmd;  //通过并口直接读写CH375而非普通I/O模拟 
  d2:	29 2f       	mov	r18, r25
  d4:	2a 95       	dec	r18
  d6:	f1 f7       	brne	.-4      	; 0xd4 <xWriteCH375Cmd+0xa>
  d8:	80 93 21 80 	sts	0x8021, r24
*/
void
_delay_loop_1(uint8_t __count)
{
	__asm__ volatile (
  dc:	89 2f       	mov	r24, r25
  de:	8a 95       	dec	r24
  e0:	f1 f7       	brne	.-4      	; 0xde <xWriteCH375Cmd+0x14>
  e2:	9a 95       	dec	r25
  e4:	f1 f7       	brne	.-4      	; 0xe2 <xWriteCH375Cmd+0x18>
  e6:	08 95       	ret

000000e8 <xWriteCH375Data>:
/*	PORTB |= 0x08;  // 输出A0=1 
	PORTA = mCmd;  // 向CH375的并口输出数据 
	DDRA = 0xFF;  // 并口D0-D7输出 
	PORTB &= 0xF9;  // 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1;
	DDRA = 0xFF;  // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS 
	PORTB |= 0x07;  // 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; 
	DDRA = 0x00;  // 禁止数据输出 
	PORTB &= 0xF7;  // 输出A0=0; 可选操作 
*/
	delay1us( ); 
	delay1us( );  // 至少延时2uS 
}

void xWriteCH375Data( unsigned char dat ) {  // 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 
  e8:	93 e0       	ldi	r25, 0x03	; 3
  ea:	29 2f       	mov	r18, r25
  ec:	2a 95       	dec	r18
  ee:	f1 f7       	brne	.-4      	; 0xec <xWriteCH375Data+0x4>
	delay1us( );
	delay1us( );  // 至少延时1uS 
	*(volatile unsigned char *)CH375_DAT_PORT_ADDR = dat;  //通过并口直接读写CH375而非普通I/O模拟 
  f0:	29 2f       	mov	r18, r25
  f2:	2a 95       	dec	r18
  f4:	f1 f7       	brne	.-4      	; 0xf2 <xWriteCH375Data+0xa>
  f6:	80 93 20 80 	sts	0x8020, r24
*/
void
_delay_loop_1(uint8_t __count)
{
	__asm__ volatile (
  fa:	89 2f       	mov	r24, r25
  fc:	8a 95       	dec	r24
  fe:	f1 f7       	brne	.-4      	; 0xfc <xWriteCH375Data+0x14>
/*
	PORTA = mData;  // 向CH375的并口输出数据 
	DDRA = 0xFF;  // 并口D0-D7输出 
	PORTB &= 0xF1;  // 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; 
	DDRA = 0xFF;  // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS 
	PORTB |= 0x07;  // 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; 
	DDRA = 0x00;  // 禁止数据输出
*/
	delay1us( );
	delay1us( );  // 至少延时1.2uS 
}

unsigned char xReadCH375Data(void) {  // 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 
	unsigned char	mData;
	mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR;  //通过并口直接读写CH375而非普通I/O模拟 
 100:	9a 95       	dec	r25
 102:	f1 f7       	brne	.-4      	; 0x100 <xWriteCH375Data+0x18>
*/
void
_delay_loop_1(uint8_t __count)
{
	__asm__ volatile (
 104:	08 95       	ret

00000106 <xReadCH375Data>:
 106:	80 91 20 80 	lds	r24, 0x8020
*/
void
_delay_loop_1(uint8_t __count)
{
	__asm__ volatile (
 10a:	93 e0       	ldi	r25, 0x03	; 3
 10c:	29 2f       	mov	r18, r25
 10e:	2a 95       	dec	r18
 110:	f1 f7       	brne	.-4      	; 0x10e <xReadCH375Data+0x8>
	delay1us( );
	delay1us( );  // 至少延时1.2uS 
	delay1us( );
/*
	DDRA = 0x00;  // 数据输入 
	PORTB &= 0xF2;  // 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; 
	DDRA = 0x00;  // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS 
	mData = PINA;  // 从CH375的并口PA输入数据 
	PORTB |= 0x07;  // 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; 
*/
	return( mData );
}
 112:	29 2f       	mov	r18, r25
 114:	2a 95       	dec	r18
 116:	f1 f7       	brne	.-4      	; 0x114 <xReadCH375Data+0xe>
 118:	9a 95       	dec	r25
 11a:	f1 f7       	brne	.-4      	; 0x118 <xReadCH375Data+0x12>
 11c:	99 27       	eor	r25, r25
 11e:	08 95       	ret

00000120 <wait_interrupt>:

unsigned char wait_interrupt(void) {  // 主机端等待操作完成, 返回操作状态 
 120:	0f 93       	push	r16
 122:	1f 93       	push	r17
 124:	cf 93       	push	r28
 126:	df 93       	push	r29
	unsigned short i;
//	while( CH375_INT_WIRE );  // 查询等待CH375操作完成中断(INT#低电平) 
	for ( i = 0; CH375_INT_WIRE != 0; i ++ ) {  // 如果CH375的中断引脚输出高电平则等待,通过计数防止超时 
 128:	80 9b       	sbis	0x10, 0	; 16
 12a:	13 c0       	rjmp	.+38     	; 0x152 <wait_interrupt+0x32>
 12c:	c0 e0       	ldi	r28, 0x00	; 0
 12e:	d0 e0       	ldi	r29, 0x00	; 0
 130:	0c ec       	ldi	r16, 0xCC	; 204
 132:	1a e0       	ldi	r17, 0x0A	; 10
 134:	03 c0       	rjmp	.+6      	; 0x13c <wait_interrupt+0x1c>
 136:	80 9b       	sbis	0x10, 0	; 16
 138:	0c c0       	rjmp	.+24     	; 0x152 <wait_interrupt+0x32>
 13a:	21 96       	adiw	r28, 0x01	; 1
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 13c:	c8 01       	movw	r24, r16
 13e:	01 97       	sbiw	r24, 0x01	; 1
 140:	f1 f7       	brne	.-4      	; 0x13e <wait_interrupt+0x1e>
		mDelaymS( 1 );
		//if ( i == 0xF000 ) xWriteCH375Cmd( CMD_ABORT_NAK );  // 如果超时达61mS以上则强行终止NAK重试,中断返回USB_INT_RET_NAK
		if ( i == 0x40 ) xWriteCH375Cmd( CMD_ABORT_NAK );  // 如果超时达64mS以上则强行终止NAK重试,中断返回USB_INT_RET_NAK
 142:	c0 34       	cpi	r28, 0x40	; 64
 144:	d1 05       	cpc	r29, r1
 146:	b9 f7       	brne	.-18     	; 0x136 <wait_interrupt+0x16>
 148:	87 e1       	ldi	r24, 0x17	; 23
 14a:	0e 94 65 00 	call	0xca	; 0xca <xWriteCH375Cmd>
 14e:	80 99       	sbic	0x10, 0	; 16
 150:	f4 cf       	rjmp	.-24     	; 0x13a <wait_interrupt+0x1a>
	}
	xWriteCH375Cmd( CMD_GET_STATUS );  // 产生操作完成中断, 获取中断状态 
 152:	82 e2       	ldi	r24, 0x22	; 34
 154:	0e 94 65 00 	call	0xca	; 0xca <xWriteCH375Cmd>
	return( xReadCH375Data() );
 158:	0e 94 83 00 	call	0x106	; 0x106 <xReadCH375Data>
}
 15c:	99 27       	eor	r25, r25
 15e:	df 91       	pop	r29
 160:	cf 91       	pop	r28
 162:	1f 91       	pop	r17
 164:	0f 91       	pop	r16
 166:	08 95       	ret

00000168 <toggle_recv>:

#define	TRUE	1
#define	FALSE	0
unsigned char set_usb_mode( unsigned char mode ) {  // 设置CH375的工作模式 
	xWriteCH375Cmd( CMD_SET_USB_MODE );
	xWriteCH375Data( mode );
	mDelaymS(2);
		while ( xReadCH375Data()!=CMD_RET_SUCCESS ) 
		{
		printf("set usb mode error!\n\r");
		mDelaymS(200);
		}
		printf("set usb mode %d ok\n\r",mode);
		return( TRUE );  // 成功 
	//return( FALSE );  // CH375出错,例如芯片型号错或者处于串口方式或者不支持 
}

// 数据同步
/* USB的数据同步通过切换DATA0和DATA1实现: 在设备端, USB打印机可以自动切换;
   在主机端, 必须由SET_ENDP6和SET_ENDP7命令控制CH375切换DATA0与DATA1.
   主机端的程序处理方法是为设备端的各个端点分别提供一个全局变量,
   初始值均为DATA0, 每执行一次成功事务后取反, 每执行一次失败事务后将其复位为DATA1 */

void toggle_recv( BOOL1 tog ) {  // 主机接收同步控制:0=DATA0,1=DATA1 
 168:	1f 93       	push	r17
 16a:	18 2f       	mov	r17, r24
	xWriteCH375Cmd( CMD_SET_ENDP6 );
 16c:	8c e1       	ldi	r24, 0x1C	; 28
 16e:	0e 94 65 00 	call	0xca	; 0xca <xWriteCH375Cmd>
	xWriteCH375Data( tog ? 0xC0 : 0x80 );
 172:	11 23       	and	r17, r17
 174:	11 f0       	breq	.+4      	; 0x17a <toggle_recv+0x12>
 176:	80 ec       	ldi	r24, 0xC0	; 192
 178:	01 c0       	rjmp	.+2      	; 0x17c <toggle_recv+0x14>
 17a:	80 e8       	ldi	r24, 0x80	; 128
 17c:	0e 94 74 00 	call	0xe8	; 0xe8 <xWriteCH375Data>
*/
void
_delay_loop_1(uint8_t __count)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -