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

📄 main.lss

📁 ATMEGA16与串行DA-TLC5615的通讯程序
💻 LSS
字号:

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000001c8  00000000  00000000  00000074  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss          00000003  00800060  000001c8  0000023c  2**0
                  ALLOC
  2 .debug_aranges 00000020  00000000  00000000  0000023c  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_pubnames 000000c2  00000000  00000000  0000025c  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_info   000003be  00000000  00000000  0000031e  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_abbrev 00000161  00000000  00000000  000006dc  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_line   000003b0  00000000  00000000  0000083d  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_frame  000000c0  00000000  00000000  00000bf0  2**2
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_str    0000017f  00000000  00000000  00000cb0  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_loc    000000e5  00000000  00000000  00000e2f  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 2a 00 	jmp	0x54	; 0x54 <__ctors_end>
   4:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
   8:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
   c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  10:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  14:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  18:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  1c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  20:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  24:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  28:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  2c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  30:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  34:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  38:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  3c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  40:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  44:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  48:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  4c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  50:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>

00000054 <__ctors_end>:
  54:	11 24       	eor	r1, r1
  56:	1f be       	out	0x3f, r1	; 63
  58:	cf e5       	ldi	r28, 0x5F	; 95
  5a:	d4 e0       	ldi	r29, 0x04	; 4
  5c:	de bf       	out	0x3e, r29	; 62
  5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_copy_data>:
  60:	10 e0       	ldi	r17, 0x00	; 0
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	e8 ec       	ldi	r30, 0xC8	; 200
  68:	f1 e0       	ldi	r31, 0x01	; 1
  6a:	02 c0       	rjmp	.+4      	; 0x70 <.do_copy_data_start>

0000006c <.do_copy_data_loop>:
  6c:	05 90       	lpm	r0, Z+
  6e:	0d 92       	st	X+, r0

00000070 <.do_copy_data_start>:
  70:	a0 36       	cpi	r26, 0x60	; 96
  72:	b1 07       	cpc	r27, r17
  74:	d9 f7       	brne	.-10     	; 0x6c <.do_copy_data_loop>

00000076 <__do_clear_bss>:
  76:	10 e0       	ldi	r17, 0x00	; 0
  78:	a0 e6       	ldi	r26, 0x60	; 96
  7a:	b0 e0       	ldi	r27, 0x00	; 0
  7c:	01 c0       	rjmp	.+2      	; 0x80 <.do_clear_bss_start>

0000007e <.do_clear_bss_loop>:
  7e:	1d 92       	st	X+, r1

00000080 <.do_clear_bss_start>:
  80:	a3 36       	cpi	r26, 0x63	; 99
  82:	b1 07       	cpc	r27, r17
  84:	e1 f7       	brne	.-8      	; 0x7e <.do_clear_bss_loop>
  86:	0e 94 c5 00 	call	0x18a	; 0x18a <main>
  8a:	0c 94 e2 00 	jmp	0x1c4	; 0x1c4 <_exit>

0000008e <__bad_interrupt>:
  8e:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

00000092 <spi_init>:

void spi_init(void);
void spi_send(uint8_t cdata);

void spi_init(void)
    {
  92:	8f eb       	ldi	r24, 0xBF	; 191
  94:	87 bb       	out	0x17, r24	; 23
     /* 设置MOSI 和SCK 为输出,其他为输入 */
     DDRB = 0xbf;
     /* 使能SPI 主机模式,设置时钟速率为fck/16 */
     SPCR = 0x11;
  96:	81 e1       	ldi	r24, 0x11	; 17
  98:	8d b9       	out	0x0d, r24	; 13
	 
    }
  9a:	08 95       	ret

0000009c <spi_send>:
void spi_send(uint8_t cdata)
     {
  9c:	8f b9       	out	0x0f, r24	; 15
      /* 启动数据传输 */
      SPDR = cdata;
      /* 等待传输结束 */
      while(!(SPSR & (1<<SPIF)));
  9e:	77 9b       	sbis	0x0e, 7	; 14
  a0:	fe cf       	rjmp	.-4      	; 0x9e <spi_send+0x2>
     }
  a2:	08 95       	ret

000000a4 <lcd_write>:
     	if((lcd_addr>=0x80)&&(lcd_addr<=0x9f)) lcd_wri(lcd_addr);
     	lcd_wrd(dis_data);
}
     
void lcd_write(uint8_t lcd_data1,uint8_t lcd_data2,uint8_t lcd_data3)
{
  a4:	c0 9a       	sbi	0x18, 0	; 24
      PORTB|=(1<<lcd_cs);      //LCD选通
      SPCR|=(1<<SPE);          //SPI使能
  a6:	6e 9a       	sbi	0x0d, 6	; 13
      SPDR=lcd_data1;          //SPI传送第一字节
  a8:	8f b9       	out	0x0f, r24	; 15
      while(!(SPSR&(1<<SPIF)));//等待传送完成
  aa:	77 9b       	sbis	0x0e, 7	; 14
  ac:	fe cf       	rjmp	.-4      	; 0xaa <lcd_write+0x6>
      SPDR=lcd_data2;          //SPI传送第一字节
  ae:	6f b9       	out	0x0f, r22	; 15
      while(!(SPSR&(1<<SPIF)));
  b0:	77 9b       	sbis	0x0e, 7	; 14
  b2:	fe cf       	rjmp	.-4      	; 0xb0 <lcd_write+0xc>
      SPDR=lcd_data3;          //SPI传送第一字节
  b4:	4f b9       	out	0x0f, r20	; 15
      while(!(SPSR&(1<<SPIF)));
  b6:	77 9b       	sbis	0x0e, 7	; 14
  b8:	fe cf       	rjmp	.-4      	; 0xb6 <lcd_write+0x12>
	    SPCR&=(~(1<<SPE));       //SPI关闭
  ba:	6e 98       	cbi	0x0d, 6	; 13
	    PORTB&=(~(1<<lcd_cs));   //LCD关闭
  bc:	c0 98       	cbi	0x18, 0	; 24
}
  be:	08 95       	ret

000000c0 <lcd_wrd>:
     lcd_tmp3=data_i<<4;  //第三字节为D3 D2 D1 D0 0 0 0 0
     lcd_write(lcd_tmp1,lcd_tmp2,lcd_tmp3);
}

void lcd_wrd(uint8_t data_d)
{
  c0:	9a ef       	ldi	r25, 0xFA	; 250
  c2:	90 93 60 00 	sts	0x0060, r25
     lcd_tmp1=0xfa;        //串行通讯第一字节为1 1 1 1 1 1 Rw Rs 0
                           //写数据RS=1 RW=0
     lcd_tmp2=data_d&0xf0; //第二字节为D7 D6 D5 D4 0 0 0 0
  c6:	68 2f       	mov	r22, r24
  c8:	60 7f       	andi	r22, 0xF0	; 240
  ca:	60 93 62 00 	sts	0x0062, r22
     lcd_tmp3=data_d<<4;   //第三字节为D3 D2 D1 D0 0 0 0 0
  ce:	82 95       	swap	r24
  d0:	80 7f       	andi	r24, 0xF0	; 240
  d2:	80 93 61 00 	sts	0x0061, r24
     lcd_write(lcd_tmp1,lcd_tmp2,lcd_tmp3);
  d6:	48 2f       	mov	r20, r24
  d8:	8a ef       	ldi	r24, 0xFA	; 250
  da:	0e 94 52 00 	call	0xa4	; 0xa4 <lcd_write>

}
  de:	08 95       	ret

000000e0 <lcd_wri>:
       _delay_ms(10);
       lcd_wri(0x06);//DDRAM的地址计数器(AC)加1
}

void lcd_wri(uint8_t data_i)
{
  e0:	98 ef       	ldi	r25, 0xF8	; 248
  e2:	90 93 60 00 	sts	0x0060, r25
     lcd_tmp1=0xf8;       //串行通讯第一字节为1 1 1 1 1 1 Rw Rs 0
                          //写指令RS=RW=0
     lcd_tmp2=data_i&0xf0;//第二字节为D7 D6 D5 D4 0 0 0 0
  e6:	68 2f       	mov	r22, r24
  e8:	60 7f       	andi	r22, 0xF0	; 240
  ea:	60 93 62 00 	sts	0x0062, r22
     lcd_tmp3=data_i<<4;  //第三字节为D3 D2 D1 D0 0 0 0 0
  ee:	82 95       	swap	r24
  f0:	80 7f       	andi	r24, 0xF0	; 240
  f2:	80 93 61 00 	sts	0x0061, r24
     lcd_write(lcd_tmp1,lcd_tmp2,lcd_tmp3);
  f6:	48 2f       	mov	r20, r24
  f8:	88 ef       	ldi	r24, 0xF8	; 248
  fa:	0e 94 52 00 	call	0xa4	; 0xa4 <lcd_write>
}
  fe:	08 95       	ret

00000100 <lcd_dis>:
{
     	lcd_wri(1);
}	

void lcd_dis(uint8_t lcd_addr,uint8_t dis_data)
{
 100:	1f 93       	push	r17
 102:	98 2f       	mov	r25, r24
 104:	16 2f       	mov	r17, r22
     	if((lcd_addr>=0x80)&&(lcd_addr<=0x9f)) lcd_wri(lcd_addr);
 106:	80 58       	subi	r24, 0x80	; 128
 108:	80 32       	cpi	r24, 0x20	; 32
 10a:	18 f4       	brcc	.+6      	; 0x112 <lcd_dis+0x12>
 10c:	89 2f       	mov	r24, r25
 10e:	0e 94 70 00 	call	0xe0	; 0xe0 <lcd_wri>
     	lcd_wrd(dis_data);
 112:	81 2f       	mov	r24, r17
 114:	0e 94 60 00 	call	0xc0	; 0xc0 <lcd_wrd>
}
 118:	1f 91       	pop	r17
 11a:	08 95       	ret

0000011c <lcd_clear>:
     lcd_write(lcd_tmp1,lcd_tmp2,lcd_tmp3);

}

void lcd_clear(void)
{
 11c:	81 e0       	ldi	r24, 0x01	; 1
 11e:	0e 94 70 00 	call	0xe0	; 0xe0 <lcd_wri>
     	lcd_wri(1);
}	
 122:	08 95       	ret

00000124 <lcd_init>:
void lcd_clear(void);//清屏

uint8_t lcd_tmp1,lcd_tmp2,lcd_tmp3;

void lcd_init(void)
{
 124:	0f 93       	push	r16
 126:	1f 93       	push	r17
    milliseconds can be achieved.
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 128:	80 e6       	ldi	r24, 0x60	; 96
 12a:	9a ee       	ldi	r25, 0xEA	; 234
 12c:	01 97       	sbiw	r24, 0x01	; 1
 12e:	f1 f7       	brne	.-4      	; 0x12c <lcd_init+0x8>
       _delay_ms(40);//延时40ms
       lcd_wri(0x30);//功能设置---8BIT控制界面,基本指令集
 130:	80 e3       	ldi	r24, 0x30	; 48
 132:	0e 94 70 00 	call	0xe0	; 0xe0 <lcd_wri>
 136:	0c ed       	ldi	r16, 0xDC	; 220
 138:	15 e0       	ldi	r17, 0x05	; 5
 13a:	c8 01       	movw	r24, r16
 13c:	01 97       	sbiw	r24, 0x01	; 1
 13e:	f1 f7       	brne	.-4      	; 0x13c <lcd_init+0x18>
       _delay_ms(1);
       lcd_wri(0x0c);//显示打开,光标关,反白显示关
 140:	8c e0       	ldi	r24, 0x0C	; 12
 142:	0e 94 70 00 	call	0xe0	; 0xe0 <lcd_wri>
 146:	c8 01       	movw	r24, r16
 148:	01 97       	sbiw	r24, 0x01	; 1
 14a:	f1 f7       	brne	.-4      	; 0x148 <lcd_init+0x24>
       _delay_ms(1);
       lcd_wri(0x01);//清除屏幕显示,将DDRAM的地址计数器归零
 14c:	81 e0       	ldi	r24, 0x01	; 1
 14e:	0e 94 70 00 	call	0xe0	; 0xe0 <lcd_wri>
 152:	88 e9       	ldi	r24, 0x98	; 152
 154:	9a e3       	ldi	r25, 0x3A	; 58
 156:	01 97       	sbiw	r24, 0x01	; 1
 158:	f1 f7       	brne	.-4      	; 0x156 <lcd_init+0x32>
       _delay_ms(10);
       lcd_wri(0x06);//DDRAM的地址计数器(AC)加1
 15a:	86 e0       	ldi	r24, 0x06	; 6
 15c:	0e 94 70 00 	call	0xe0	; 0xe0 <lcd_wri>
}
 160:	1f 91       	pop	r17
 162:	0f 91       	pop	r16
 164:	08 95       	ret

00000166 <da_init>:

void da_write(uint16_t da_val);
void da_init(void);

void da_init()
{
 166:	c1 9a       	sbi	0x18, 1	; 24
     PORTB|=(1<<da_cs);
}
 168:	08 95       	ret

0000016a <da_write>:

void da_write(uint16_t da_val)
{
 16a:	88 0f       	add	r24, r24
 16c:	99 1f       	adc	r25, r25
 16e:	88 0f       	add	r24, r24
 170:	99 1f       	adc	r25, r25
     uint16_t da_tmp;
     uint8_t da_tmp1;
     da_tmp=da_val<<2;
     da_tmp&=0x0fff;                       //TLC5615十六位通讯格式
 172:	9f 70       	andi	r25, 0x0F	; 15
                                           //为4位0+10位数据+2位0
     da_tmp1=(uint8_t)((da_tmp&0xff00)>>8);//提取前八位
     SPCR|=(1<<SPE);                       //SPI使能
 174:	6e 9a       	sbi	0x0d, 6	; 13
     PORTB&=(~(1<<da_cs));                 //DA使能
 176:	c1 98       	cbi	0x18, 1	; 24
     SPDR=da_tmp1;                         //SPI传送第一字节
 178:	9f b9       	out	0x0f, r25	; 15
     da_tmp1=(uint8_t)(da_tmp&0x00ff);     //提取后八位
     while(!(SPSR&(1<<SPIF)));             //等待传送完成
 17a:	77 9b       	sbis	0x0e, 7	; 14
 17c:	fe cf       	rjmp	.-4      	; 0x17a <da_write+0x10>
     SPDR=da_tmp1;                         //SPI传送第二字节
 17e:	8f b9       	out	0x0f, r24	; 15
     while(!(SPSR&(1<<SPIF)));
 180:	77 9b       	sbis	0x0e, 7	; 14
 182:	fe cf       	rjmp	.-4      	; 0x180 <da_write+0x16>
     PORTB|=(1<<da_cs);                    //DA关闭
 184:	c1 9a       	sbi	0x18, 1	; 24
     SPCR&=(~(1<<SPE));                    //SPI关闭
 186:	6e 98       	cbi	0x0d, 6	; 13
}
 188:	08 95       	ret

0000018a <main>:
#include <stdint.h>
#include "lcd.c"
#include "5615.c"

int main(void)
   {
 18a:	cf 93       	push	r28
 18c:	df 93       	push	r29
   	
    DDRA=0xff;
 18e:	8f ef       	ldi	r24, 0xFF	; 255
 190:	8a bb       	out	0x1a, r24	; 26
    DDRB=0xff;
 192:	87 bb       	out	0x17, r24	; 23
    DDRC=0xff;
 194:	84 bb       	out	0x14, r24	; 20
    DDRD=0xff;
 196:	81 bb       	out	0x11, r24	; 17
    PORTA=0;
 198:	1b ba       	out	0x1b, r1	; 27
	  PORTB=0;
 19a:	18 ba       	out	0x18, r1	; 24
	  PORTC=0;
 19c:	15 ba       	out	0x15, r1	; 21
	  PORTD=0;
 19e:	12 ba       	out	0x12, r1	; 18
void spi_send(uint8_t cdata);

void spi_init(void)
    {
     /* 设置MOSI 和SCK 为输出,其他为输入 */
     DDRB = 0xbf;
 1a0:	8f eb       	ldi	r24, 0xBF	; 191
 1a2:	87 bb       	out	0x17, r24	; 23
     /* 使能SPI 主机模式,设置时钟速率为fck/16 */
     SPCR = 0x11;
 1a4:	81 e1       	ldi	r24, 0x11	; 17
 1a6:	8d b9       	out	0x0d, r24	; 13
    spi_init();
    lcd_init();
 1a8:	0e 94 92 00 	call	0x124	; 0x124 <lcd_init>
void da_write(uint16_t da_val);
void da_init(void);

void da_init()
{
     PORTB|=(1<<da_cs);
 1ac:	c1 9a       	sbi	0x18, 1	; 24
 1ae:	c0 e0       	ldi	r28, 0x00	; 0
 1b0:	d0 e0       	ldi	r29, 0x00	; 0
    da_init();
    while(1)
         { uint16_t i;
           for(i=0;i<0x0400;i+=1)
               {
                 da_write(i);
 1b2:	ce 01       	movw	r24, r28
 1b4:	0e 94 b5 00 	call	0x16a	; 0x16a <da_write>
    spi_init();
    lcd_init();
    da_init();
    while(1)
         { uint16_t i;
           for(i=0;i<0x0400;i+=1)
 1b8:	21 96       	adiw	r28, 0x01	; 1
 1ba:	84 e0       	ldi	r24, 0x04	; 4
 1bc:	c0 30       	cpi	r28, 0x00	; 0
 1be:	d8 07       	cpc	r29, r24
 1c0:	b0 f7       	brcc	.-20     	; 0x1ae <main+0x24>
 1c2:	f7 cf       	rjmp	.-18     	; 0x1b2 <main+0x28>

000001c4 <_exit>:
 1c4:	f8 94       	cli

000001c6 <__stop_program>:
 1c6:	ff cf       	rjmp	.-2      	; 0x1c6 <__stop_program>

⌨️ 快捷键说明

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