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

📄 m16wdt.s

📁 AVR程序
💻 S
字号:
	.module M16WDT.c
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.dbfile F:\job\M16学习板\WDT(实验十二)\..\ICC_H\SOFTWARE.h
	.dbfunc e ChangeIntToHex _ChangeIntToHex fV
;            dec -> R20,R21
	.even
_ChangeIntToHex::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 136
; /*******************************************************************
;                       实验十二
; 实验名称: 看门狗实验
; 实验目的: 学习AVR单片机的看门狗的功能
; 实验现象: 如果屏蔽喂狗程序,则数码管显示值不会加
; 环	  境: ICCAVR6.31A
; 设 计 者: shinea8868
; 说    明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
; 	  	  作商业用途请保留本段文字
; 完成日期: 2007年4月10日
; *******************************************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include "..\ICC_H\SOFTWARE.h"
; 
; uchar TimerCnt = 0;						//定时器1计数个数
; uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
; 
; /*-----------------------------------------------------------------
;     延时程序计算方法
; 	计数个数j = 延时时间/6*晶振频率 - 1
; 函数名称: void DelayMs(uchar i)
; 函数功能: 毫秒延时
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void DelayMs(uchar i)
; {
;  	uchar j;
; 	while(i--)
; 	{
; 	 	j = 167;//1mhz 1ms延时
; 	    while(j--);
; 	}
; }
; /*-----------------------------------------------------------------
; 函数名称: void WdtInit(void)
; 函数功能: 看门狗初始化程序 
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void WdtInit(void)
; {
; 	WDR();					//clr wdt
; 	WDTCR = 0x0F;			//enable wdt,clk = 2048,2.1S
; } 
; /*-----------------------------------------------------------------
; 函数名称: 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 Timer1Init(void)
; 函数功能: 定时器1初始化  256预分频 定时一秒 
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void Timer1Init(void)
; {
;  	TCCR1B = 0x00; 	 			  //关定时器
;  	TCNT1H = 0xF0; 				  //设置定时初值
;  	TCNT1L = 0xBE;
;  	OCR1AH = 0x0F;
;  	OCR1AL = 0x42;
;  	OCR1BH = 0x0F;
;  	OCR1BL = 0x42;
;  	ICR1H  = 0x0F;
;  	ICR1L  = 0x42;
;  	TCCR1A = 0x00;
;  	TCCR1B = 0x04; 		  		  //开始计数
; }
; 
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void)
; {
;  	TCNT1H = 0xF0; 		  		  //重新装载计数值
;  	TCNT1L = 0xBE; 
;  	TimerCnt++;
; }
; /*-----------------------------------------------------------------
; 函数名称: void InitDevices(void) 
; 函数功能: 初始化各种信息
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void InitDevices(void)
; {
;   	CLI();
; 	WdtInit(); 			   					//关全部中断
; 	SPIMasterInit();   					//SPI初始化为主机
;  	Timer1Init();
; 	WdtInit();
; 	
;  	TIMSK = 0x04; 				  		 //timer interrupt sources
;  	SEI(); 		 	   					 //开中断
	.dbline 137
; }
	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
; 
; 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( TimerCnt > 9)
; 		{
; 		 	if( TimerCnt > 99)
; 			{
; 			 	DDRB  = 0xff;
; 				PORTB = 0xff;
; 				temp  = TimerCnt / 100;
; 		 		SPI595Out(disp[temp]);
; 				PORTB = 0xfb;
; 				DelayMs(1);
; 				PORTB = 0xff;
; 				temp  = TimerCnt%100/10;
; 				SPI595Out(disp[temp]);
	.dbline 167
; 				PORTB = 0xfd;
	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
; 				DelayMs(1);
; 				PORTB = 0xff;
; 				temp  = TimerCnt%10;
; 				SPI595Out(disp[temp]);
; 				PORTB = 0xfe;
; 			}
; 			
; 			else
; 			{
; 			 	DDRB  = 0xff;
; 				PORTB = 0xff;
; 				temp  = TimerCnt/10;
; 			 	SPI595Out(disp[temp]);
	.dbline 182
; 				PORTB = 0xfd;
; 				DelayMs(1);
	ldi R16,200
L4:
	.dbline 183
L5:
	.dbline 183
; 				PORTB = 0xff;
	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学习板\WDT(实验十二)\..\ICC_H\SOFTWARE.h
_TimerCnt::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\..\ICC_H\SOFTWARE.h
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.dbsym e TimerCnt _TimerCnt c
_disp::
	.blkb 2
	.area idata
	.byte 192,249
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.blkb 2
	.area idata
	.byte 164,176
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.blkb 2
	.area idata
	.byte 153,146
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.blkb 2
	.area idata
	.byte 130,248
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.blkb 2
	.area idata
	.byte 128,144
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.dbsym e disp _disp A[10:10]c
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.dbfunc e DelayMs _DelayMs fV
;              j -> R20
;              i -> R16
	.even
_DelayMs::
	xcall push_gset1
	.dbline -1
	.dbline 28
	xjmp L9
L8:
	.dbline 31
	.dbline 32
	ldi R20,167
L11:
	.dbline 33
L12:
	.dbline 33
	mov R2,R20
	clr R3
	subi R20,1
	tst R2
	brne L11
	.dbline 34
L9:
	.dbline 30
	mov R2,R16
	clr R3
	subi R16,1
	tst R2
	brne L8
	.dbline -2
L7:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r i 16 c
	.dbend
	.dbfunc e WdtInit _WdtInit fV
	.even
_WdtInit::
	.dbline -1
	.dbline 43
	.dbline 44
	wdr
	.dbline 45
	ldi R24,15
	out 0x21,R24
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SPIMasterInit _SPIMasterInit fV
	.even
_SPIMasterInit::
	.dbline -1
	.dbline 54
	.dbline 56
	in R24,0x17
	ori R24,160
	out 0x17,R24
	.dbline 68
	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 77
	.dbline 78
	out 0xf,R16
L17:
	.dbline 79
L18:
	.dbline 79
	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 88
	.dbline 89
	cbi 0x18,4
	.dbline 90
	mov R16,R20
	xcall _SPIMasterTransmit
	.dbline 91
	sbi 0x18,4
	.dbline -2
L20:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e Timer1Init _Timer1Init fV
	.even
_Timer1Init::
	.dbline -1
	.dbline 100
	.dbline 101
	clr R2
	out 0x2e,R2
	.dbline 102
	ldi R24,240
	out 0x2d,R24
	.dbline 103
	ldi R24,190
	out 0x2c,R24
	.dbline 104
	ldi R24,15
	out 0x2b,R24
	.dbline 105
	ldi R24,66
	out 0x2a,R24
	.dbline 106
	ldi R24,15
	out 0x29,R24
	.dbline 107
	ldi R24,66
	out 0x28,R24
	.dbline 108
	ldi R24,15
	out 0x27,R24
	.dbline 109
	ldi R24,66
	out 0x26,R24
	.dbline 110
	out 0x2f,R2
	.dbline 111
	ldi R24,4
	out 0x2e,R24
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 32
	jmp _timer1_ovf_isr
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\WDT(实验十二)\M16WDT.c
	.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
	.even
_timer1_ovf_isr::
	st -y,R24
	st -y,R25
	in R24,0x3f
	st -y,R24
	.dbline -1
	.dbline 116
	.dbline 117
	ldi R24,240
	out 0x2d,R24
	.dbline 118
	ldi R24,190
	out 0x2c,R24
	.dbline 119
	lds R24,_TimerCnt
	subi R24,255    ; addi 1
	sts _TimerCnt,R24
	.dbline -2
L22:
	ld R24,y+
	out 0x3f,R24
	ld R25,y+
	ld R24,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e InitDevices _InitDevices fV
	.even
_InitDevices::
	.dbline -1
	.dbline 128
	.dbline 129
	cli
	.dbline 130
	xcall _WdtInit
	.dbline 131
	xcall _SPIMasterInit
	.dbline 132
	xcall _Timer1Init
	.dbline 133
	xcall _WdtInit
	.dbline 135
	ldi R24,4
	out 0x39,R24
	.dbline 136
	sei
	.dbline -2
L23:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;           temp -> R20
	.even
_main::
	.dbline -1
	.dbline 140
	.dbline 142
	clr R2
	out 0x1a,R2
	.dbline 143
	ldi R24,255
	out 0x1b,R24
	.dbline 144
	out 0x17,R24
	.dbline 145
	ldi R24,240
	out 0x18,R24
	.dbline 146
	out 0x14,R2
	.dbline 147
	ldi R24,255
	out 0x15,R24
	.dbline 148
	out 0x11,R24
	.dbline 149
	out 0x12,R24
	.dbline 150
	xcall _InitDevices
	xjmp L26
L25:
	.dbline 153
	.dbline 154
	ldi R24,9
	lds R2,_TimerCnt
	cp R24,R2
	brlo X1
	xjmp L28
X1:
	.dbline 155
	.dbline 156
	ldi R24,99
	cp R24,R2
	brlo X2
	xjmp L30
X2:
	.dbline 157
	.dbline 158
	ldi R24,255
	out 0x17,R24
	.dbline 159
	out 0x18,R24
	.dbline 160
	ldi R17,100
	mov R16,R2
	xcall div8u
	mov R20,R16
	.dbline 161
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 162
	ldi R24,251
	out 0x18,R24
	.dbline 163
	ldi R16,1
	xcall _DelayMs
	.dbline 164
	ldi R24,255
	out 0x18,R24
	.dbline 165
	ldi R17,100
	lds R16,_TimerCnt
	xcall mod8u
	ldi R17,10
	xcall div8u
	mov R20,R16
	.dbline 166
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 167
	ldi R24,253
	out 0x18,R24
	.dbline 168
	ldi R16,1
	xcall _DelayMs
	.dbline 169
	ldi R24,255
	out 0x18,R24
	.dbline 170
	ldi R17,10
	lds R16,_TimerCnt
	xcall mod8u
	mov R20,R16
	.dbline 171
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 172
	ldi R24,254
	out 0x18,R24
	.dbline 173
	xjmp L29
L30:
	.dbline 176
	.dbline 177
	ldi R24,255
	out 0x17,R24
	.dbline 178
	out 0x18,R24
	.dbline 179
	ldi R17,10
	lds R16,_TimerCnt
	xcall div8u
	mov R20,R16
	.dbline 180
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 181
	ldi R24,253
	out 0x18,R24
	.dbline 182
	ldi R16,1
	xcall _DelayMs
	.dbline 183
	ldi R24,255
	out 0x18,R24
	.dbline 184
; 				temp  = TimerCnt%10;
	ldi R17,10
	lds R16,_TimerCnt
	xcall mod8u
	mov R20,R16
	.dbline 185
; 				SPI595Out(disp[temp]);
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 186
; 				PORTB = 0xfe;
	ldi R24,254
	out 0x18,R24
	.dbline 187
; 			}
	.dbline 188
; 		}
	xjmp L29
L28:
	.dbline 191
; 		
; 		else
; 		{
	.dbline 192
; 		 	DDRB  = 0xff;
	ldi R24,255
	out 0x17,R24
	.dbline 193
; 			PORTB = 0xfe;
	ldi R24,254
	out 0x18,R24
	.dbline 194
; 		 	SPI595Out(disp[TimerCnt]);
	ldi R24,<_disp
	ldi R25,>_disp
	lds R30,_TimerCnt
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 195
; 		}
L29:
	.dbline 196
	ldi R16,1
	xcall _DelayMs
	.dbline 197
	wdr
	.dbline 198
L26:
	.dbline 152
	xjmp L25
X0:
	.dbline -2
L24:
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbend

⌨️ 快捷键说明

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