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

📄 m16int.s

📁 本程序是AVR系列单片机的外部中断程序,中断实验,LED数码管显示中断数据,按键按下计数,数码管显示计数结果
💻 S
字号:
	.module M16Int.c
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.dbfile F:\job\M16学习板\中断实验(实验五)\..\ICC_H\SOFTWARE.h
	.dbfunc e ChangeIntToHex _ChangeIntToHex fV
;            dec -> R20,R21
	.even
_ChangeIntToHex::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 136
; /*******************************************************************
;                       实验五
; 实验名称: 中断实验,LED数码管显示中断数据
; 实验目的: 学习AVR单片机的中断功能
; 实验现象: 按键按下计数,数码管显示计数结果
; 环	  境: ICCAVR6.31A
; 设 计 者: shinea8868
; 说    明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
; 	  	  作商业用途请保留本段文字
; 完成日期: 2007年4月9日
; *******************************************************************/
; 
; #include <iom16v.h>
; #include <macros.h>
; #include "..\ICC_H\SOFTWARE.h"
; 
; 
; uchar IntCnt = 0;			  //记录中断次数
; uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
; 
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
;  	IntCnt++;
; }
; /*-----------------------------------------------------------------
;     延时程序计算方法
; 	计数个数j = 延时时间/6*晶振频率 - 1
; 函数名称: void DelayMs(uchar i)
; 函数功能: 毫秒延时
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void DelayMs(uchar i)
; {
;  	uchar j;
; 	while(i--)
; 	{
; 	 	j = 167;//1mhz 1ms延时
; 	    while(j--);
; 	}
; }
; 
; /*-----------------------------------------------------------------
; 函数名称: void SPIMasterInit(void) 
; 函数功能: SPI初始化为主机
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPIMasterInit(void) 
; {
; // 	MOSI,MISO,SCK等都需要设计的数据方向定义
; 	DDRB |= (1<<PB5) | (1<<PB7);		// 设置MOSI 和SCK 为输出,其他为输入 M16
; //	DDRB |= (1<<PB2) | (1<<PB3);		// 设置MOSI 和SCK 为输出,其他为输入 M64
; //	SPI控制寄存器
; //	SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
; //	SPIE  中断使能  SPE SPI使能 DORD 数据次序 1为LSB首先发送,0为MSB首先发送
; //	MSTR  主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
; //  SS配置为输入,但被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新设置
; //	MSTR 进入主机模式。
; //	CPOL: 时钟极性见ATMEGA16L(中文)P130
; //	CPHA: 时钟相位
; //	SPR1, SPR0: SPI 时钟速率选择1 与0  SPR1 和SPR0 对从机没有影响。
; //  使能SPI 主机模式,设置时钟速率为fck/128 */
; 	SPCR  = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);		
; }
; /*-----------------------------------------------------------------
; 函数名称: void SPIMasterTransmit(unsigned char i) 
; 函数功能: SPI数据发送
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPIMasterTransmit(uchar TranData) 
; {	
; 	SPDR = TranData;					// 启动数据传输 
; 	while (!(SPSR & (1<<SPIF)));		// 等待传输结束 
; }
; /*-----------------------------------------------------------------
; 函数名称: void SPI595Out(unsigned char i)  
; 函数功能: 通过74HC595输出数据
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPI595Out(unsigned char i) 
; {
; 	PORTB &= ~(1 << 4);					//准备锁存
; 	SPIMasterTransmit(i);
; 	PORTB |= (1 << 4);					//锁存数据
; }
; /*-----------------------------------------------------------------
; 函数名称: void InitDevices(void) 
; 函数功能: 初始化各种信息
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void InitDevices(void)
; {
;   	CLI(); 			   					//关全部中断
; 	SPIMasterInit();   					//SPI初始化为主机
; 	
;  	MCUCR = 0x02;	   					//中断0,下降沿触发
;  	GICR  = 0x40;	   					//开中断0,
;  	SEI(); 		 	   					//开中断
; }
; 
; void main(void) 
; {
;  	uchar temp;
; 	DDRA = 0x00;						//方向输入
; 	PORTA = 0xFF;						//打开上拉
; 	DDRB = 0xFF;						//方向输出
; 	PORTB = 0xF0;						//电平设置
; 	DDRC = 0x00;
; 	PORTC = 0xFF;
; 	DDRD = 0xFF;
; 	PORTD = 0xFF;
; 	InitDevices();
; 	while (1) 
; 	{
; 		if( IntCnt > 9)
; 		{
; 		 	if( IntCnt > 99)
; 			{
; 			 	DDRB  = 0xff;
; 				PORTB = 0xff;
; 				temp  = IntCnt / 100;
; 		 		SPI595Out(disp[temp]);
; 				PORTB = 0xfb;
; 				DelayMs(1);
; 				PORTB = 0xff;
; 				temp  = IntCnt%100/10;
; 				SPI595Out(disp[temp]);
; 				PORTB = 0xfd;
; 				DelayMs(1);
; 				PORTB = 0xff;
; 				temp  = IntCnt%10;
	.dbline 137
; 				SPI595Out(disp[temp]);
	movw R30,R20
	ldd R2,z+0
	clr R3
	ldi R17,10
	mov R16,R2
	xcall mod8u
	mov R4,R16
	ldi R17,10
	mov R16,R2
	xcall div8u
	mov R24,R16
	andi R24,#0x0F
	swap R24
	or R24,R4
	movw R30,R20
	std z+0,R24
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r dec 20 pc
	.dbend
	.dbfunc e ChangeHexToInt _ChangeHexToInt fV
;            hex -> R16,R17
	.even
_ChangeHexToInt::
	.dbline -1
	.dbline 166
; 				PORTB = 0xfe;
; 			}
; 			else
; 			{
; 			 	DDRB  = 0xff;
; 				PORTB = 0xff;
; 				temp  = IntCnt/10;
; 			 	SPI595Out(disp[temp]);
; 				PORTB = 0xfd;
; 				DelayMs(1);
; 				PORTB = 0xff;
; 				temp  = IntCnt%10;
; 				SPI595Out(disp[temp]);
; 				PORTB = 0xfe;
; 			}
; 		}
; 		else
; 		{
; 		 	DDRB  = 0xff;
; 			PORTB = 0xfe;
; 		 	SPI595Out(disp[IntCnt]);
; 		}
; 		DelayMs(1);
; 	}
; }
; 
; 
; 
; 
	.dbline 167
; 
	movw R30,R16
	ldd R2,z+0
	clr R3
	mov R24,R2
	swap R24
	andi R24,#0x0F
	ldi R25,10
	mul R25,R24
	mov R24,R2
	andi R24,15
	mov R2,R0
	add R2,R24
	std z+0,R2
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r hex 16 pc
	.dbend
	.dbfunc e Delay _Delay fV
;              i -> R16
	.even
_Delay::
	.dbline -1
	.dbline 180
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
	.dbline 182
; 
; 
	ldi R16,200
L4:
	.dbline 183
L5:
	.dbline 183
; 
	mov R2,R16
	clr R3
	subi R16,1
	tst R2
	brne L4
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\..\ICC_H\SOFTWARE.h
_IntCnt::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\..\ICC_H\SOFTWARE.h
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.dbsym e IntCnt _IntCnt c
_disp::
	.blkb 2
	.area idata
	.byte 192,249
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.blkb 2
	.area idata
	.byte 164,176
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.blkb 2
	.area idata
	.byte 153,146
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.blkb 2
	.area idata
	.byte 130,248
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.blkb 2
	.area idata
	.byte 128,144
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.dbsym e disp _disp A[10:10]c
	.area vector(rom, abs)
	.org 4
	jmp _int0_isr
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
	.dbfunc e int0_isr _int0_isr fV
	.even
_int0_isr::
	st -y,R24
	st -y,R25
	in R24,0x3f
	st -y,R24
	.dbline -1
	.dbline 23
	.dbline 24
	lds R24,_IntCnt
	subi R24,255    ; addi 1
	sts _IntCnt,R24
	.dbline -2
L7:
	ld R24,y+
	out 0x3f,R24
	ld R25,y+
	ld R24,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e DelayMs _DelayMs fV
;              j -> R20
;              i -> R16
	.even
_DelayMs::
	xcall push_gset1
	.dbline -1
	.dbline 35
	xjmp L10
L9:
	.dbline 38
	.dbline 39
	ldi R20,167
L12:
	.dbline 40
L13:
	.dbline 40
	mov R2,R20
	clr R3
	subi R20,1
	tst R2
	brne L12
	.dbline 41
L10:
	.dbline 37
	mov R2,R16
	clr R3
	subi R16,1
	tst R2
	brne L9
	.dbline -2
L8:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r i 16 c
	.dbend
	.dbfunc e SPIMasterInit _SPIMasterInit fV
	.even
_SPIMasterInit::
	.dbline -1
	.dbline 51
	.dbline 53
	in R24,0x17
	ori R24,160
	out 0x17,R24
	.dbline 65
	ldi R24,83
	out 0xd,R24
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SPIMasterTransmit _SPIMasterTransmit fV
;       TranData -> R16
	.even
_SPIMasterTransmit::
	.dbline -1
	.dbline 74
	.dbline 75
	out 0xf,R16
L17:
	.dbline 76
L18:
	.dbline 76
	sbis 0xe,7
	rjmp L17
	.dbline -2
L16:
	.dbline 0 ; func end
	ret
	.dbsym r TranData 16 c
	.dbend
	.dbfunc e SPI595Out _SPI595Out fV
;              i -> R20
	.even
_SPI595Out::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 85
	.dbline 86
	cbi 0x18,4
	.dbline 87
	mov R16,R20
	xcall _SPIMasterTransmit
	.dbline 88
	sbi 0x18,4
	.dbline -2
L20:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e InitDevices _InitDevices fV
	.even
_InitDevices::
	.dbline -1
	.dbline 97
	.dbline 98
	cli
	.dbline 99
	xcall _SPIMasterInit
	.dbline 101
	ldi R24,2
	out 0x35,R24
	.dbline 102
	ldi R24,64
	out 0x3b,R24
	.dbline 103
	sei
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;           temp -> R20
	.even
_main::
	.dbline -1
	.dbline 107
	.dbline 109
	clr R2
	out 0x1a,R2
	.dbline 110
	ldi R24,255
	out 0x1b,R24
	.dbline 111
	out 0x17,R24
	.dbline 112
	ldi R24,240
	out 0x18,R24
	.dbline 113
	out 0x14,R2
	.dbline 114
	ldi R24,255
	out 0x15,R24
	.dbline 115
	out 0x11,R24
	.dbline 116
	out 0x12,R24
	.dbline 117
	xcall _InitDevices
	xjmp L24
L23:
	.dbline 119
	.dbline 120
	ldi R24,9
	lds R2,_IntCnt
	cp R24,R2
	brlo X1
	xjmp L26
X1:
	.dbline 121
	.dbline 122
	ldi R24,99
	cp R24,R2
	brlo X2
	xjmp L28
X2:
	.dbline 123
	.dbline 124
	ldi R24,255
	out 0x17,R24
	.dbline 125
	out 0x18,R24
	.dbline 126
	ldi R17,100
	mov R16,R2
	xcall div8u
	mov R20,R16
	.dbline 127
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 128
	ldi R24,251
	out 0x18,R24
	.dbline 129
	ldi R16,1
	xcall _DelayMs
	.dbline 130
	ldi R24,255
	out 0x18,R24
	.dbline 131
	ldi R17,100
	lds R16,_IntCnt
	xcall mod8u
	ldi R17,10
	xcall div8u
	mov R20,R16
	.dbline 132
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 133
	ldi R24,253
	out 0x18,R24
	.dbline 134
	ldi R16,1
	xcall _DelayMs
	.dbline 135
	ldi R24,255
	out 0x18,R24
	.dbline 136
	ldi R17,10
	lds R16,_IntCnt
	xcall mod8u
	mov R20,R16
	.dbline 137
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 138
	ldi R24,254
	out 0x18,R24
	.dbline 139
	xjmp L27
L28:
	.dbline 141
	.dbline 142
	ldi R24,255
	out 0x17,R24
	.dbline 143
	out 0x18,R24
	.dbline 144
	ldi R17,10
	lds R16,_IntCnt
	xcall div8u
	mov R20,R16
	.dbline 145
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 146
	ldi R24,253
	out 0x18,R24
	.dbline 147
	ldi R16,1
	xcall _DelayMs
	.dbline 148
	ldi R24,255
	out 0x18,R24
	.dbline 149
	ldi R17,10
	lds R16,_IntCnt
	xcall mod8u
	mov R20,R16
	.dbline 150
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 151
	ldi R24,254
	out 0x18,R24
	.dbline 152
	.dbline 153
	xjmp L27
L26:
	.dbline 155
	.dbline 156
	ldi R24,255
	out 0x17,R24
	.dbline 157
	ldi R24,254
	out 0x18,R24
	.dbline 158
	ldi R24,<_disp
	ldi R25,>_disp
	lds R30,_IntCnt
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 159
L27:
	.dbline 160
	ldi R16,1
	xcall _DelayMs
	.dbline 161
L24:
	.dbline 118
	xjmp L23
X0:
	.dbline -2
L22:
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbend

⌨️ 快捷键说明

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