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

📄 m16.s

📁 ewts avr驱动程序 角速度传感器 104为秒
💻 S
字号:
	.module m16.c
	.area lit(rom, con, rel)
_DisV::
	.byte 'V,58,0
	.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m16.c
	.dbsym e DisV _DisV A[3:3]kc
_DisP::
	.byte 'P,58,0
	.dbsym e DisP _DisP A[3:3]kc
	.area text(rom, con, rel)
	.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m16.c
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 26
; #include <iom16v.h>
; #define uchar unsigned char
; #define uint unsigned int
; #define LcdBus PORTA
; #define BIT(i) (1<<i)
; #define rs 2 //LCD端口定义
; #define rw 3
; #define en 4 
; 
; const char DisV[]={"V:"} ;//灵敏度
; const char DisP[]={"P:"} ;//精确度
;  
; void LcdIni(void) ;
; void WrOp(uchar dat) ;
; void WrDat(uchar dat) ;
; void ChkBusy(void) ;
; void DisText(uchar addr,uchar *text) ;
; void DisTextConst(uchar addr,uchar const *text) ;
; void ShowNum(uchar addr,uint num) ;   //在addr处显示数字num
; int AdcVal(uchar n) ;
; void delayms(uint n) ;
; int AdcValPro(uchar n) ;
; char BCD[6] ;   //十位二进制的显示码分别是千百十个位的显示
; int Adc[3] ;    //存放Adc转换后的值
; void main(void)
; {
	.dbline 27
;   LcdIni() ;
	xcall _LcdIni
	.dbline 28
;   DisTextConst(0x80,DisV) ;
	ldi R18,<_DisV
	ldi R19,>_DisV
	ldi R16,128
	xcall _DisTextConst
	.dbline 29
;   DisTextConst(0xc0,DisP) ;
	ldi R18,<_DisP
	ldi R19,>_DisP
	ldi R16,192
	xcall _DisTextConst
	xjmp L3
L2:
	.dbline 32
	.dbline 33
	ldi R16,1
	xcall _AdcVal
	movw R18,R16
	ldi R16,130
	xcall _ShowNum
	.dbline 34
	ldi R16,2
	xcall _AdcVal
	movw R18,R16
	ldi R16,194
	xcall _ShowNum
	.dbline 35
L3:
	.dbline 31
	xjmp L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e AdcVal _AdcVal fI
;              k -> R22
;              i -> R12
;            tmp -> R10,R11
;              n -> R20
	.even
_AdcVal::
	xcall push_gset4
	mov R20,R16
	.dbline -1
	.dbline 39
; 
;   while(1)
;   {
;    ShowNum(0x82,AdcVal(1)) ;
;    ShowNum(0xC2,AdcVal(2)) ;
;   }
; }
; 
; int AdcVal(uchar n)
; {//软件滤波
	.dbline 41
;  uchar i,k ;
;  uint tmp=0 ;
	clr R10
	clr R11
	.dbline 42
;  for(i=0 ;i<20 ;i++)
	clr R12
	xjmp L9
L6:
	.dbline 43
	mov R16,R20
	xcall _AdcValPro
	movw R2,R10
	add R2,R16
	adc R3,R17
	lsr R3
	ror R2
	movw R10,R2
L7:
	.dbline 42
	inc R12
L9:
	.dbline 42
	mov R24,R12
	cpi R24,20
	brlo L6
	.dbline 44
;   tmp=(tmp+AdcValPro(n))/2 ;
;  k=tmp>Adc[n] ? (tmp-Adc[n]):(Adc[n]-tmp) ;
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_Adc
	ldi R25,>_Adc
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	cp R2,R10
	cpc R3,R11
	brsh L10
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_Adc
	ldi R25,>_Adc
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	movw R22,R10
	sub R22,R2
	sbc R23,R3
	xjmp L11
L10:
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_Adc
	ldi R25,>_Adc
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	ldd R23,z+1
	sub R22,R10
	sbc R23,R11
L11:
	.dbline 45
;  Adc[n]=k>5 ? tmp:Adc[n] ;
	ldi R24,5
	cp R24,R22
	brsh L12
	movw R22,R10
	xjmp L13
L12:
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_Adc
	ldi R25,>_Adc
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	ldd R23,z+1
L13:
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_Adc
	ldi R25,>_Adc
	add R30,R24
	adc R31,R25
	std z+1,R23
	std z+0,R22
	.dbline 46
;  return Adc[n] ;
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_Adc
	ldi R25,>_Adc
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	ldd R17,z+1
	.dbline -2
L5:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r k 22 c
	.dbsym r i 12 c
	.dbsym r tmp 10 i
	.dbsym r n 20 c
	.dbend
	.dbfunc e AdcValPro _AdcValPro fI
;           dat0 -> R20
;           dat1 -> R22
;            val -> R10,R11
;              n -> R20
	.even
_AdcValPro::
	xcall push_gset3
	mov R20,R16
	.dbline -1
	.dbline 50
; }
; 
; int AdcValPro(uchar n)
; {//返回第N个ADC的值从0到7
	.dbline 53
;  uchar dat1,dat0 ;
;  int val ;
;  DDRA &=~BIT(n) ;  //设置对应的ADC口为输入
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R16
	com R2
	in R3,0x1a
	and R3,R2
	out 0x1a,R3
	.dbline 54
;  PORTA &=~BIT(n) ;
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R16
	com R2
	in R3,0x1b
	and R3,R2
	out 0x1b,R3
	.dbline 55
;  ADMUX=0x40+n ;  //选择AVCC,选择第N个ADC
	mov R24,R20
	subi R24,192    ; addi 64
	out 0x7,R24
	.dbline 56
;  ADCSRA=0xc0 ;  //允许转换ADEN,ADSC
	ldi R24,192
	out 0x6,R24
L15:
	.dbline 57
L16:
	.dbline 57
;  while(ADCSRA & BIT(ADSC)) ;   //
	sbic 0x6,6
	rjmp L15
	.dbline 58
;  dat1=ADCH ;
	in R22,0x5
	.dbline 59
;  dat0=ADCL ;
	in R20,0x4
	.dbline 60
;  val=ADCH*256+ADCL ;
	in R18,0x5
	clr R19
	ldi R16,256
	ldi R17,1
	xcall empy16s
	movw R10,R16
	in R2,0x4
	clr R3
	add R10,R2
	adc R11,R3
	.dbline 62
;  
; DDRB=0xff;
	ldi R24,255
	out 0x17,R24
	.dbline 63
; PORTB=val;       return val ;
	out 0x18,R10
	.dbline 63
	movw R16,R10
	.dbline -2
L14:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r dat0 20 c
	.dbsym r dat1 22 c
	.dbsym r val 10 I
	.dbsym r n 20 c
	.dbend
	.dbfunc e ShowNum _ShowNum fV
;              i -> R20
;            num -> R22,R23
;           addr -> R10
	.even
_ShowNum::
	xcall push_gset3
	movw R22,R18
	mov R10,R16
	.dbline -1
	.dbline 67
; }
; 
; void ShowNum(uchar addr,uint num)   //在addr处显示数字num
; {//将num转化成五个BCD码存放在全局数组BCD[5]中
	.dbline 69
;  uchar i ;
;  for(i=5 ;i>0 ;i--)       //将NUM数据转化成ASCII码,如521会转化为00521
	ldi R20,5
	xjmp L22
L19:
	.dbline 70
	.dbline 71
	ldi R18,10
	ldi R19,0
	movw R16,R22
	xcall mod16u
	movw R24,R16
	adiw R24,48
	ldi R30,<_BCD-1
	ldi R31,>_BCD-1
	mov R26,R20
	clr R27
	add R26,R30
	adc R27,R31
	st x,R24
	.dbline 72
	ldi R18,10
	ldi R19,0
	movw R16,R22
	xcall div16u
	movw R22,R16
	.dbline 73
L20:
	.dbline 69
	dec R20
L22:
	.dbline 69
	clr R2
	cp R2,R20
	brlo L19
	.dbline 74
;  {
;           BCD[i-1]=(uchar)(num%10+0x30) ;     //取出最低位
;           num/=10 ;                           //去掉最低位
;     }
;     i=0 ;
	clr R20
	.dbline 76
; // while(BCD ==0x30 && i<4) BCD[i++]=' ' ;    //NUM转换成数组存放,但还没有加上小数点
;  BCD[5]='\0' ;
	sts _BCD+5,R2
	.dbline 77
;  DisText(addr,BCD+1) ;
	ldi R18,<_BCD+1
	ldi R19,>_BCD+1
	mov R16,R10
	xcall _DisText
	.dbline -2
L18:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r num 22 i
	.dbsym r addr 10 c
	.dbend
	.dbfunc e DisText _DisText fV
;              p -> R20,R21
;           addr -> R22
	.even
_DisText::
	xcall push_gset2
	movw R20,R18
	mov R22,R16
	.dbline -1
	.dbline 81
; }
; 
; void DisText(uchar addr,uchar *p)
; {
	.dbline 82
;  WrOp(addr) ;
	mov R16,R22
	xcall _WrOp
	xjmp L28
L27:
	.dbline 83
	movw R30,R20
	ld R16,Z+
	movw R20,R30
	xcall _WrDat
L28:
	.dbline 83
;  while(*p !='\0')WrDat(*(p++)) ;
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L27
	.dbline -2
L26:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r p 20 pc
	.dbsym r addr 22 c
	.dbend
	.dbfunc e DisTextConst _DisTextConst fV
;              p -> R20,R21
;           addr -> R22
	.even
_DisTextConst::
	xcall push_gset2
	movw R20,R18
	mov R22,R16
	.dbline -1
	.dbline 87
; }
; 
; void DisTextConst(uchar addr,uchar const *p)
; {
	.dbline 88
;  WrOp(addr) ;
	mov R16,R22
	xcall _WrOp
	xjmp L32
L31:
	.dbline 89
	movw R2,R20
	subi R20,255  ; offset = 1
	sbci R21,255
	movw R30,R2
	lpm R16,Z
	xcall _WrDat
L32:
	.dbline 89
;  while(*p !='\0')WrDat(*(p++)) ;
	movw R30,R20
	lpm R30,Z
	tst R30
	brne L31
	.dbline -2
L30:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r p 20 pkc
	.dbsym r addr 22 c
	.dbend
	.dbfunc e LcdIni _LcdIni fV
;              i -> R20,R21
	.even
_LcdIni::
	xcall push_gset1
	.dbline -1
	.dbline 93
; }
; 
; void LcdIni()
; {
	.dbline 95
;     uint i ;
;  DDRD=0XFF ;   //设置PA输出
	ldi R24,255
	out 0x11,R24
	.dbline 96
;  PORTD=0XFF ;   //全部加上上拉电阻
	out 0x12,R24
	.dbline 97
;  DDRC=0XFF ;   //设置PC为输出
	out 0x14,R24
	.dbline 98
;  PORTC=0XFF ;   //全部加上上拉电阻
	out 0x15,R24
	.dbline 99
;  WrOp(0x38) ;   
	ldi R16,56
	xcall _WrOp
	.dbline 100
;  WrOp(0x06) ;   //光标加1
	ldi R16,6
	xcall _WrOp
	.dbline 101
;  WrOp(0x0c) ;   //开显示
	ldi R16,12
	xcall _WrOp
	.dbline 102
;  WrOp(0x01) ;
	ldi R16,1
	xcall _WrOp
	.dbline 103
	clr R20
	clr R21
	xjmp L38
L35:
	.dbline 103
L36:
	.dbline 103
	subi R20,255  ; offset = 1
	sbci R21,255
L38:
	.dbline 103
;  for(i=0 ;i<5000 ;i++) ;
	cpi R20,136
	ldi R30,19
	cpc R21,R30
	brlo L35
	.dbline -2
L34:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbend
	.dbfunc e WrOp _WrOp fV
;              i -> R20
;            dat -> R20
	.even
_WrOp::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 107
; }
; 
; void WrOp(uchar dat)
; {
	.dbline 109
;  uchar i ;
;  ChkBusy() ;
	xcall _ChkBusy
	.dbline 110
;  PORTD &=~BIT(rs) ; //RS=0
	cbi 0x12,2
	.dbline 111
;  PORTD &=~BIT(rw) ; //RW=0
	cbi 0x12,3
	.dbline 112
;  PORTD &=~BIT(en) ; //EN=0
	cbi 0x12,4
	.dbline 113
;  PORTC =dat ;   //送数据
	out 0x15,R20
	.dbline 114
;  PORTD |=BIT(en) ; //EN=1
	sbi 0x12,4
	.dbline 115
	ldi R20,1
	xjmp L43
L40:
	.dbline 115
L41:
	.dbline 115
	inc R20
L43:
	.dbline 115
;  for(i=1 ;i ;i++) ;  //延时
	tst R20
	brne L40
	.dbline 116
;  PORTD &=~BIT(en) ; //EN=0
	cbi 0x12,4
	.dbline -2
L39:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r dat 20 c
	.dbend
	.dbfunc e WrDat _WrDat fV
;              i -> R20
;            dat -> R20
	.even
_WrDat::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 120
; }
; 
; void WrDat(uchar dat)
; {
	.dbline 122
;  uchar i ;
;  ChkBusy() ;
	xcall _ChkBusy
	.dbline 123
;  PORTD |=BIT(rs) ; //rs=1
	sbi 0x12,2
	.dbline 124
;  PORTD &=~BIT(rw) ; //rw=0
	cbi 0x12,3
	.dbline 125
;  PORTD &=~BIT(en) ; //en=0
	cbi 0x12,4
	.dbline 126
;  PORTC=dat ;   //送数据
	out 0x15,R20
	.dbline 127
;  PORTD |=BIT(en) ; //en=1
	sbi 0x12,4
	.dbline 128
	ldi R20,1
	xjmp L48
L45:
	.dbline 128
L46:
	.dbline 128
	inc R20
L48:
	.dbline 128
;  for(i=1 ;i ;i++) ;  //延时
	tst R20
	brne L45
	.dbline 129
;  PORTD &=~BIT(en) ; //en=0
	cbi 0x12,4
	.dbline -2
L44:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r dat 20 c
	.dbend
	.dbfunc e ChkBusy _ChkBusy fV
	.even
_ChkBusy::
	.dbline -1
	.dbline 133
; }
; 
; void ChkBusy()
; {
	.dbline 134
;  DDRC=0X00 ;   //设置为输入
	clr R2
	out 0x14,R2
	.dbline 135
;  PORTC=0X00 ;   //不设置上拉电阻
	out 0x15,R2
	.dbline 136
;  PORTD &=~BIT(rs) ; //RS=0
	cbi 0x12,2
	.dbline 137
;  PORTD |=BIT(rw) ; //RW=1
	sbi 0x12,3
	.dbline 138
;  PORTD |=BIT(en) ; //EN=1
	sbi 0x12,4
L50:
	.dbline 139
L51:
	.dbline 139
;  while(PINC & 0x80) ; //送数据
	sbic 0x13,7
	rjmp L50
	.dbline 140
;  PORTD &=~BIT(en) ; //en=0
	cbi 0x12,4
	.dbline 141
;  DDRC=0xff ;   //设置为输出
	ldi R24,255
	out 0x14,R24
	.dbline -2
L49:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delayms _delayms fV
;              i -> R20,R21
;              j -> R22
;              n -> R16,R17
	.even
_delayms::
	xcall push_gset2
	.dbline -1
	.dbline 145
; }
; 
; void delayms(uint n)
; {
	.dbline 148
;   uchar j ;
;  uint i ;
;   for(i=0 ;i<n ;i++)
	clr R20
	clr R21
	xjmp L57
L54:
	.dbline 149
	clr R22
	xjmp L61
L58:
	.dbline 149
L59:
	.dbline 149
	inc R22
L61:
	.dbline 149
	cpi R22,250
	brlo L58
L55:
	.dbline 148
	subi R20,255  ; offset = 1
	sbci R21,255
L57:
	.dbline 148
	cp R20,R16
	cpc R21,R17
	brlo L54
	.dbline -2
L53:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 c
	.dbsym r n 16 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m16.c
_Adc::
	.blkb 6
	.dbsym e Adc _Adc A[6:3]I
_BCD::
	.blkb 6
	.dbsym e BCD _BCD A[6:6]c

⌨️ 快捷键说明

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