📄 main.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 + -