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

📄 ad.s

📁 M16内部采样并用Max7221-7219显示
💻 S
字号:
	.module ad.c
	.area text(rom, con, rel)
	.dbfile D:\MYDOCU~1\MYMCUW~1\AVR\AD\ad.c
	.dbfile D:\MYDOCU~1\MYMCUW~1\AVR\AD\display.c
	.dbfunc e SEND _SEND fV
;              i -> R10,R11
;              x -> y+0
;              j -> R14
;            ads -> R12
;            dat -> R18
;            add -> y+7
	.even
_SEND::
	xcall push_arg4
	xcall push_xgset00FC
	sbiw R28,1
	.dbline -1
	.dbline 4
; #include "display.h"
; //===================MAX7219的核心函数,接收单片机的数据===================== 
; void SEND(unsigned char add,unsigned char dat)//发送2个字节的子函数,第一个字节为地址,第二个字节为操作数  
; {  
	.dbline 7
; unsigned char ads,j,x;  
; unsigned int i;  
; i=0;  
	clr R10
	clr R11
	.dbline 8
; MAX7219_LOAD_0;//load=0  
	cbi 0x18,4
	xjmp L3
L2:
	.dbline 10
;    while(i<16)  
;    {  
	.dbline 11
;    if (i<8){ads=add;}  
	movw R24,R10
	cpi R24,8
	ldi R30,0
	cpc R25,R30
	brsh L5
X0:
	.dbline 11
	.dbline 11
	ldd R12,y+7
	.dbline 11
	xjmp L6
L5:
	.dbline 12
;    else {ads=dat;}  
	.dbline 12
	mov R12,R18
	.dbline 12
L6:
	.dbline 13
;       for(j=8;j>=1;j--)  
	ldi R24,8
	mov R14,R24
	xjmp L10
L7:
	.dbline 14
;       {  
	.dbline 15
;       x=ads&0x80;  
	mov R24,R12
	andi R24,128
	std y+0,R24
	.dbline 16
;          if (x==0){MAX7219_DIN_0;}  
	mov R0,R24
	tst R24
	brne L11
X1:
	.dbline 16
	.dbline 16
	cbi 0x18,5
	.dbline 16
	xjmp L12
L11:
	.dbline 17
;          else {MAX7219_DIN_1;}  
	.dbline 17
	sbi 0x18,5
	.dbline 17
L12:
	.dbline 18
;             ads=ads<<1;  
	lsl R12
	.dbline 19
;       MAX7219_CLK_1;//clk=1  
	sbi 0x18,7
	.dbline 20
;          MAX7219_CLK_0;//clk=0  
	cbi 0x18,7
	.dbline 21
;       }  
L8:
	.dbline 13
	dec R14
L10:
	.dbline 13
	mov R24,R14
	cpi R24,1
	brsh L7
X2:
	.dbline 22
;    i=i+8;  
	movw R24,R10
	adiw R24,8
	movw R10,R24
	.dbline 23
;    }  
L3:
	.dbline 9
	movw R24,R10
	cpi R24,16
	ldi R30,0
	cpc R25,R30
	brlo L2
X3:
	.dbline 24
; MAX7219_LOAD_1;//load=1  
	sbi 0x18,4
	.dbline -2
L1:
	.dbline 0 ; func end
	adiw R28,1
	xcall pop_xgset00FC
	adiw R28,4
	ret
	.dbsym r i 10 i
	.dbsym l x 0 c
	.dbsym r j 14 c
	.dbsym r ads 12 c
	.dbsym r dat 18 c
	.dbsym l add 7 c
	.dbend
	.dbfunc e SEG_LIGHT _SEG_LIGHT fV
;          light -> R10,R11
	.even
_SEG_LIGHT::
	st -y,R10
	movw R10,R16
	.dbline -1
	.dbline 30
; }  
; //===================================== 
; 
; //==============SEG亮度================ 
; void SEG_LIGHT(unsigned light) 
; { 
	.dbline 31
; SEND(0x0a,light&0x0f); 
	mov R18,R10
	andi R18,15
	andi R19,0
	ldi R16,10
	xcall _SEND
	.dbline -2
L13:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r light 10 i
	.dbend
	.dbfunc e SEG_OPEN _SEG_OPEN fV
	.even
_SEG_OPEN::
	.dbline -1
	.dbline 37
; } 
; //=================================== 
; 
; //==============SEG开================ 
; void SEG_OPEN(void) 
; { 
	.dbline 38
; SEND(0x0c,0x01); 
	ldi R18,1
	ldi R16,12
	xcall _SEND
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SEG_CLOSE _SEG_CLOSE fV
	.even
_SEG_CLOSE::
	.dbline -1
	.dbline 44
; } 
; //=================================== 
; 
; //==============SEG关================ 
; void SEG_CLOSE(void) 
; { 
	.dbline 45
; SEND(0x0c,0x00); 
	clr R18
	ldi R16,12
	xcall _SEND
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SEG_CLEAR _SEG_CLEAR fV
;           part -> R10
	.even
_SEG_CLEAR::
	st -y,R10
	st -y,R11
	mov R10,R16
	.dbline -1
	.dbline 51
; } 
; //=================================== 
; 
; //==============SEG清屏==============
; void SEG_CLEAR(unsigned char part) 
; { 
	.dbline 52
; switch(part) 
	clr R11
	tst R10
	brne X4
	tst R11
	breq L20
X4:
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L21
X5:
	xjmp L17
L20:
	.dbline 55
;         { 
;         case 0://左 
;                 { 
	.dbline 56
;                 SEND(0x01,0x0f);  
	ldi R18,15
	ldi R16,1
	xcall _SEND
	.dbline 57
;                 SEND(0x02,0x0f);  
	ldi R18,15
	ldi R16,2
	xcall _SEND
	.dbline 58
;                 SEND(0x03,0x0f);  
	ldi R18,15
	ldi R16,3
	xcall _SEND
	.dbline 59
;                 SEND(0x04,0x0f); 
	ldi R18,15
	ldi R16,4
	xcall _SEND
	.dbline 60
;                 }break; 
	.dbline 60
	xjmp L18
L21:
	.dbline 62
;         case 1://右 
;                 { 
	.dbline 63
;                 SEND(0x05,0x0f);  
	ldi R18,15
	ldi R16,5
	xcall _SEND
	.dbline 64
;                 SEND(0x06,0x0f);  
	ldi R18,15
	ldi R16,6
	xcall _SEND
	.dbline 65
;                 SEND(0x07,0x0f);  
	ldi R18,15
	ldi R16,7
	xcall _SEND
	.dbline 66
;                 SEND(0x08,0x0f); 
	ldi R18,15
	ldi R16,8
	xcall _SEND
	.dbline 67
;                 }break; 
	.dbline 67
	xjmp L18
L17:
	.dbline 69
;         default://全部 
;                 { 
	.dbline 70
;                 SEND(0x01,0x0f);  
	ldi R18,15
	ldi R16,1
	xcall _SEND
	.dbline 71
;                 SEND(0x02,0x0f);  
	ldi R18,15
	ldi R16,2
	xcall _SEND
	.dbline 72
;                 SEND(0x03,0x0f);  
	ldi R18,15
	ldi R16,3
	xcall _SEND
	.dbline 73
;                 SEND(0x04,0x0f); 
	ldi R18,15
	ldi R16,4
	xcall _SEND
	.dbline 74
;                 SEND(0x05,0x0f);  
	ldi R18,15
	ldi R16,5
	xcall _SEND
	.dbline 75
;                 SEND(0x06,0x0f);  
	ldi R18,15
	ldi R16,6
	xcall _SEND
	.dbline 76
;                 SEND(0x07,0x0f);  
	ldi R18,15
	ldi R16,7
	xcall _SEND
	.dbline 77
;                 SEND(0x08,0x0f); 
	ldi R18,15
	ldi R16,8
	xcall _SEND
	.dbline 78
;                 }break; 
	.dbline 78
L18:
	.dbline -2
L16:
	.dbline 0 ; func end
	ld R11,y+
	ld R10,y+
	ret
	.dbsym r part 10 c
	.dbend
	.dbfunc e SEG_INIT _SEG_INIT fV
	.even
_SEG_INIT::
	.dbline -1
	.dbline 84
;         } 
; } 
; 
; //==============SEG初始化============= 
; void SEG_INIT(void) 
; { 
	.dbline 85
; MAX7219_OUT_DDR|=(1<<MAX7219_CLK_PORT)|(1<<MAX7219_DIN_PORT)|(1<<MAX7219_LOAD_PORT); 
	in R24,0x17
	ori R24,176
	out 0x17,R24
	.dbline 86
; MAX7219_OUT_PORT|=(1<<MAX7219_CLK_PORT)|(1<<MAX7219_DIN_PORT)|(1<<MAX7219_LOAD_PORT); 
	in R24,0x18
	ori R24,176
	out 0x18,R24
	.dbline 87
; SEND(0x0c,0x01); 
	ldi R18,1
	ldi R16,12
	xcall _SEND
	.dbline 88
; SEND(0x0b,0x07);  
	ldi R18,7
	ldi R16,11
	xcall _SEND
	.dbline 89
; SEND(0x0a,0x05);  
	ldi R18,5
	ldi R16,10
	xcall _SEND
	.dbline 90
; SEND(0x09,0xff);  
	ldi R18,255
	ldi R16,9
	xcall _SEND
	.dbline 91
; SEG_CLEAR(3); 
	ldi R16,3
	xcall _SEG_CLEAR
	.dbline -2
L22:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SEG_L _SEG_L fV
;              i -> R12,R13
;         number -> R10,R11
	.even
_SEG_L::
	xcall push_xgset003C
	movw R10,R16
	.dbline -1
	.dbline 97
; } 
; 
; 
; //=============SEG左四显示数字============== 
; void SEG_L(int number) 
; { 
	.dbline 98
; int i=4; 
	ldi R24,4
	ldi R25,0
	movw R12,R24
	.dbline 99
; SEND(0x01,0x0f); //先清除左四位,左四位黑屏 
	ldi R18,15
	ldi R16,1
	xcall _SEND
	.dbline 100
; SEND(0x02,0x0f);  
	ldi R18,15
	ldi R16,2
	xcall _SEND
	.dbline 101
; SEND(0x03,0x0f);  
	ldi R18,15
	ldi R16,3
	xcall _SEND
	.dbline 102
; SEND(0x04,0x0f); 
	ldi R18,15
	ldi R16,4
	xcall _SEND
	.dbline 104
; 
; if(number>9999)//要显示的数值超过4位,则显示4个H 
	ldi R24,9999
	ldi R25,39
	cp R24,R10
	cpc R25,R11
	brge L24
X6:
	.dbline 105
;         { 
	.dbline 106
;         SEND(0x01,0x0c);  
	ldi R18,12
	ldi R16,1
	xcall _SEND
	.dbline 107
;         SEND(0x02,0x0c);  
	ldi R18,12
	ldi R16,2
	xcall _SEND
	.dbline 108
;         SEND(0x03,0x0c);  
	ldi R18,12
	ldi R16,3
	xcall _SEND
	.dbline 109
;         SEND(0x04,0x0c); 
	ldi R18,12
	ldi R16,4
	xcall _SEND
	.dbline 110
;         } 
	xjmp L25
L24:
	.dbline 112
; else//小于四位可以显示 
;         { 
L26:
	.dbline 114
;         do 
;                 { 
	.dbline 115
;                 SEND(i,number%10); 
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall mod16s
	mov R18,R16
	mov R16,R12
	xcall _SEND
	.dbline 116
;                 number=(number-number%10)/10; 
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall mod16s
	movw R2,R16
	movw R16,R10
	sub R16,R2
	sbc R17,R3
	ldi R18,10
	ldi R19,0
	xcall div16s
	movw R10,R16
	.dbline 117
;                 i--; 
	movw R24,R12
	sbiw R24,1
	movw R12,R24
	.dbline 118
;                 }while(number>=1); 
L27:
	.dbline 118
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brge L26
X7:
	.dbline 119
;         } 
L25:
	.dbline -2
L23:
	.dbline 0 ; func end
	xjmp pop_xgset003C
	.dbsym r i 12 I
	.dbsym r number 10 I
	.dbend
	.dbfunc e SEG_R _SEG_R fV
;              i -> R12,R13
;         number -> R10,R11
	.even
_SEG_R::
	xcall push_xgset003C
	movw R10,R16
	.dbline -1
	.dbline 125
; } 
; //===================================== 
; 
; //=============SEG右四显示数字============== 
; void SEG_R(int number) 
; { 
	.dbline 126
; int i=8; 
	ldi R24,8
	ldi R25,0
	movw R12,R24
	.dbline 128
; 
; SEND(0x05,0x0f); //先清除右四位,右四位黑屏 
	ldi R18,15
	ldi R16,5
	xcall _SEND
	.dbline 129
; SEND(0x06,0x0f);  
	ldi R18,15
	ldi R16,6
	xcall _SEND
	.dbline 130
; SEND(0x07,0x0f);  
	ldi R18,15
	ldi R16,7
	xcall _SEND
	.dbline 131
; SEND(0x08,0x0f); 
	ldi R18,15
	ldi R16,8
	xcall _SEND
	.dbline 133
; 
; if(number>9999)//要显示的数值超过4位,则显示4个H 
	ldi R24,9999
	ldi R25,39
	cp R24,R10
	cpc R25,R11
	brge L30
X8:
	.dbline 134
;         { 
	.dbline 135
;         SEND(0x05,0x0c);  
	ldi R18,12
	ldi R16,5
	xcall _SEND
	.dbline 136
;         SEND(0x06,0x0c);  
	ldi R18,12
	ldi R16,6
	xcall _SEND
	.dbline 137
;         SEND(0x07,0x0c);  
	ldi R18,12
	ldi R16,7
	xcall _SEND
	.dbline 138
;         SEND(0x08,0x0c); 
	ldi R18,12
	ldi R16,8
	xcall _SEND
	.dbline 139
;         } 
	xjmp L31
L30:
	.dbline 141
; else//小于四位可以显示 
;         { 
L32:
	.dbline 143
;         do 
;                 { 
	.dbline 144
;                 SEND(i,number%10); 
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall mod16s
	mov R18,R16
	mov R16,R12
	xcall _SEND
	.dbline 145
;                 number=(number-number%10)/10; 
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall mod16s
	movw R2,R16
	movw R16,R10
	sub R16,R2
	sbc R17,R3
	ldi R18,10
	ldi R19,0
	xcall div16s
	movw R10,R16
	.dbline 146
;                 i--; 
	movw R24,R12
	sbiw R24,1
	movw R12,R24
	.dbline 147
;                 }while(number>=1); 
L33:
	.dbline 147
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brge L32
X9:
	.dbline 148
;         } 
L31:
	.dbline -2
L29:
	.dbline 0 ; func end
	xjmp pop_xgset003C
	.dbsym r i 12 I
	.dbsym r number 10 I
	.dbend
	.dbfile D:\MYDOCU~1\MYMCUW~1\AVR\AD\delay.h
	.dbfunc e delay_1us _delay_1us fV
	.even
_delay_1us::
	.dbline -1
	.dbline 10
; /*-----------------------------------------------------------------------
; 延时函数
; 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
; 目标芯片 : M16
; 时钟: 8.0000Mhz
; 作者:archeng504
; -----------------------------------------------------------------------*/
; 
; void delay_1us(void)                 //1us延时函数
;   {
	.dbline 11
;    asm("nop");
	nop
	.dbline -2
L35:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_nus _delay_nus fV
;              i -> R10,R11
;              n -> R12,R13
	.even
_delay_nus::
	xcall push_xgset003C
	movw R12,R16
	.dbline -1
	.dbline 15
;   }
; 
; void delay_nus(unsigned int n)       //N us延时函数
;   {
	.dbline 16
;    unsigned int i=0;
	clr R10
	clr R11
	.dbline 17
;    for (i=0;i<n;i++)
	xjmp L40
L37:
	.dbline 18
;    delay_1us();
	xcall _delay_1us
L38:
	.dbline 17
	movw R24,R10
	adiw R24,1
	movw R10,R24
L40:
	.dbline 17
	cp R10,R12
	cpc R11,R13
	brlo L37
X10:
	.dbline -2
L36:
	.dbline 0 ; func end
	xjmp pop_xgset003C
	.dbsym r i 10 i
	.dbsym r n 12 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 22
;   }
;   
; void delay_1ms(void)                 //1ms延时函数
;   {
	.dbline 24
;    unsigned int i;
;    for (i=0;i<1140;i++);
	clr R16
	clr R17
	xjmp L45
L42:
	.dbline 24
L43:
	.dbline 24
	subi R16,255  ; offset = 1
	sbci R17,255
L45:
	.dbline 24
	cpi R16,116
	ldi R30,4
	cpc R17,R30
	brlo L42
X11:
	.dbline -2
L41:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R10,R11
;              n -> R12,R13
	.even
_delay_nms::
	xcall push_xgset003C
	movw R12,R16
	.dbline -1
	.dbline 28
;   }
;   
; void delay_nms(unsigned int n)       //N ms延时函数
;   {
	.dbline 29
;    unsigned int i=0;
	clr R10
	clr R11
	.dbline 30
;    for (i=0;i<n;i++)
	xjmp L50
L47:
	.dbline 31
;    delay_1ms();
	xcall _delay_1ms
L48:
	.dbline 30
	movw R24,R10
	adiw R24,1
	movw R10,R24
L50:
	.dbline 30
	cp R10,R12
	cpc R11,R13
	brlo L47
X12:
	.dbline -2
L46:
	.dbline 0 ; func end
	xjmp pop_xgset003C
	.dbsym r i 10 i
	.dbsym r n 12 i
	.dbend
	.dbfile D:\MYDOCU~1\MYMCUW~1\AVR\AD\ad.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 6
; #include <iom16v.h>
; #include "display.c"
; #include "delay.h"
; 
; void port_init()
; {
	.dbline 7
;  PORTA = 0x00;
	clr R2
	out 0x1b,R2
	.dbline 8
;  DDRA  = 0x00;
	out 0x1a,R2
	.dbline 9
;  PORTB = 0x00;
	out 0x18,R2
	.dbline 10
;  DDRB  = 0xF0;
	ldi R24,240
	out 0x17,R24
	.dbline 11
;  PORTC = 0x00; //m103 output only
	out 0x15,R2
	.dbline 12
;  DDRC  = 0x00;
	out 0x14,R2
	.dbline 13
;  PORTD = 0x00;
	out 0x12,R2
	.dbline 14
;  DDRD  = 0x00;
	out 0x11,R2
	.dbline -2
L51:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;          Ddata -> R10,R11
	.even
_main::
	.dbline -1
	.dbline 18
; }
; 
; void main()
; {
	.dbline 20
;   unsigned int Ddata;
;   port_init();
	xcall _port_init
	.dbline 21
;   SEG_INIT();
	xcall _SEG_INIT
	.dbline 22
;   ADMUX=0;
	clr R2
	out 0x7,R2
	xjmp L54
L53:
	.dbline 24
;   while(1)
;   {
	.dbline 25
;   ADCSRA=0XC0;
	ldi R24,192
	out 0x6,R24
	.dbline 26
;   delay_nms(100);
	ldi R16,100
	ldi R17,0
	xcall _delay_nms
L56:
	.dbline 27
;   while(!(ADCSR&(1<<(ADIF))));
L57:
	.dbline 27
	sbis 0x6,4
	rjmp L56
X13:
	.dbline 28
;   Ddata=ADCL;
	in R10,0x4
	clr R11
	.dbline 29
;   Ddata+=ADCH*256;
	in R18,0x5
	clr R19
	ldi R16,256
	ldi R17,1
	xcall empy16s
	add R10,R16
	adc R11,R17
	.dbline 31
; //  Ddata=(float)(Ddata)/1023*5000;
;   SEG_R(Ddata);
	movw R16,R10
	xcall _SEG_R
	.dbline 32
;   SEG_L(Ddata);
	movw R16,R10
	xcall _SEG_L
	.dbline 33
;   delay_nms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _delay_nms
	.dbline 34
;   }
L54:
	.dbline 23
	xjmp L53
X14:
	.dbline -2
L52:
	.dbline 0 ; func end
	ret
	.dbsym r Ddata 10 i
	.dbend
; }

⌨️ 快捷键说明

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