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

📄 019.lst

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0033 E5CF      LDI	R28,0x5F
    0034 E0D4      LDI	R29,4
    0035 BFCD      OUT	0x3D,R28
    0036 BFDE      OUT	0x3E,R29
    0037 51C0      SUBI	R28,0x10
    0038 40D0      SBCI	R29,0
    0039 EA0A      LDI	R16,0xAA
    003A 8308      STD	Y+0,R16
    003B 2400      CLR	R0
    003C E7E2      LDI	R30,0x72
    003D E0F0      LDI	R31,0
    003E E010      LDI	R17,0
    003F 37E2      CPI	R30,0x72
    0040 07F1      CPC	R31,R17
    0041 F011      BEQ	0x0044
    0042 9201      ST	R0,Z+
    0043 CFFB      RJMP	0x003F
    0044 8300      STD	Z+0,R16
    0045 E5E4      LDI	R30,0x54
    0046 E0F0      LDI	R31,0
    0047 E6A0      LDI	R26,0x60
    0048 E0B0      LDI	R27,0
    0049 E010      LDI	R17,0
    004A 36E6      CPI	R30,0x66
    004B 07F1      CPC	R31,R17
    004C F021      BEQ	0x0051
    004D 95C8      LPM
    004E 9631      ADIW	R30,1
    004F 920D      ST	R0,X+
    0050 CFF9      RJMP	0x004A
    0051 940E0124  CALL	_main
_exit:
    0053 CFFF      RJMP	_exit
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\uart.c
(0001) #include "iom16v.h"
(0002) 
(0003) /*串口初始化函数*/
(0004) void Uart_Init(void) {
(0005) 	UCSRA = 0x02;		/*倍速*/
_Uart_Init:
    0054 E082      LDI	R24,2
    0055 B98B      OUT	0x0B,R24
(0006) 	UCSRB = 0x18;		/*允许接收和发送*/
    0056 E188      LDI	R24,0x18
    0057 B98A      OUT	0x0A,R24
(0007) 	UCSRC = 0x06;		/*8位数据*/
    0058 E086      LDI	R24,6
    0059 BD80      OUT	0x20,R24
(0008) 	UBRRH = 0x00;
    005A 2422      CLR	R2
    005B BC20      OUT	0x20,R2
(0009) 	UBRRL = 12;		/*9600*/
    005C E08C      LDI	R24,0xC
    005D B989      OUT	0x09,R24
    005E 9508      RET
(0010) }
(0011) 
(0012) /*数据发送,查询方式*/
(0013) void Uart_Transmit(unsigned char i) {
(0014) 
(0015) 	while (!(UCSRA & (1<<UDRE)));		/* 等待发送缓冲器为空*/
_Uart_Transmit:
  i                    --> R16
    005F 9B5D      SBIS	0x0B,5
    0060 CFFE      RJMP	_Uart_Transmit
(0016) 	UDR = i;				/* 发送数据*/
    0061 B90C      OUT	0x0C,R16
    0062 9508      RET
(0017) }
(0018) 
(0019) /*数据接收,查询方式*/
(0020) unsigned char Uart_Receive( void ) {
(0021) 
(0022) 	while (!(UCSRA & (1<<RXC)));		/* 等待接收数据*/
_Uart_Receive:
    0063 9B5F      SBIS	0x0B,7
    0064 CFFE      RJMP	_Uart_Receive
(0023) 	return UDR;				/* 获取并返回数据*/
    0065 B10C      IN	R16,0x0C
    0066 9508      RET
_beep:
  i                    --> R20
    0067 940E02BE  CALL	push_gset1
    0069 01A8      MOVW	R20,R16
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\beep.c
(0001) #include "iom16v.h"
(0002) 
(0003) /*
(0004) 内部1 M晶振。
(0005) 定时器实险,周期信号驱动无源蜂鸣器。
(0006) 程序中实现单一频率的周期性提示音。
(0007) 程序采用单任务方式,软件延时。
(0008) */
(0009) #include "delay.h"
(0010) void beep(unsigned int i) {
(0011) 	TCCR1A = 0x40;
    006A E480      LDI	R24,0x40
    006B BD8F      OUT	0x2F,R24
(0012) 	TCCR1B = 0x09;
    006C E089      LDI	R24,0x9
    006D BD8E      OUT	0x2E,R24
(0013) 	OCR1A =  1000;
    006E EE88      LDI	R24,0xE8
    006F E093      LDI	R25,3
    0070 BD9B      OUT	0x2B,R25
    0071 BD8A      OUT	0x2A,R24
(0014) 	delay_ms(i);
    0072 018A      MOVW	R16,R20
    0073 940E007B  CALL	_delay_ms
(0015) 	TCCR1A = 0x00;
    0075 2422      CLR	R2
    0076 BC2F      OUT	0x2F,R2
(0016) 	PORTD |= (1 << 5);;
    0077 9A95      SBI	0x12,5
    0078 940E02C1  CALL	pop_gset1
    007A 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    007B 940E02BC  CALL	push_gset2
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\delay.c
(0001) /*延时函数*/
(0002) void delay_ms(unsigned int i) {
(0003) 
(0004) 	unsigned int a;
(0005) 	unsigned char b;
(0006) 	for (a = 1; a < i; a++) {
    007D E041      LDI	R20,1
    007E E050      LDI	R21,0
    007F C007      RJMP	0x0087
(0007) 		for (b = 1; b; b++) {
    0080 E061      LDI	R22,1
    0081 C001      RJMP	0x0083
    0082 9563      INC	R22
    0083 2366      TST	R22
    0084 F7E9      BNE	0x0082
    0085 5F4F      SUBI	R20,0xFF
    0086 4F5F      SBCI	R21,0xFF
    0087 1740      CP	R20,R16
    0088 0751      CPC	R21,R17
    0089 F3B0      BCS	0x0080
    008A 940E02B3  CALL	pop_gset2
    008C 9508      RET
_ds1302_write_byte:
  i                    --> R20
  d                    --> R18
  addr                 --> R16
    008D 940E02BE  CALL	push_gset1
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\ds1302.c
(0001) 
(0002) #include "iom16v.h"
(0003) 
(0004) /*复位脚*/
(0005) #define RST_CLR	PORTC &= ~(1 << PC4)/*电平置低*/
(0006) #define RST_SET	PORTC |= (1 << PC4)/*电平置高*/
(0007) #define RST_IN	DDRC &= ~(1 << PC4)/*方向输入*/
(0008) #define RST_OUT	DDRC |= (1 << PC4)/*方向输出*/
(0009) 
(0010) /*双向数据*/
(0011) #define IO_CLR	PORTC &= ~(1 << PC3)/*电平置低*/
(0012) #define IO_SET	PORTC |= (1 << PC3)/*电平置高*/
(0013) #define IO_R	PINC & (1 << PC3)/*电平读取*/
(0014) #define IO_IN	DDRC &= ~(1 << PC3)/*方向输入*/
(0015) #define IO_OUT	DDRC |= (1 << PC3)/*方向输出*/
(0016) 
(0017) /*时钟信号*/
(0018) #define SCK_CLR	PORTC &= ~(1 << PC2)/*时钟信号*/
(0019) #define SCK_SET	PORTC |= (1 << PC2)/*电平置高*/
(0020) #define SCK_IN	DDRC &= ~(1 << PC2)/*方向输入*/
(0021) #define SCK_OUT	DDRC |= (1 << PC2)/*方向输出*/
(0022) 
(0023) #define ds1302_sec_add			0x80		//秒数据地址
(0024) #define ds1302_min_add			0x82		//分数据地址
(0025) #define ds1302_hr_add			0x84		//时数据地址
(0026) #define ds1302_date_add			0x86		//日数据地址
(0027) #define ds1302_month_add		0x88		//月数据地址
(0028) #define ds1302_day_add			0x8a		//星期数据地址
(0029) #define ds1302_year_add			0x8c		//年数据地址
(0030) #define ds1302_control_add		0x8e		//控制数据地址
(0031) #define ds1302_charger_add		0x90 					 
(0032) #define ds1302_clkburst_add		0xbe
(0033) 
(0034) unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
(0035) 
(0036) /*向DS1302写入一字节数据*/
(0037) void ds1302_write_byte(unsigned char addr, unsigned char d) {
(0038) 
(0039) 	unsigned char i;
(0040) 	RST_SET;					/*启动DS1302总线*/
    008F 9AAC      SBI	0x15,4
(0041) 	
(0042) 	/*写入目标地址:addr*/
(0043) 	IO_OUT;
    0090 9AA3      SBI	0x14,3
(0044) 	addr = addr & 0xFE;/*最低位置零*/
    0091 7F0E      ANDI	R16,0xFE
(0045) 	for (i = 0; i < 8; i ++) {
    0092 2744      CLR	R20
    0093 C009      RJMP	0x009D
(0046) 		if (addr & 0x01) {
    0094 FF00      SBRS	R16,0
    0095 C002      RJMP	0x0098
(0047) 			IO_SET;
    0096 9AAB      SBI	0x15,3
(0048) 			}
    0097 C001      RJMP	0x0099
(0049) 		else {
(0050) 			IO_CLR;
    0098 98AB      CBI	0x15,3
(0051) 			}
(0052) 		SCK_SET;
    0099 9AAA      SBI	0x15,2
(0053) 		SCK_CLR;
    009A 98AA      CBI	0x15,2
(0054) 		addr = addr >> 1;
    009B 9506      LSR	R16
    009C 9543      INC	R20
    009D 3048      CPI	R20,0x8
    009E F3A8      BCS	0x0094
(0055) 		}
(0056) 	
(0057) 	/*写入数据:d*/
(0058) 	IO_OUT;
    009F 9AA3      SBI	0x14,3
(0059) 	for (i = 0; i < 8; i ++) {
    00A0 2744      CLR	R20
    00A1 C009      RJMP	0x00AB
(0060) 		if (d & 0x01) {
    00A2 FF20      SBRS	R18,0
    00A3 C002      RJMP	0x00A6
(0061) 			IO_SET;
    00A4 9AAB      SBI	0x15,3
(0062) 			}
    00A5 C001      RJMP	0x00A7
(0063) 		else {
(0064) 			IO_CLR;
    00A6 98AB      CBI	0x15,3
(0065) 			}
(0066) 		SCK_SET;
    00A7 9AAA      SBI	0x15,2
(0067) 		SCK_CLR;
    00A8 98AA      CBI	0x15,2
(0068) 		d = d >> 1;
    00A9 9526      LSR	R18
    00AA 9543      INC	R20
    00AB 3048      CPI	R20,0x8
    00AC F3A8      BCS	0x00A2
(0069) 		}
(0070) 	RST_CLR;					/*停止DS1302总线*/
    00AD 98AC      CBI	0x15,4
    00AE 940E02C1  CALL	pop_gset1
    00B0 9508      RET
_ds1302_read_byte:
  temp                 --> R20
  i                    --> R22
  addr                 --> R16
    00B1 940E02BC  CALL	push_gset2
(0071) }
(0072) 
(0073) /*从DS1302读出一字节数据*/
(0074) unsigned char ds1302_read_byte(unsigned char addr) {
(0075) 
(0076) 	unsigned char i;
(0077) 	unsigned char temp;
(0078) 	RST_SET;					/*启动DS1302总线*/
    00B3 9AAC      SBI	0x15,4
(0079) 
(0080) 	/*写入目标地址:addr*/
(0081) 	IO_OUT;
    00B4 9AA3      SBI	0x14,3
(0082) 	addr = addr | 0x01;/*最低位置高*/
    00B5 6001      ORI	R16,1
(0083) 	for (i = 0; i < 8; i ++) {
    00B6 2766      CLR	R22
    00B7 C009      RJMP	0x00C1
(0084) 		if (addr & 0x01) {
    00B8 FF00      SBRS	R16,0
    00B9 C002      RJMP	0x00BC
(0085) 			IO_SET;
    00BA 9AAB      SBI	0x15,3
(0086) 			}
    00BB C001      RJMP	0x00BD
(0087) 		else {
(0088) 			IO_CLR;
    00BC 98AB      CBI	0x15,3
(0089) 			}
(0090) 		SCK_SET;
    00BD 9AAA      SBI	0x15,2
(0091) 		SCK_CLR;
    00BE 98AA      CBI	0x15,2
(0092) 		addr = addr >> 1;
    00BF 9506      LSR	R16
    00C0 9563      INC	R22
    00C1 3068      CPI	R22,0x8
    00C2 F3A8      BCS	0x00B8
(0093) 		}
(0094) 	
(0095) 	/*输出数据:temp*/
(0096) 	IO_IN;
    00C3 98A3      CBI	0x14,3
(0097) 	for (i = 0; i < 8; i ++) {
    00C4 2766      CLR	R22
    00C5 C009      RJMP	0x00CF
(0098) 		temp = temp >> 1;
    00C6 9546      LSR	R20
(0099) 		if (IO_R) {
    00C7 9B9B      SBIS	0x13,3
    00C8 C002      RJMP	0x00CB
(0100) 			temp |= 0x80;
    00C9 6840      ORI	R20,0x80
(0101) 			}
    00CA C001      RJMP	0x00CC
(0102) 		else {
(0103) 			temp &= 0x7F;
    00CB 774F      ANDI	R20,0x7F
(0104) 			}
(0105) 		SCK_SET;
    00CC 9AAA      SBI	0x15,2
(0106) 		SCK_CLR;
    00CD 98AA      CBI	0x15,2
    00CE 9563      INC	R22
    00CF 3068      CPI	R22,0x8
    00D0 F3A8      BCS	0x00C6
(0107) 		}
(0108) 	
(0109) 	RST_CLR;					/*停止DS1302总线*/
    00D1 98AC      CBI	0x15,4
(0110) 	return temp;
    00D2 2F04      MOV	R16,R20
    00D3 940E02B3  CALL	pop_gset2
    00D5 9508      RET
(0111) }
(0112) 
(0113) /*向DS302写入时钟数据*/
(0114) void ds1302_write_time(void) {
(0115) 
(0116) 	ds1302_write_byte(ds1302_control_add,0x00);			//关闭写保护 
_ds1302_write_time:
    00D6 2722      CLR	R18
    00D7 E80E      LDI	R16,0x8E
    00D8 DFB4      RCALL	_ds1302_write_byte
(0117) 	ds1302_write_byte(ds1302_sec_add,0x80);				//暂停 
    00D9 E820      LDI	R18,0x80
    00DA E800      LDI	R16,0x80
    00DB DFB1      RCALL	_ds1302_write_byte
(0118) 	//ds1302_write_byte(ds1302_charger_add,0xa9);			//涓流充电 
(0119) 	ds1302_write_byte(ds1302_year_add,time_buf[1]);		//年 
    00DC 91200061  LDS	R18,time_buf+1
    00DE E80C      LDI	R16,0x8C
    00DF DFAD      RCALL	_ds1302_write_byte
(0120) 	ds1302_write_byte(ds1302_month_add,time_buf[2]);	//月 
    00E0 91200062  LDS	R18,time_buf+2
    00E2 E808      LDI	R16,0x88
    00E3 DFA9      RCALL	_ds1302_write_byte
(0121) 	ds1302_write_byte(ds1302_date_add,time_buf[3]);		//日 
    00E4 91200063  LDS	R18,time_buf+3
    00E6 E806      LDI	R16,0x86
    00E7 DFA5      RCALL	_ds1302_write_byte
(0122) 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
    00E8 91200067  LDS	R18,0x67
    00EA E80A      LDI	R16,0x8A
    00EB DFA1      RCALL	_ds1302_write_byte
(0123) 	ds1302_write_byte(ds1302_hr_add,time_buf[4]);		//时 
    00EC 91200064  LDS	R18,0x64
    00EE E804      LDI	R16,0x84
    00EF DF9D      RCALL	_ds1302_write_byte
(0124) 	ds1302_write_byte(ds1302_min_add,time_buf[5]);		//分
    00F0 91200065  LDS	R18,0x65
    00F2 E802      LDI	R16,0x82
    00F3 DF99      RCALL	_ds1302_write_byte
(0125) 	ds1302_write_byte(ds1302_sec_add,time_buf[6]);		//秒
    00F4 91200066  LDS	R18,0x66
    00F6 E800      LDI	R16,0x80
    00F7 DF95      RCALL	_ds1302_write_byte
(0126) 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
    00F8 91200067  LDS	R18,0x67
    00FA E80A      LDI	R16,0x8A
    00FB DF91      RCALL	_ds1302_write_byte

⌨️ 快捷键说明

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