📄 lesson10.s
字号:
.module lesson10.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\zhanghanyu\桌面\ICC\chengxu10\lesson10\lesson10.c
.area vector(rom, abs)
.org 36
rjmp _uart_rx
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\zhanghanyu\桌面\ICC\chengxu10\lesson10\lesson10.c
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\zhanghanyu\桌面\ICC\chengxu10\lesson10\lesson10.c
_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\zhanghanyu\桌面\ICC\chengxu10\lesson10\lesson10.c
.dbsym e flag _flag c
_Data_Len::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\zhanghanyu\桌面\ICC\chengxu10\lesson10\lesson10.c
.dbsym e Data_Len _Data_Len c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\zhanghanyu\桌面\ICC\chengxu10\lesson10\lesson10.c
.dbfunc e delay _delay fV
; i -> R20,R21
; j -> R22,R23
; ms -> R16,R17
.even
_delay::
rcall push_xgsetF000
.dbline -1
.dbline 16
; #include <iom88v.h>
; #include <macros.h>
; #define uchar unsigned char
; #define uint unsigned int
;
; //晶振 7.3728MHZ
; #define mclk 7372800
; // #pragma interrupt_handler uart_rx:12
; #pragma interrupt_handler uart_rx:iv_USART0_RXC
; uchar rdata,flag=0;
; uchar Rec_Data[27];
; uchar Data_Len =0,i;
; uchar adcL,adcH;
; uint adresult;
; void delay(uint ms) //延时函数
; {
.dbline 18
; uint i,j;
; for(i=0;i<ms;i++)
clr R20
clr R21
rjmp L5
L2:
.dbline 19
; {
.dbline 20
; for(j=0;j<1100;j++);
clr R22
clr R23
rjmp L9
L6:
.dbline 20
L7:
.dbline 20
subi R22,255 ; offset = 1
sbci R23,255
L9:
.dbline 20
cpi R22,76
ldi R30,4
cpc R23,R30
brlo L6
X0:
.dbline 21
; }
L3:
.dbline 18
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 18
cp R20,R16
cpc R21,R17
brlo L2
X1:
.dbline -2
L1:
.dbline 0 ; func end
rjmp pop_xgsetF000
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r ms 16 i
.dbend
.dbfunc e uart_init _uart_init fV
; baud -> R10,R11
.even
_uart_init::
rcall push_xgsetF00C
movw R10,R16
.dbline -1
.dbline 27
; }
;
; //0D 0A 3E 0D 0A 52 65 61 64 20 46 77 64 20 33 3E 0D 0A 20 39 33 31 36 37 3F 20 20
; //0D 0A 3E 0D 0A 52 65 61 64 20 46 6C 6F 77 20 31 3E 0D 0A 20 35 34 2E 39 32 30 3F 20 20
; void uart_init(uint baud) //串口初始化
; {
.dbline 29
;
; UCSR0B=0x00;
clr R2
sts 193,R2
.dbline 30
; UCSR0A=0x00; //控制寄存器清零
sts 192,R2
.dbline 31
; UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);
ldi R24,6
sts 194,R24
.dbline 34
; //选择UCSRC,异步模式,禁止
; // 校验,1位停止位,8位数据位
; baud=mclk/16/baud-1 ; //波特率最大为65K
movw R2,R10
clr R4
clr R5
ldi R20,0
ldi R21,8
ldi R22,7
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
rcall div32s
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R2,R16
movw R4,R18
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R10,R2
.dbline 35
; UBRR0L=baud;
sts 196,R10
.dbline 36
; UBRR0H=baud>>8; //设置波特率
mov R2,R3
clr R3
sts 197,R2
.dbline 37
; UCSR0B=(1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0);
ldi R24,152
sts 193,R24
.dbline 39
; //接收、发送使能,接收中断使能
; SREG=BIT(7); //全局中断开放
ldi R24,128
out 0x3f,R24
.dbline 40
; DDRD|=0X02; //配置TX为输出(很重要)
sbi 0xa,1
.dbline -2
L10:
.dbline 0 ; func end
rjmp pop_xgsetF00C
.dbsym r baud 10 i
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 45
;
; }
;
; void adc_init(void)
; {
.dbline 46
; ADCSRA = 0x00; //disable adc
clr R2
sts 122,R2
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e uart_sendB _uart_sendB fV
; data -> R16
.even
_uart_sendB::
.dbline -1
.dbline 50
; //ADMUX = 0x46; //选择AVCC为参考,采集电压右对齐,1110 1.1V
; }
; void uart_sendB(uchar data) //发送字符
; {
L13:
.dbline 51
; while(!(UCSR0A&(BIT(UDRE0)))) ;
L14:
.dbline 51
lds R2,192
sbrs R2,5
rjmp L13
X2:
.dbline 52
; UDR0=data;
sts 198,R16
L16:
.dbline 53
; while(!(UCSR0A&(BIT(TXC0))));
L17:
.dbline 53
lds R2,192
sbrs R2,6
rjmp L16
X3:
.dbline 54
; UCSR0A|=BIT(TXC0);
lds R24,192
ori R24,64
sts 192,R24
.dbline -2
L12:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbend
.dbfunc e uart_rx _uart_rx fV
.even
_uart_rx::
st -y,R2
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 57
; }
; void uart_rx() //接收字符
; {
.dbline 58
; UCSR0B&=~BIT(RXCIE0);
lds R24,193
andi R24,127
sts 193,R24
.dbline 59
; rdata=UDR0;
lds R2,198
sts _rdata,R2
.dbline 61
; //flag=1;
; Data_Len++;
lds R24,_Data_Len
subi R24,255 ; addi 1
sts _Data_Len,R24
.dbline 62
; UCSR0B|=BIT(RXCIE0);
lds R24,193
ori R24,128
sts 193,R24
.dbline -2
L19:
.dbline 0 ; func end
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R2,y+
reti
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 65
; }
; void main()
; {
.dbline 68
; //uchar i=4;
; //uchar j='a';
; uart_init(4800); //初始化串口
ldi R16,4800
ldi R17,18
rcall _uart_init
.dbline 70
;
; adc_init(); //初始化ADC
rcall _adc_init
rjmp L22
L21:
.dbline 73
;
; while(1)
; {
.dbline 75
;
; if(rdata==0xaa) //开始ADC转换标志
lds R24,_rdata
cpi R24,170
breq X10
rjmp L24
X10:
X4:
.dbline 76
; {
.dbline 77
; rdata=0x00;
clr R2
sts _rdata,R2
.dbline 79
; //****************************************************
; ADMUX = 0x46; //选择AVCC为参考,采集电压右对齐 6通道
ldi R24,70
sts 124,R24
.dbline 81
; //delay(100);
; ADCSRA =0x84; //0b11000100 8分频
ldi R24,132
sts 122,R24
.dbline 82
; ADCSRA |=BIT(ADSC); //开始转换
lds R24,122
ori R24,64
sts 122,R24
L26:
.dbline 84
;
; while(!(ADCSRA&(1<<ADIF)));
L27:
.dbline 84
lds R2,122
sbrs R2,4
rjmp L26
X5:
.dbline 87
;
; //while(ADCSRA&(1<<ADSC)); //为1等待
; adcL=ADCL;
lds R2,120
sts _adcL,R2
.dbline 88
; adcH=ADCH;
lds R2,121
sts _adcH,R2
.dbline 89
; ADCSRA |=BIT(1<<ADIF);
ldi R17,16
ldi R16,1
rcall lsl8
lds R2,122
or R2,R16
sts 122,R2
.dbline 93
; //delay(100);
;
;
; ADCSRA |=BIT(ADSC); //开始转换第二次,第一次的不准确
lds R24,122
ori R24,64
sts 122,R24
L29:
.dbline 95
;
; while(!(ADCSRA&(1<<ADIF)));
L30:
.dbline 95
lds R2,122
sbrs R2,4
rjmp L29
X6:
.dbline 98
;
; //while(ADCSRA&(1<<ADSC)); //为1等待
; adcL=ADCL;
lds R2,120
sts _adcL,R2
.dbline 99
; adcH=ADCH;
lds R2,121
sts _adcH,R2
.dbline 100
; ADCSRA |=BIT(1<<ADIF);
ldi R17,16
ldi R16,1
rcall lsl8
lds R2,122
or R2,R16
sts 122,R2
.dbline 102
;
; uart_sendB(adcH);
lds R16,_adcH
rcall _uart_sendB
.dbline 103
; uart_sendB(adcL);
lds R16,_adcL
rcall _uart_sendB
.dbline 106
;
; //****************************************************
; ADMUX = 0x47; //选择AVCC为参考,采集电压右对齐 7通道
ldi R24,71
sts 124,R24
.dbline 108
; //delay(100);
; ADCSRA =0x84; //0b11000100 8分频
ldi R24,132
sts 122,R24
.dbline 109
; ADCSRA |=BIT(ADSC); //开始转换
lds R24,122
ori R24,64
sts 122,R24
L32:
.dbline 111
;
; while(!(ADCSRA&(1<<ADIF)));
L33:
.dbline 111
lds R2,122
sbrs R2,4
rjmp L32
X7:
.dbline 114
;
; //while(ADCSRA&(1<<ADSC)); //为1等待
; adcL=ADCL;
lds R2,120
sts _adcL,R2
.dbline 115
; adcH=ADCH;
lds R2,121
sts _adcH,R2
.dbline 116
; ADCSRA |=BIT(1<<ADIF);
ldi R17,16
ldi R16,1
rcall lsl8
lds R2,122
or R2,R16
sts 122,R2
.dbline 120
;
; //delay(100);
;
; ADCSRA |=BIT(ADSC); //开始转换
lds R24,122
ori R24,64
sts 122,R24
L35:
.dbline 122
;
; while(!(ADCSRA&(1<<ADIF)));
L36:
.dbline 122
lds R2,122
sbrs R2,4
rjmp L35
X8:
.dbline 125
;
; //while(ADCSRA&(1<<ADSC)); //为1等待
; adcL=ADCL;
lds R2,120
sts _adcL,R2
.dbline 126
; adcH=ADCH;
lds R2,121
sts _adcH,R2
.dbline 127
; ADCSRA |=BIT(1<<ADIF);
ldi R17,16
ldi R16,1
rcall lsl8
lds R2,122
or R2,R16
sts 122,R2
.dbline 130
; //delay(100);
;
; uart_sendB(adcH);
lds R16,_adcH
rcall _uart_sendB
.dbline 131
; uart_sendB(adcL);
lds R16,_adcL
rcall _uart_sendB
.dbline 133
;
; }
L24:
.dbline 135
;
; }
L22:
.dbline 72
rjmp L21
X9:
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\zhanghanyu\桌面\ICC\chengxu10\lesson10\lesson10.c
_adresult::
.blkb 2
.dbsym e adresult _adresult i
_adcH::
.blkb 1
.dbsym e adcH _adcH c
_adcL::
.blkb 1
.dbsym e adcL _adcL c
_i::
.blkb 1
.dbsym e i _i c
_Rec_Data::
.blkb 27
.dbsym e Rec_Data _Rec_Data A[27:27]c
_rdata::
.blkb 1
.dbsym e rdata _rdata c
;
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -