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

📄 019.lst

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0127) 	ds1302_write_byte(ds1302_control_add,0x80);			//打开写保护 
    00FC E820      LDI	R18,0x80
    00FD E80E      LDI	R16,0x8E
    00FE DF8E      RCALL	_ds1302_write_byte
    00FF 9508      RET
(0128) }
(0129) 
(0130) /*从DS302读出时钟数据*/
(0131) void ds1302_read_time(void)  { 
(0132) 
(0133) 	time_buf[1]=ds1302_read_byte(ds1302_year_add);		//年 
_ds1302_read_time:
    0100 E80C      LDI	R16,0x8C
    0101 DFAF      RCALL	_ds1302_read_byte
    0102 93000061  STS	time_buf+1,R16
(0134) 	time_buf[2]=ds1302_read_byte(ds1302_month_add);		//月 
    0104 E808      LDI	R16,0x88
    0105 DFAB      RCALL	_ds1302_read_byte
    0106 93000062  STS	time_buf+2,R16
(0135) 	time_buf[3]=ds1302_read_byte(ds1302_date_add);		//日 
    0108 E806      LDI	R16,0x86
    0109 DFA7      RCALL	_ds1302_read_byte
    010A 93000063  STS	time_buf+3,R16
(0136) 	time_buf[4]=ds1302_read_byte(ds1302_hr_add);		//时 
    010C E804      LDI	R16,0x84
    010D DFA3      RCALL	_ds1302_read_byte
    010E 93000064  STS	0x64,R16
(0137) 	time_buf[5]=ds1302_read_byte(ds1302_min_add);		//分 
    0110 E802      LDI	R16,0x82
    0111 DF9F      RCALL	_ds1302_read_byte
    0112 93000065  STS	0x65,R16
(0138) 	time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒 
    0114 E800      LDI	R16,0x80
    0115 DF9B      RCALL	_ds1302_read_byte
    0116 2F80      MOV	R24,R16
    0117 778F      ANDI	R24,0x7F
    0118 93800066  STS	0x66,R24
(0139) 	time_buf[7]=ds1302_read_byte(ds1302_day_add);		//周 
    011A E80A      LDI	R16,0x8A
    011B DF95      RCALL	_ds1302_read_byte
    011C 93000067  STS	0x67,R16
    011E 9508      RET
(0140) }
(0141) 
(0142) /*DS302初始化函数*/
(0143) void ds1302_init(void) {
(0144) 	
(0145) 	RST_CLR;			/*RST脚置低*/
_ds1302_init:
    011F 98AC      CBI	0x15,4
(0146) 	SCK_CLR;			/*SCK脚置低*/
    0120 98AA      CBI	0x15,2
(0147) 	RST_OUT;			/*RST脚设置为输出*/
    0121 9AA4      SBI	0x14,4
(0148) 	SCK_OUT;			/*SCK脚设置为输出*/
    0122 9AA2      SBI	0x14,2
    0123 9508      RET
_main:
  temp                 --> Y+0
    0124 9721      SBIW	R28,1
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\main.c
(0001) /*
(0002) 实验十三:
(0003) 
(0004) 	AVR单片机I2C总线实验。
(0005) 	1、用24C02记录CPU启动次数,并在PB口上显示出来。
(0006) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 	3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)/PC0/PC1短路块。
(0008) 	4、通过此实验,可以I2C总线操作有个初步认识。
(0009) 	
(0010) 	AVR  mega16学习板
(0011) 	www.iccavr.com
(0012) 	14:42 2007-4-9
(0013) */
(0014) 
(0015) #include "iom16v.h"
(0016) #include "beep.h"
(0017) #include "delay.h"
(0018) #include "ds1302.h"
(0019) #include "spi.h"
(0020) #include "twi.h"
(0021) #include "uart.h"
(0022) 
(0023) void main(void) {
(0024) 
(0025) 	unsigned char temp;
(0026) 
(0027) 	PORTA = 0xFF;				/*打开上拉*/
    0125 EF8F      LDI	R24,0xFF
    0126 BB8B      OUT	0x1B,R24
(0028) 	DDRA = 0x00;				/*方向输入*/
    0127 2422      CLR	R2
    0128 BA2A      OUT	0x1A,R2
(0029) 	PORTB = 0xFF;				/*电平设置*/
    0129 BB88      OUT	0x18,R24
(0030) 	DDRB = 0xFF;				/*方向输出*/
    012A BB87      OUT	0x17,R24
(0031) 	PORTC = 0xFF;
    012B BB85      OUT	0x15,R24
(0032) 	DDRC = 0x00;
    012C BA24      OUT	0x14,R2
(0033) 	PORTD = 0xFF;
    012D BB82      OUT	0x12,R24
(0034) 	DDRD = 0x20;
    012E E280      LDI	R24,0x20
    012F BB81      OUT	0x11,R24
(0035) 
(0036) 	/*蜂鸣器测验试*/
(0037) 	delay_ms(100);
    0130 E604      LDI	R16,0x64
    0131 E010      LDI	R17,0
    0132 940E007B  CALL	_delay_ms
(0038) 	beep(300);
    0134 E20C      LDI	R16,0x2C
    0135 E011      LDI	R17,1
    0136 940E0067  CALL	_beep
(0039) 
(0040) 	/*按键及指示灯测试*/
(0041) 	delay_ms(1000);
    0138 EE08      LDI	R16,0xE8
    0139 E013      LDI	R17,3
    013A 940E007B  CALL	_delay_ms
    013C C010      RJMP	0x014D
(0042) 	while (1) {
(0043) 		temp = PINA;					/*提取按键*/
    013D B229      IN	R2,0x19
    013E 8228      STD	Y+0,R2
(0044) 		if (temp != 0xFF) {
    013F 2D82      MOV	R24,R2
    0140 3F8F      CPI	R24,0xFF
    0141 F041      BEQ	0x014A
(0045) 			PORTB = temp;				/*显示按键值*/
    0142 BB88      OUT	0x18,R24
(0046) 			beep(200);
    0143 EC08      LDI	R16,0xC8
    0144 E010      LDI	R17,0
    0145 940E0067  CALL	_beep
(0047) 			while (PINA != 0xFF);		/*等待按键松开*/
    0147 B389      IN	R24,0x19
    0148 3F8F      CPI	R24,0xFF
    0149 F7E9      BNE	0x0147
(0048) 			}
(0049) 		if ((PIND & 0x04) == 0x00) {	/*INT键退出*/
    014A 9982      SBIC	0x10,2
    014B C001      RJMP	0x014D
(0050) 			break;
    014C C001      RJMP	0x014E
    014D CFEF      RJMP	0x013D
(0051) 			}
(0052) 		}
(0053) 
(0054) 	/*SPI总线HC595芯片测试*/
(0055) 	PORTB = 0xEF;
    014E EE8F      LDI	R24,0xEF
    014F BB88      OUT	0x18,R24
(0056) 	delay_ms(3000);
    0150 EB08      LDI	R16,0xB8
    0151 E01B      LDI	R17,0xB
    0152 940E007B  CALL	_delay_ms
(0057) 	SPI_MasterInit();					/*初始SPI接口*/
    0154 940E01CD  CALL	_SPI_MasterInit
(0058) 	PORTB = 0xF0;						/*打开4位数码管*/
    0156 EF80      LDI	R24,0xF0
    0157 BB88      OUT	0x18,R24
(0059) 	for (temp = 0; temp < 10; temp ++) {
    0158 2422      CLR	R2
    0159 8228      STD	Y+0,R2
    015A C010      RJMP	0x016B
(0060) 		SPI_595_Out(disp[temp]);		/*显示数据输出*/
    015B E688      LDI	R24,0x68
    015C E090      LDI	R25,0
    015D 81E8      LDD	R30,Y+0
    015E 27FF      CLR	R31
    015F 0FE8      ADD	R30,R24
    0160 1FF9      ADC	R31,R25
    0161 8100      LDD	R16,Z+0
    0162 940E01D7  CALL	_SPI_595_Out
(0061) 		delay_ms(500);
    0164 EF04      LDI	R16,0xF4
    0165 E011      LDI	R17,1
    0166 940E007B  CALL	_delay_ms
    0168 8188      LDD	R24,Y+0
    0169 5F8F      SUBI	R24,0xFF
    016A 8388      STD	Y+0,R24
    016B 8188      LDD	R24,Y+0
    016C 308A      CPI	R24,0xA
    016D F368      BCS	0x015B
(0062) 		}
(0063) 	SPCR = 0x00;						/*关闭SPI接口*/
    016E 2422      CLR	R2
    016F B82D      OUT	0x0D,R2
(0064) 	
(0065) 	/*IIC总线24C02芯片测试*/
(0066) 	PORTB = 0xDF;
    0170 ED8F      LDI	R24,0xDF
    0171 BB88      OUT	0x18,R24
(0067) 	delay_ms(3000);
    0172 EB08      LDI	R16,0xB8
    0173 E01B      LDI	R17,0xB
    0174 940E007B  CALL	_delay_ms
(0068) 	twi_write(0x08, 0x55);				/*写入标志*/
    0176 E525      LDI	R18,0x55
    0177 E008      LDI	R16,0x8
    0178 940E020D  CALL	_twi_write
(0069) 	delay_ms(10);
    017A E00A      LDI	R16,0xA
    017B E010      LDI	R17,0
    017C 940E007B  CALL	_delay_ms
(0070) 	twi_read(0x08, &temp);				/*读出标志*/
    017E 019E      MOVW	R18,R28
    017F E008      LDI	R16,0x8
    0180 940E0251  CALL	_twi_read
(0071) 	delay_ms(500);
    0182 EF04      LDI	R16,0xF4
    0183 E011      LDI	R17,1
    0184 940E007B  CALL	_delay_ms
(0072) 	if (temp == 0x55) {					/*校验标志*/
    0186 8188      LDD	R24,Y+0
    0187 3585      CPI	R24,0x55
    0188 F429      BNE	0x018E
(0073) 		beep(300);
    0189 E20C      LDI	R16,0x2C
    018A E011      LDI	R17,1
    018B 940E0067  CALL	_beep
(0074) 		}
    018D C004      RJMP	0x0192
(0075) 	else {
(0076) 		beep(1500);
    018E ED0C      LDI	R16,0xDC
    018F E015      LDI	R17,5
    0190 940E0067  CALL	_beep
(0077) 		}
(0078) 
(0079) 	/*DS302芯片测试*/
(0080) 	PORTB = 0xBF;
    0192 EB8F      LDI	R24,0xBF
    0193 BB88      OUT	0x18,R24
(0081) 	delay_ms(1000);
    0194 EE08      LDI	R16,0xE8
    0195 E013      LDI	R17,3
    0196 940E007B  CALL	_delay_ms
(0082) 	ds1302_init();						/*初始化DS302*/
    0198 940E011F  CALL	_ds1302_init
(0083) 	time_buf[5] = 0x55;
    019A E585      LDI	R24,0x55
    019B 93800065  STS	0x65,R24
(0084) 	time_buf[6] = 0x00;
    019D 2422      CLR	R2
    019E 92200066  STS	0x66,R2
(0085) 	ds1302_write_time();				/*写入标志*/
    01A0 940E00D6  CALL	_ds1302_write_time
(0086) 	delay_ms(2000);
    01A2 ED00      LDI	R16,0xD0
    01A3 E017      LDI	R17,7
    01A4 940E007B  CALL	_delay_ms
(0087) 	ds1302_read_time();					/*读出标志*/
    01A6 940E0100  CALL	_ds1302_read_time
(0088) 	if ((time_buf[5] == 0x55) && (time_buf[6] != 0x00)) {/*校验标志*/
    01A8 91800065  LDS	R24,0x65
    01AA 3585      CPI	R24,0x55
    01AB F449      BNE	0x01B5
    01AC 90200066  LDS	R2,0x66
    01AE 2022      TST	R2
    01AF F029      BEQ	0x01B5
(0089) 		beep(300);
    01B0 E20C      LDI	R16,0x2C
    01B1 E011      LDI	R17,1
    01B2 940E0067  CALL	_beep
(0090) 		}
    01B4 C004      RJMP	0x01B9
(0091) 	else {
(0092) 		beep(1500);
    01B5 ED0C      LDI	R16,0xDC
    01B6 E015      LDI	R17,5
    01B7 940E0067  CALL	_beep
(0093) 		}
(0094) 
(0095) 	/*串口测试*/
(0096) 	PORTB = 0xF7;
    01B9 EF87      LDI	R24,0xF7
    01BA BB88      OUT	0x18,R24
(0097) 	delay_ms(3000);
    01BB EB08      LDI	R16,0xB8
    01BC E01B      LDI	R17,0xB
    01BD 940E007B  CALL	_delay_ms
(0098) 	Uart_Init();
    01BF 940E0054  CALL	_Uart_Init
    01C1 C008      RJMP	0x01CA
(0099) 	while (1) {
(0100) 		temp = Uart_Receive();		/*等待接收数据*/
    01C2 940E0063  CALL	_Uart_Receive
    01C4 8308      STD	Y+0,R16
(0101) 		PORTB = ~temp;				/*显示低电平有效*/
    01C5 2E20      MOV	R2,R16
    01C6 9420      COM	R2
    01C7 BA28      OUT	0x18,R2
(0102) 		Uart_Transmit(temp);		/*发送收到的数据*/
    01C8 940E005F  CALL	_Uart_Transmit
    01CA CFF7      RJMP	0x01C2
    01CB 9621      ADIW	R28,1
    01CC 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\spi.c
(0001) 
(0002) #include "iom16v.h"
(0003) 
(0004) /*
(0005) 实验四:
(0006) 	SPI接口实险,LED数据管显示。
(0007) 	1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0008) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0009) 	3、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块。
(0010) 
(0011) 	AVR  mega16学习板
(0012) 	www.iccavr.com
(0013) 	2006-01-10
(0014) */
(0015) 
(0016) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
(0017) 
(0018) /*SPI接口初始化*/
(0019) void SPI_MasterInit(void) {
(0020) 
(0021) 	DDRB |= 0xF0;		/* 设置MOSI 和SCK 为输出,其他为输入 */
_SPI_MasterInit:
    01CD B387      IN	R24,0x17
    01CE 6F80      ORI	R24,0xF0
    01CF BB87      OUT	0x17,R24
(0022) 	SPCR = (1<<SPE) | (1<<MSTR)
    01D0 E583      LDI	R24,0x53
    01D1 B98D      OUT	0x0D,R24
    01D2 9508      RET
(0023) 		| (1<<SPR1) | (1<<SPR0);		/* 使能SPI 主机模式,设置时钟速率为fck/128 */
(0024) }
(0025) 
(0026) /*SPI数据发送*/
(0027) void SPI_MasterTransmit(unsigned char i) {
(0028) 	
(0029) 	SPDR = i;							/* 启动数据传输 */
_SPI_MasterTransmit:
  i                    --> R16
    01D3 B90F      OUT	0x0F,R16
(0030) 	while (!(SPSR & (1<<SPIF))) {		/* 等待传输结束 */
    01D4 9B77      SBIS	0x0E,7
    01D5 CFFE      RJMP	0x01D4
    01D6 9508      RET
_SPI_595_Out:
  i                    --> R20
    01D7 940E02BE  CALL	push_gset1
    01D9 2F40      MOV	R20,R16
(0031) 		;
(0032) 		}
(0033) }
(0034) 
(0035) /*595数据输出*/
(0036) void SPI_595_Out(unsigned char i) {
(0037) 	PORTB &= ~(1 << 4);					/*准备锁存*/
    01DA 98C4      CBI	0x18,4
(0038) 	SPI_MasterTransmit(i);
    01DB 2F04      MOV	R16,R20
    01DC DFF6      RCALL	_SPI_MasterTransmit
(0039) 	PORTB |= (1 << 4);					/*锁存数据*/
    01DD 9AC4      SBI	0x18,4
    01DE 940E02C1  CALL	pop_gset1
    01E0 9508      RET
_error:
  type                 --> R16
    01E1 940E02BE  CALL	push_gset1
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\twi.c
(0001) /*
(0002) 	I2C总线/TWI操作模块
(0003) 	1、读取和写入函数
(0004) 	2、地址有效范围255
(0005) 	3、数据长度为单字节
(0006) 	4、函数采用查询方式
(0007) 	5、可直接嵌入到项目中使用
(0008) 	6、晶振频率:1M
(0009) 	7、总线速度:50K
(0010) 
(0011) 	AVR_AFA
(0012) 	www.iccavr.com
(0013) */

⌨️ 快捷键说明

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