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

📄 m16int.lst

📁 本程序是AVR系列单片机的外部中断程序,中断实验,LED数码管显示中断数据,按键按下计数,数码管显示计数结果
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0048) 返 回 值: 无
(0049) -----------------------------------------------------------------*/
(0050) void SPIMasterInit(void) 
(0051) {
(0052) // 	MOSI,MISO,SCK等都需要设计的数据方向定义
(0053) 	DDRB |= (1<<PB5) | (1<<PB7);		// 设置MOSI 和SCK 为输出,其他为输入 M16
_SPIMasterInit:
    009D B387      IN	R24,0x17
    009E 6A80      ORI	R24,0xA0
    009F BB87      OUT	0x17,R24
(0054) //	DDRB |= (1<<PB2) | (1<<PB3);		// 设置MOSI 和SCK 为输出,其他为输入 M64
(0055) //	SPI控制寄存器
(0056) //	SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
(0057) //	SPIE  中断使能  SPE SPI使能 DORD 数据次序 1为LSB首先发送,0为MSB首先发送
(0058) //	MSTR  主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
(0059) //  SS配置为输入,但被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新设置
(0060) //	MSTR 进入主机模式。
(0061) //	CPOL: 时钟极性见ATMEGA16L(中文)P130
(0062) //	CPHA: 时钟相位
(0063) //	SPR1, SPR0: SPI 时钟速率选择1 与0  SPR1 和SPR0 对从机没有影响。
(0064) //  使能SPI 主机模式,设置时钟速率为fck/128 */
(0065) 	SPCR  = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);		
    00A0 E583      LDI	R24,0x53
    00A1 B98D      OUT	0x0D,R24
    00A2 9508      RET
(0066) }
(0067) /*-----------------------------------------------------------------
(0068) 函数名称: void SPIMasterTransmit(unsigned char i) 
(0069) 函数功能: SPI数据发送
(0070) 参    数: 
(0071) 返 回 值: 无
(0072) -----------------------------------------------------------------*/
(0073) void SPIMasterTransmit(uchar TranData) 
(0074) {	
(0075) 	SPDR = TranData;					// 启动数据传输 
_SPIMasterTransmit:
  TranData             --> R16
    00A3 B90F      OUT	0x0F,R16
(0076) 	while (!(SPSR & (1<<SPIF)));		// 等待传输结束 
    00A4 9B77      SBIS	0x0E,7
    00A5 CFFE      RJMP	0x00A4
    00A6 9508      RET
_SPI595Out:
  i                    --> R20
    00A7 940E0168  CALL	push_gset1
    00A9 2F40      MOV	R20,R16
(0077) }
(0078) /*-----------------------------------------------------------------
(0079) 函数名称: void SPI595Out(unsigned char i)  
(0080) 函数功能: 通过74HC595输出数据
(0081) 参    数: 
(0082) 返 回 值: 无
(0083) -----------------------------------------------------------------*/
(0084) void SPI595Out(unsigned char i) 
(0085) {
(0086) 	PORTB &= ~(1 << 4);					//准备锁存
    00AA 98C4      CBI	0x18,4
(0087) 	SPIMasterTransmit(i);
    00AB 2F04      MOV	R16,R20
    00AC DFF6      RCALL	_SPIMasterTransmit
(0088) 	PORTB |= (1 << 4);					//锁存数据
    00AD 9AC4      SBI	0x18,4
    00AE 940E016B  CALL	pop_gset1
    00B0 9508      RET
(0089) }
(0090) /*-----------------------------------------------------------------
(0091) 函数名称: void InitDevices(void) 
(0092) 函数功能: 初始化各种信息
(0093) 参    数: 
(0094) 返 回 值: 无
(0095) -----------------------------------------------------------------*/
(0096) void InitDevices(void)
(0097) {
(0098)   	CLI(); 			   					//关全部中断
_InitDevices:
    00B1 94F8      BCLR	7
(0099) 	SPIMasterInit();   					//SPI初始化为主机
    00B2 DFEA      RCALL	_SPIMasterInit
(0100) 	
(0101)  	MCUCR = 0x02;	   					//中断0,下降沿触发
    00B3 E082      LDI	R24,2
    00B4 BF85      OUT	0x35,R24
(0102)  	GICR  = 0x40;	   					//开中断0,
    00B5 E480      LDI	R24,0x40
    00B6 BF8B      OUT	0x3B,R24
(0103)  	SEI(); 		 	   					//开中断
    00B7 9478      BSET	7
    00B8 9508      RET
(0104) }
(0105) 
(0106) void main(void) 
(0107) {
(0108)  	uchar temp;
(0109) 	DDRA = 0x00;						//方向输入
_main:
  temp                 --> R20
    00B9 2422      CLR	R2
    00BA BA2A      OUT	0x1A,R2
(0110) 	PORTA = 0xFF;						//打开上拉
    00BB EF8F      LDI	R24,0xFF
    00BC BB8B      OUT	0x1B,R24
(0111) 	DDRB = 0xFF;						//方向输出
    00BD BB87      OUT	0x17,R24
(0112) 	PORTB = 0xF0;						//电平设置
    00BE EF80      LDI	R24,0xF0
    00BF BB88      OUT	0x18,R24
(0113) 	DDRC = 0x00;
    00C0 BA24      OUT	0x14,R2
(0114) 	PORTC = 0xFF;
    00C1 EF8F      LDI	R24,0xFF
    00C2 BB85      OUT	0x15,R24
(0115) 	DDRD = 0xFF;
    00C3 BB81      OUT	0x11,R24
(0116) 	PORTD = 0xFF;
    00C4 BB82      OUT	0x12,R24
(0117) 	InitDevices();
    00C5 DFEB      RCALL	_InitDevices
    00C6 C07F      RJMP	0x0146
(0118) 	while (1) 
(0119) 	{
(0120) 		if( IntCnt > 9)
    00C7 E089      LDI	R24,0x9
    00C8 90200060  LDS	R2,IntCnt
    00CA 1582      CP	R24,R2
    00CB F008      BCS	0x00CD
    00CC C06A      RJMP	0x0137
(0121) 		{
(0122) 		 	if( IntCnt > 99)
    00CD E683      LDI	R24,0x63
    00CE 1582      CP	R24,R2
    00CF F008      BCS	0x00D1
    00D0 C03E      RJMP	0x010F
(0123) 			{
(0124) 			 	DDRB  = 0xff;
    00D1 EF8F      LDI	R24,0xFF
    00D2 BB87      OUT	0x17,R24
(0125) 				PORTB = 0xff;
    00D3 BB88      OUT	0x18,R24
(0126) 				temp  = IntCnt / 100;
    00D4 E614      LDI	R17,0x64
    00D5 2D02      MOV	R16,R2
    00D6 940E014A  CALL	div8u
    00D8 2F40      MOV	R20,R16
(0127) 		 		SPI595Out(disp[temp]);
    00D9 E681      LDI	R24,0x61
    00DA E090      LDI	R25,0
    00DB 2FE4      MOV	R30,R20
    00DC 27FF      CLR	R31
    00DD 0FE8      ADD	R30,R24
    00DE 1FF9      ADC	R31,R25
    00DF 8100      LDD	R16,Z+0
    00E0 DFC6      RCALL	_SPI595Out
(0128) 				PORTB = 0xfb;
    00E1 EF8B      LDI	R24,0xFB
    00E2 BB88      OUT	0x18,R24
(0129) 				DelayMs(1);
    00E3 E001      LDI	R16,1
    00E4 DFA7      RCALL	_DelayMs
(0130) 				PORTB = 0xff;
    00E5 EF8F      LDI	R24,0xFF
    00E6 BB88      OUT	0x18,R24
(0131) 				temp  = IntCnt%100/10;
    00E7 E614      LDI	R17,0x64
    00E8 91000060  LDS	R16,IntCnt
    00EA 940E0148  CALL	mod8u
    00EC E01A      LDI	R17,0xA
    00ED 940E014A  CALL	div8u
    00EF 2F40      MOV	R20,R16
(0132) 				SPI595Out(disp[temp]);
    00F0 E681      LDI	R24,0x61
    00F1 E090      LDI	R25,0
    00F2 2FE4      MOV	R30,R20
    00F3 27FF      CLR	R31
    00F4 0FE8      ADD	R30,R24
    00F5 1FF9      ADC	R31,R25
    00F6 8100      LDD	R16,Z+0
    00F7 DFAF      RCALL	_SPI595Out
(0133) 				PORTB = 0xfd;
    00F8 EF8D      LDI	R24,0xFD
    00F9 BB88      OUT	0x18,R24
(0134) 				DelayMs(1);
    00FA E001      LDI	R16,1
    00FB DF90      RCALL	_DelayMs
(0135) 				PORTB = 0xff;
    00FC EF8F      LDI	R24,0xFF
    00FD BB88      OUT	0x18,R24
(0136) 				temp  = IntCnt%10;
    00FE E01A      LDI	R17,0xA
    00FF 91000060  LDS	R16,IntCnt
    0101 940E0148  CALL	mod8u
    0103 2F40      MOV	R20,R16
(0137) 				SPI595Out(disp[temp]);
    0104 E681      LDI	R24,0x61
    0105 E090      LDI	R25,0
    0106 2FE4      MOV	R30,R20
    0107 27FF      CLR	R31
    0108 0FE8      ADD	R30,R24
    0109 1FF9      ADC	R31,R25
    010A 8100      LDD	R16,Z+0
    010B DF9B      RCALL	_SPI595Out
(0138) 				PORTB = 0xfe;
    010C EF8E      LDI	R24,0xFE
    010D BB88      OUT	0x18,R24
(0139) 			}
    010E C035      RJMP	0x0144
(0140) 			else
(0141) 			{
(0142) 			 	DDRB  = 0xff;
    010F EF8F      LDI	R24,0xFF
    0110 BB87      OUT	0x17,R24
(0143) 				PORTB = 0xff;
    0111 BB88      OUT	0x18,R24
(0144) 				temp  = IntCnt/10;
    0112 E01A      LDI	R17,0xA
    0113 91000060  LDS	R16,IntCnt
    0115 940E014A  CALL	div8u
    0117 2F40      MOV	R20,R16
(0145) 			 	SPI595Out(disp[temp]);
    0118 E681      LDI	R24,0x61
    0119 E090      LDI	R25,0
    011A 2FE4      MOV	R30,R20
    011B 27FF      CLR	R31
    011C 0FE8      ADD	R30,R24
    011D 1FF9      ADC	R31,R25
    011E 8100      LDD	R16,Z+0
    011F DF87      RCALL	_SPI595Out
(0146) 				PORTB = 0xfd;
    0120 EF8D      LDI	R24,0xFD
    0121 BB88      OUT	0x18,R24
(0147) 				DelayMs(1);
    0122 E001      LDI	R16,1
    0123 DF68      RCALL	_DelayMs
(0148) 				PORTB = 0xff;
    0124 EF8F      LDI	R24,0xFF
    0125 BB88      OUT	0x18,R24
(0149) 				temp  = IntCnt%10;
    0126 E01A      LDI	R17,0xA
    0127 91000060  LDS	R16,IntCnt
    0129 940E0148  CALL	mod8u
    012B 2F40      MOV	R20,R16
(0150) 				SPI595Out(disp[temp]);
    012C E681      LDI	R24,0x61
    012D E090      LDI	R25,0
    012E 2FE4      MOV	R30,R20
    012F 27FF      CLR	R31
    0130 0FE8      ADD	R30,R24
    0131 1FF9      ADC	R31,R25
    0132 8100      LDD	R16,Z+0
    0133 DF73      RCALL	_SPI595Out
(0151) 				PORTB = 0xfe;
    0134 EF8E      LDI	R24,0xFE
    0135 BB88      OUT	0x18,R24
(0152) 			}
(0153) 		}
    0136 C00D      RJMP	0x0144
(0154) 		else
(0155) 		{
(0156) 		 	DDRB  = 0xff;
    0137 EF8F      LDI	R24,0xFF
    0138 BB87      OUT	0x17,R24
(0157) 			PORTB = 0xfe;
    0139 EF8E      LDI	R24,0xFE
    013A BB88      OUT	0x18,R24
(0158) 		 	SPI595Out(disp[IntCnt]);
    013B E681      LDI	R24,0x61
    013C E090      LDI	R25,0
    013D 91E00060  LDS	R30,IntCnt
    013F 27FF      CLR	R31
    0140 0FE8      ADD	R30,R24
    0141 1FF9      ADC	R31,R25
    0142 8100      LDD	R16,Z+0
    0143 DF63      RCALL	_SPI595Out
(0159) 		}
(0160) 		DelayMs(1);
FILE: <library>
    0144 E001      LDI	R16,1
    0145 DF46      RCALL	_DelayMs
    0146 CF80      RJMP	0x00C7
    0147 9508      RET
mod8u:
    0148 9468      BSET	6
    0149 C001      RJMP	xdiv8u
div8u:
    014A 94E8      BCLR	6
xdiv8u:
    014B 932A      ST	R18,-Y
    014C 92FA      ST	R15,-Y
    014D 92EA      ST	R14,-Y
    014E 24FF      CLR	R15
    014F 24EE      CLR	R14
    0150 E120      LDI	R18,0x10
    0151 0F00      LSL	R16
    0152 1CFF      ROL	R15
    0153 1CEE      ROL	R14
    0154 16E1      CP	R14,R17
    0155 F010      BCS	0x0158
    0156 1AE1      SUB	R14,R17
    0157 9503      INC	R16
    0158 952A      DEC	R18
    0159 F7B9      BNE	0x0151
    015A F40E      BRTC	0x015C
    015B 2D0E      MOV	R16,R14
    015C 90E9      LD	R14,Y+
    015D 90F9      LD	R15,Y+
    015E 9129      LD	R18,Y+
    015F 9508      RET
push_gset5:
    0160 92FA      ST	R15,-Y
    0161 92EA      ST	R14,-Y
push_gset4:
    0162 92DA      ST	R13,-Y
    0163 92CA      ST	R12,-Y
push_gset3:
    0164 92BA      ST	R11,-Y
    0165 92AA      ST	R10,-Y
push_gset2:
    0166 937A      ST	R23,-Y
    0167 936A      ST	R22,-Y
push_gset1:
    0168 935A      ST	R21,-Y
    0169 934A      ST	R20,-Y
    016A 9508      RET
pop_gset1:
    016B E0E1      LDI	R30,1
pop:
    016C 9149      LD	R20,Y+
    016D 9159      LD	R21,Y+
    016E FDE0      SBRC	R30,0
    016F 9508      RET
    0170 9169      LD	R22,Y+
    0171 9179      LD	R23,Y+
    0172 FDE1      SBRC	R30,1
    0173 9508      RET
    0174 90A9      LD	R10,Y+
    0175 90B9      LD	R11,Y+
    0176 FDE2      SBRC	R30,2
    0177 9508      RET
    0178 90C9      LD	R12,Y+
    0179 90D9      LD	R13,Y+
    017A FDE3      SBRC	R30,3
    017B 9508      RET
    017C 90E9      LD	R14,Y+
    017D 90F9      LD	R15,Y+
    017E 9508      RET

⌨️ 快捷键说明

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