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

📄 dac.s

📁 为苏州一家公司所做的的恒温恒湿车间控制 系统
💻 S
字号:
	.module DAC.c
	.area text
	.dbfile DAC.c
	.dbfunc e DA_SPIInit _DA_SPIInit fV
_DA_SPIInit::
	.dbline -1
	.dbline 19
; /*-------------------------------------------------------*
; *(1)TLV5608Init:TLV5608初始化
; *(2)TLV5608Z:1路DA转换子程序                             *
; *(3)DAC:2片TLV5608转换                                   *
; *-------------------------------------------------------*/
; //[包含头文件]
; #include "Includes.h"
; //[包含外部函数]
; void Delay(void);
; /*SPIInit:SPI初始化子程序-------------------------------*
; *功 能:对SPI进行初始化,默认为允许SPI,主机工作方式,时钟  *
; *      空闲低电平,比特率2分频,                         *
; *      波特率为CGMOUT/2*BD(设CGMOUT=2*fBUS=2*2.4576MHz)*
; *参 数:无                                               *
; *返 回:无                                               *
; *------------------------------------------------------*/
; #include "Includes.h"
; void DA_SPIInit(void)
;  {  
	.dbline 20
; 	SPCR=0b00100010;   //不产生中断、主机方式、时钟空闲低电平
	lda #34
	sta 0x10
	.dbline 21
; 	SPSCR=0b00000000;  //2分频
	clr 0x11
	.dbline -2
L1:
	.dbline 0 ; func end
	rts
	.dbend
	.dbfunc e DAC _DAC fV
;              i -> 0,X
;          value -> 3,X
_DAC::
	.dbline -1
	ais #-1
	tsx
	.dbline 29
;  }
; /*D/A转换子程序(DAC.c)-----------------------------------*
; *功能:将TLV5608(0)-(1)片,共16通道的数字量转换为模拟量  *
; *入口:value--2片5608、16路通道的数字量值                *
; *调用:TLV5608Z                                          *
; *-------------------------------------------------------*/
; void DAC(INT16U *value)
; {  
	.dbline 32
;   INT8U i;
;   //TLV5608初始化
;   TLV5608Init();
	jsr _TLV5608Init
	tsx
	.dbline 33
;   for(i=1;i<=16;i++)
	lda #1
	sta ,X
	bra L6
L3:
	.dbline 34
	clr *__r0
	lda ,X
	sta *__r1
	lsl *__r1
	rol *__r0
	lda *__r1
	add 4,X
	sta *__r1
	lda *__r0
	adc 3,X
	sta *__r0
	ldhx *__r0
	aix #-2
	lda 1,x
	sta *__r1
	lda ,x
	tsx
	sta *__r0
	lda *__r1
	psha
	lda *__r0
	psha
	clr *__r0
	lda ,X
	psha
	lda *__r0
	psha
	jsr _TLV5608Z
	ais #4
	tsx
L4:
	.dbline 33
	inc ,X
L6:
	.dbline 33
	lda ,X
	cmp #16
	bls L3
	.dbline -2
L2:
	ais #1
	.dbline 0 ; func end
	rts
	.dbsym l i 0 c
	.dbsym l value 3 ps
	.dbend
	.dbfunc e TLV5608Init _TLV5608Init fV
;             fs -> 0,X
_TLV5608Init::
	.dbline -1
	ais #-1
	tsx
	.dbline 42
;     TLV5608Z(i,*(value+i-1));
; }
; /*TLV5608芯片D/A转换初始化子程序(TLV5608Init.c)-----------------*
; *功  能:初始化2片TLV5608的CTRL0、CTRL1寄存器                    *
; *参  数:无                                                      *
; *返  回:无                                                      *
; *--------------------------------------------------------------*/
; void TLV5608Init(void)
; {
	.dbline 44
;   INT8U fs;
;   for(fs=0;fs<=1;fs++)
	clr ,X
	jmp L11
L8:
	.dbline 45
;   {
	.dbline 46
;   	CS_D |=0b00001100;  //定义PTC2~3为输出
	lda 0x6
	ora #12
	sta 0x6
	.dbline 47
;   	CS_P |=0b00001100;  //PTC2~3输出为高电平
	lda 0x2
	ora #12
	sta 0x2
	.dbline 49
;  	//设置CTRL0寄存器  	
;     CS_P &= ~(1<<(fs+2));   //相应片TLV.FS由高电平变为低电平,产生下降沿
	lda ,X
	add #2
	mov #1,*__r2
	and #7
	beq X1
X0:
	lsl *__r2
	dbnza X0
X1:
	mov *__r2,*__r0
	com *__r0
	lda 0x2
	and *__r0
	sta 0x2
	.dbline 51
;                       //此后在每个SCLK的下降沿传送一位数据,共传输16位数据  
;     Delay();          //延时20个时钟周期          
	jsr _Delay
	tsx
	.dbline 52
;     SPIDR=0b10000000;       //发送高8位数据(CTRL0地址为1000)  
	lda #-128
	sta 0x12
L12:
	.dbline 53
L13:
	.dbline 53
;   	while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
	brclr #3,0x11,L12
	.dbline 55
;                                              //发送完毕 
;   	SPIDR=0b00000000;       //发送低8位数据
	clr 0x12
L15:
	.dbline 56
L16:
	.dbline 56
;   	while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
	brclr #3,0x11,L15
	.dbline 58
;                                              //发送完毕                                                  
;     asm("nop"); 
	nop
	.dbline 59
;     asm("nop");                                              
	nop
	.dbline 60
;   	CS_P |= (1<<(fs+2));   //数据传输完毕,相应片TLV.FS由低电平变为高电平  
	lda ,X
	add #2
	mov #1,*__r2
	and #7
	beq X3
X2:
	lsl *__r2
	dbnza X2
X3:
	lda 0x2
	ora *__r2
	sta 0x2
	.dbline 64
;   	
;   	
;   	//设置CTRL1寄存器   	
;   	CS_P &= ~(1<<(fs+2));   //相应片TLV.FS由高电平变为低电平,产生下降沿
	lda ,X
	add #2
	mov #1,*__r2
	and #7
	beq X5
X4:
	lsl *__r2
	dbnza X4
X5:
	mov *__r2,*__r0
	com *__r0
	lda 0x2
	and *__r0
	sta 0x2
	.dbline 66
;                       //此后在每个SCLK的下降沿传送一位数据 
;     Delay();          //延时20个时钟周期        
	jsr _Delay
	tsx
	.dbline 67
;     SPIDR=0b10010000;       //发送高8位数据(CTRL1地址为1001)
	lda #-112
	sta 0x12
L18:
	.dbline 68
L19:
	.dbline 68
;   	while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
	brclr #3,0x11,L18
	.dbline 70
;                                              //发送完毕 
;   	SPIDR=0b00001111;       //发送低8位数据(正常电压,快速)
	lda #15
	sta 0x12
L21:
	.dbline 71
L22:
	.dbline 71
	brclr #3,0x11,L21
	.dbline 73
	lda ,X
	add #2
	mov #1,*__r2
	and #7
	beq X7
X6:
	lsl *__r2
	dbnza X6
X7:
	lda 0x2
	ora *__r2
	sta 0x2
	.dbline 74
L9:
	.dbline 44
	inc ,X
L11:
	.dbline 44
	lda ,X
	cmp #1
	bhi X8
	jmp L8
X8:
	.dbline -2
L7:
	ais #1
	.dbline 0 ; func end
	rts
	.dbsym l fs 0 c
	.dbend
	.dbfunc e TLV5608Z _TLV5608Z fV
;          value -> 0,X
;             fs -> 2,X
;            buf -> 7,X
;        channel -> 5,X
_TLV5608Z::
	.dbline -1
	ais #-3
	tsx
	.dbline 86
;   	while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
;                                              //发送完毕                                             
;   	CS_P |= (1<<(fs+2));   //数据传输完毕,相应片TLV.FS由低电平变为高电平
;   }                                    
; }
; /*TLV5608芯片D/A转换子程序(TLV5608Z.c)--------------------------*
; *TLV5608的接线:                                                 *
; *             ① SCLK(3)接MC08HC908GP32的SPSCK(18)              *
; *             ② DIN(2)接MC08HC908GP32的MISO(17)                *
; *             ③ LDAC(18)接MC08HC908GP32的PTC4                  *
; *             ④ 0-1片FS(4作为片选信号)接分别接的PTC2~3         *
; *                MODE接高电平,选择uC模式                       *
; *入口:channel-通道号(1-16),buf-存放数据                        *
; *--------------------------------------------------------------*/
; void TLV5608Z(INT16U channel, INT16U buf)
; {
	.dbline 89
;   INT8U fs;//片选号
;   INT16U value;
;   channel=1;
	clra
	sta 5,X
	lda #1
	sta 6,X
	.dbline 90
;   if((channel>0)&&(channel<9))
	lda 5,X
	bne X9
	lda 6,X
	beq L25
X9:
	lda 6,X
	sta *__r1
	lda 5,X
	sta *__r0
	ldhx *__r0
	cphx #9
	tsx
	bhs L25
	.dbline 91
;      fs=0;
	clr 2,X
	bra L26
L25:
	.dbline 93
;   else
;      fs=1; 
	lda #1
	sta 2,X
L26:
	.dbline 95
;   //整合要发送的16位数据-(value的高4位为通道号,后12位为数据位)  
;   value=((channel-fs*8-1)<<12)|buf;
	clr *__r0
	lda 2,X
	sta *__r1
	lsl *__r1
	rol *__r0
	lsl *__r1
	rol *__r0
	lsl *__r1
	rol *__r0
	lda 6,X
	sub *__r1
	sta *__r1
	lda 5,X
	sbc *__r0
	sta *__r0
	lda *__r1
	sub #1
	sta *__r1
	lda *__r0
	sbc #0
	sta *__r0
	lda #12
X10:
	lsl *__r1
	rol *__r0
	dbnza X10
	lda *__r1
	ora 8,X
	sta 1,X
	lda *__r0
	ora 7,X
	sta ,X
	.dbline 97
;   //发送16位数据
;   CS_D |=0b00001100;  //定义PTC2~3为输出
	lda 0x6
	ora #12
	sta 0x6
	.dbline 98
;   CS_P |=0b00001100;  //PTC2~3输出为高电平
	lda 0x2
	ora #12
	sta 0x2
	.dbline 101
;   	
;   //TLV5608.FS=1    
;   CS_P &= ~(1<<(fs+2));   //相应片TLV.FS由高电平变为低电平,产生下降沿
	lda 2,X
	add #2
	mov #1,*__r2
	and #7
	beq X12
X11:
	lsl *__r2
	dbnza X11
X12:
	mov *__r2,*__r0
	com *__r0
	lda 0x2
	and *__r0
	sta 0x2
	.dbline 103
;                       //此后在每个SCLK的下降沿传送一位数据  
;   Delay();           //延时20个时钟周期                       
	jsr _Delay
	tsx
	.dbline 104
;   SPIDR=value>>8;       //发送高8位数据 
	lda ,X
	sta 0x12
L27:
	.dbline 105
L28:
	.dbline 105
;   while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
	brclr #3,0x11,L27
	.dbline 107
;                                              //发送完毕 
;   SPIDR=value;         //发送低8位数据
	lda 1,X
	sta 0x12
L30:
	.dbline 108
L31:
	.dbline 108
;   while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
	brclr #3,0x11,L30
	.dbline 110
;                                              //发送完毕
;   asm("nop");
	nop
	.dbline 111
;   CS_P |= (1<<(fs+2));   //数据传输完毕,相应片TLV.FS由低电平变为高电平              
	lda 2,X
	add #2
	mov #1,*__r2
	and #7
	beq X14
X13:
	lsl *__r2
	dbnza X13
X14:
	lda 0x2
	ora *__r2
	sta 0x2
	.dbline -2
L24:
	ais #3
	.dbline 0 ; func end
	rts
	.dbsym l value 0 s
	.dbsym l fs 2 c
	.dbsym l buf 7 s
	.dbsym l channel 5 s
	.dbend

⌨️ 快捷键说明

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