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

📄 main.s

📁 ATmega16休眠模式的应用:使用程序关闭没有使用的模块
💻 S
字号:
	.module main.c
	.area data(ram, con, rel)
_extint_count::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
	.dbsym e extint_count _extint_count i
_act_flag::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
	.dbsym e act_flag _act_flag c
	.area text(rom, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 26
; #include <iom16v.h>
; #include <macros.h>
; #include "lcd.h"
; #include "usart.h"
; #include "delay.h"
; #define vref   256
; volatile unsigned int extint_count=0;
; volatile unsigned char act_flag=0;
; volatile unsigned int adc_result;
; unsigned char adc_show[6];
; /** /
; volatile:数据类型声明,表明该变量在程序执行中可被隐含改变
; 编译器有时会将SRAM中的数据拷贝到通用寄存器中以提高程序的执行效率
; (在通用寄存器中对数据的操作速度比操作SRAM中的数据要快),这样会带来
; 一个问题,如果该SRAM中的数据已经被隐含改变(比如中断),那么编译器仍然
; 读取寄存器中之前的SRAM拷贝值显然与其实际值不同,从而出现错误。
; 本例中extint_count的值在外部中断服务程序中被改变,通过volatile
; 声明通知编译器。
; /**/
; /** /
; MCUCR &= 0X40;   //将休眠模式清0,即休眠模式1
; 
; MCUCR |= 0X10;  //将休眠模式为1,即休眠模式2
; /**/
; void port_init(void)
; {
	.dbline 27
;  PORTA = 0xFE;
	ldi R24,254
	out 0x1b,R24
	.dbline 28
;  DDRA  = 0xFE;
	out 0x1a,R24
	.dbline 29
;  PORTB = 0xFF;
	ldi R24,255
	out 0x18,R24
	.dbline 30
;  DDRB  = 0xFF;
	out 0x17,R24
	.dbline 31
;  PORTC = 0xFF; 
	out 0x15,R24
	.dbline 32
;  DDRC  = 0xFF;
	out 0x14,R24
	.dbline 33
;  DDRD  = 0xFB;  //PD2(INT0)引脚设置为输入
	ldi R24,251
	out 0x11,R24
	.dbline 34
;  PORTD = 0xFB;  //关闭内部上拉
	out 0x12,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 56
	jmp _adc_isr
	.area text(rom, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
	.dbfunc e adc_isr _adc_isr fV
;           temp -> R16,R17
	.even
_adc_isr::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R17
	st -y,R30
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 39
; }
; /*      AD转换程序     */
; #pragma interrupt_handler adc_isr:15
; void adc_isr(void)
; {
	.dbline 40
;    unsigned int temp=0;
	clr R16
	clr R17
	xjmp L4
L3:
	.dbline 42
	subi R16,255  ; offset = 1
	sbci R17,255
L4:
	.dbline 41
;    while(temp<6)
	cpi R16,6
	ldi R30,0
	cpc R17,R30
	brlo L3
	.dbline 43
;       temp++;                //短延时
;    adc_result = ADC;         //读取AD转换值
	in R2,0x4
	in R3,0x5
	sts _adc_result+1,R3
	sts _adc_result,R2
	.dbline -2
L2:
	ld R2,y+
	out 0x3f,R2
	ld R30,y+
	ld R17,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym r temp 16 i
	.dbend
	.dbfunc e data_con _data_con fV
;              i -> R10
;           temp -> R12,R13
	.even
_data_con::
	xcall push_gset4
	.dbline -1
	.dbline 48
; 	   
;    //ADCSRA |= (1<<ADSC);      //再次启动转换 			 	 		 
; } 
; void data_con(void)
; {
	.dbline 51
;    unsigned int temp;
;    unsigned char i;
;    temp=(unsigned int)(((unsigned long)((unsigned long)adc_result*vref))/1024);
	lds R2,_adc_result
	lds R3,_adc_result+1
	clr R4
	clr R5
	ldi R20,0
	ldi R21,1
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	ldi R24,10
	ldi R25,0
	st -y,R24
	xcall lsr32
	movw R12,R16
	.dbline 52
;    for(i=0;i<3;i++)
	clr R10
	xjmp L10
L7:
	.dbline 53
	.dbline 54
	mov R2,R10
	clr R3
	ldi R30,3
	ldi R31,0
	sub R30,R2
	sbc R31,R3
	ldi R24,<_adc_show
	ldi R25,>_adc_show
	add R30,R24
	adc R31,R25
	ldi R18,10
	ldi R19,0
	movw R16,R12
	xcall mod16u
	movw R24,R16
	adiw R24,48
	std z+0,R24
	.dbline 55
	ldi R18,10
	ldi R19,0
	movw R16,R12
	xcall div16u
	movw R12,R16
	.dbline 56
L8:
	.dbline 52
	inc R10
L10:
	.dbline 52
	mov R24,R10
	cpi R24,3
	brlo L7
	.dbline 57
;    {
; 	  adc_show[3-i]=temp%10+0x30;  //转换电压值用来在LCD上显示
; 	  temp=temp/10;
;    }
; 	adc_show[0]=adc_show[1];
	lds R2,_adc_show+1
	sts _adc_show,R2
	.dbline 58
; 	adc_show[1]='.';	
	ldi R24,46
	sts _adc_show+1,R24
	.dbline 59
; 	adc_show[4]='V';	
	ldi R24,86
	sts _adc_show+4,R24
	.dbline 60
; 	adc_show[5]=0;	              //数组结束标记
	clr R2
	sts _adc_show+5,R2
	.dbline -2
L6:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 c
	.dbsym r temp 12 i
	.dbend
	.area vector(rom, abs)
	.org 4
	jmp _int0_isr
	.area text(rom, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.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 65
	.dbline 66
	lds R24,_extint_count
	lds R25,_extint_count+1
	adiw R24,1
	sts _extint_count+1,R25
	sts _extint_count,R24
	.dbline 67
	lds R24,_act_flag
	cpi R24,1
	breq L16
	.dbline 68
	.dbline 69
	ldi R24,1
	sts _act_flag,R24
	.dbline 70
L16:
	.dbline -2
L15:
	ld R24,y+
	out 0x3f,R24
	ld R25,y+
	ld R24,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 73
; }
; 
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
;    extint_count++;
;    if (act_flag!=1)
;    {
;       act_flag = 1;
;    }
; }
; void adc_init(void)
; {
	.dbline 74
;    ADMUX = (1<<REFS1)|
	ldi R24,192
	out 0x7,R24
	.dbline 78
;            (1<<REFS0)|    //选择内部2.56v作为参考电压
;            0x00;          //使用ad转换0通道
; 		                  //ADLAR = 0,转换结果选择右对齐
;    ADCSRA = //(1<<ADEN)|     //ADC使能
	ldi R24,30
	out 0x6,R24
	.dbline -2
L18:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e sleep_init _sleep_init fV
	.even
_sleep_init::
	.dbline -1
	.dbline 85
;             //(1<<ADSC)|     //开始一次ad转换
; 		    (1<<ADIF)|     //写1,将ADIF位清0
; 		    (1<<ADIE)|     //允许ADC中断
; 		    0x06;          //时钟分频系数为64
; }
; void sleep_init(void)
; {
	.dbline 86
;    MCUCR |= 0X40;  //使能休眠
	in R24,0x35
	ori R24,64
	out 0x35,R24
	.dbline -2
L19:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 90
; }
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
	.dbline 91
;  CLI();         //关闭全局中断
	cli
	.dbline 92
;  port_init();   //CPU端口初始化
	xcall _port_init
	.dbline 98
;  /** /
;  MCUCR = 0x02;  //INT0引脚上的下降沿触发中断
;  GICR  = 0x40;  //外部中断0请求使能
;  /**/
;  /**/
;   MCUCR = 0x00;  //INT0引脚上的低电平触发中断
	clr R2
	out 0x35,R2
	.dbline 99
;   GICR  = 0x40;  //外部中断0请求使能
	ldi R24,64
	out 0x3b,R24
	.dbline 109
;  /**/
;  /** /
;   MCUCR = 0x01;  //INT0引脚上的上升沿和下降沿都触发中断
;   GICR  = 0x40;  //外部中断0请求使能
;  /**/
;  /** /
;   MCUCR = 0x03;  //INT0引脚上的上升沿触发中断
;   GICR  = 0x40;  //外部中断0请求使能
;  /**/
;  adc_init();
	xcall _adc_init
	.dbline 110
;  sleep_init();
	xcall _sleep_init
	.dbline 111
;  SEI(); //打开全局中断
	sei
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;           temp -> <dead>
;      temp_show -> y+2
;              i -> R20
	.even
_main::
	sbiw R28,7
	.dbline -1
	.dbline 115
;  
; }
; void main(void)
; {
	.dbline 119
;    char temp_show[5];  //定义数组用作在液晶屏上进行显示
;    unsigned char i;
;    unsigned int temp;
;    for(i=0;i<5;i++)
	clr R20
	xjmp L25
L22:
	.dbline 120
	.dbline 121
	movw R24,R28
	adiw R24,2
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 122
L23:
	.dbline 119
	inc R20
L25:
	.dbline 119
	cpi R20,5
	brlo L22
	.dbline 123
;    {
;       temp_show[i] = 0;
;    }
;    temp_show[4] = 0xff;  //显示结束标志
	ldi R24,255
	std y+6,R24
	.dbline 125
;    /**/
;    init_devices();
	xcall _init_devices
	.dbline 126
;    LCDReady();
	xcall _LCDReady
	.dbline 127
;    LcdInit();          //LCD初始化
	xcall _LcdInit
	.dbline 128
;    CharsWrite(0,1,"SYSTEM INIT");  //在LCD的第一行显示"SYSTEM INIT"
	ldi R24,<L27
	ldi R25,>L27
	std y+1,R25
	std y+0,R24
	ldi R18,1
	clr R16
	xcall _CharsWrite
	.dbline 129
;    CharsWrite(0,2,"......");            //在第二行显示“......”
	ldi R24,<L28
	ldi R25,>L28
	std y+1,R25
	std y+0,R24
	ldi R18,2
	clr R16
	xcall _CharsWrite
	.dbline 130
;    uart_init();        //串口初始化
	xcall _uart_init
	.dbline 131
;    delay_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _delay_ms
	xjmp L30
L29:
	.dbline 134
	.dbline 135
	xcall _ClearLcd
	.dbline 136
	ldi R16,80
	ldi R17,0
	xcall _delay_us
	.dbline 137
	ldi R24,<L32
	ldi R25,>L32
	std y+1,R25
	std y+0,R24
	ldi R18,1
	clr R16
	xcall _CharsWrite
	.dbline 138
	in R24,0x35
	andi R24,64
	out 0x35,R24
	.dbline 139
	sleep
	.dbline 141
	clr R2
	out 0x1b,R2
	.dbline 142
	ldi R24,<L33
	ldi R25,>L33
	std y+1,R25
	std y+0,R24
	ldi R18,2
	clr R16
	xcall _CharsWrite
	.dbline 143
	ldi R16,5000
	ldi R17,19
	xcall _delay_ms
	.dbline 144
	ldi R24,255
	out 0x1b,R24
	.dbline 148
	xcall _ClearLcd
	.dbline 149
	ldi R16,80
	ldi R17,0
	xcall _delay_us
	.dbline 150
	sbi 0x6,7
	.dbline 151
	ldi R24,<L34
	ldi R25,>L34
	std y+1,R25
	std y+0,R24
	ldi R18,1
	clr R16
	xcall _CharsWrite
	.dbline 152
	in R24,0x35
	andi R24,64
	out 0x35,R24
	.dbline 153
	in R24,0x35
	ori R24,16
	out 0x35,R24
	.dbline 154
	sleep
	.dbline 156
	clr R2
	out 0x1b,R2
	.dbline 157
	ldi R24,<L33
	ldi R25,>L33
	std y+1,R25
	std y+0,R24
	ldi R18,2
	clr R16
	xcall _CharsWrite
	.dbline 158
	ldi R16,5000
	ldi R17,19
	xcall _delay_ms
	.dbline 159
	xcall _data_con
	.dbline 160
	xcall _ClearLcd
	.dbline 161
	ldi R16,80
	ldi R17,0
	xcall _delay_us
	.dbline 162
	ldi R24,<L35
	ldi R25,>L35
	std y+1,R25
	std y+0,R24
	ldi R18,1
	clr R16
	xcall _CharsWrite
	.dbline 163
	ldi R24,<_adc_show
	ldi R25,>_adc_show
	std y+1,R25
	std y+0,R24
	ldi R18,2
	clr R16
	xcall _CharsWrite
	.dbline 164
	ldi R16,5000
	ldi R17,19
	xcall _delay_ms
	.dbline 165
	ldi R24,255
	out 0x1b,R24
	.dbline 166
	cbi 0x6,7
	.dbline 168
	xcall _ClearLcd
	.dbline 169
	ldi R16,80
	ldi R17,0
	xcall _delay_us
	.dbline 170
	ldi R24,<L36
	ldi R25,>L36
	std y+1,R25
	std y+0,R24
	ldi R18,1
	clr R16
	xcall _CharsWrite
	.dbline 171
	in R24,0x35
	andi R24,64
	out 0x35,R24
	.dbline 172
	in R24,0x35
	ori R24,32
	out 0x35,R24
	.dbline 173
	sleep
	.dbline 175
	clr R2
	out 0x1b,R2
	.dbline 176
	ldi R24,<L33
	ldi R25,>L33
	std y+1,R25
	std y+0,R24
	ldi R18,2
	clr R16
	xcall _CharsWrite
	.dbline 177
	ldi R16,5000
	ldi R17,19
	xcall _delay_ms
	.dbline 178
	ldi R24,255
	out 0x1b,R24
	.dbline 179
L30:
	.dbline 133
	xjmp L29
X0:
	.dbline -2
L21:
	adiw R28,7
	.dbline 0 ; func end
	ret
	.dbsym l temp 3 i
	.dbsym l temp_show 2 A[5:5]c
	.dbsym r i 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
_adc_show::
	.blkb 6
	.dbsym e adc_show _adc_show A[6:6]c
_adc_result::
	.blkb 2
	.dbsym e adc_result _adc_result i
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
L36:
	.blkb 15
	.area idata
	.byte 'P,'O,'W,'E,'R,'D,'O,'W,'N,32,'M,'O,'D,'E,0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
L35:
	.blkb 13
	.area idata
	.byte 'A,'D,'O,32,'V,'O,'L,'T,'A,'G,'E,58,0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
L34:
	.blkb 14
	.area idata
	.byte 'S,'L,'E,'E,'P,32,'I,'N,32,'A,'D,'C,58,0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
L33:
	.blkb 15
	.area idata
	.byte 'N,'O,'W,32,'M,'C,'U,32,'W,'A,'K,'E,'U,'P,0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
L32:
	.blkb 14
	.area idata
	.byte 'S,'L,'E,'E,'P,32,'I,'N,32,'I,'D,'L,'E,0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
L28:
	.blkb 7
	.area idata
	.byte 46,46,46,46,46,46,0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c
L27:
	.blkb 12
	.area idata
	.byte 'S,'Y,'S,'T,'E,'M,32,'I,'N,'I,'T,0
	.area data(ram, con, rel)
	.dbfile F:\radio\第十二篇\sleep\main.c

⌨️ 快捷键说明

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